很多年前,我在windows上用c编写了一个程序,它使用(我认为是)caeser芯片“加密”文本文件。
那时我想要更多的角色,而不仅仅是a-z,0-9,这使得它成为可能,但从未想过背后的实际理论。
查看一些文件,并将其与this website进行比较,似乎utf-8正在移动。
我启动了一个windows虚拟机(因为我现在正在使用linux),并键入以下内容:abcdefghijklmnopqrstuvwxyz
它生成了一个十六进制的文本(移动了15次):
70 71 72 73 74 75 76 77 78 79 7a 7b 7c 7d 7e 7f c280 c281 c282 c283 c284 c285 c286 c287 c288 c289
我怎么能把十六进制移成这样?
61 62 63 64 65 66 67 68 69 6a 6b 6c 6d 6e 6f 70 71 72 73 74 75 76 77 78 79 7a
或者有什么更简单/更好的方法可以做到这一点?
更新
我使用的是Python3.5.3,这是目前为止我拥有的代码:
import sys
arguments = sys.argv[1:]
file = ""
for arg in arguments:
if arg[0] != "-":
file = arg
lines = []
with open(file) as f:
lines = f.readlines()
for line in lines:
result = 0
for value in list(line):
#value = "0x"+value
temp=value.encode('utf-8').hex()
temp+=15
if(temp>0x7a):
temp-=0x7a
elif(temp<=0):
temp+=0x7a
#result = result + temp
print (result)
不幸的是,我暂时没有可用的C源代码。我可以试着找到它
最佳答案
假设您的输入是ascii文本,最简单的解决方案是将其编码/解码为ascii,并使用内置方法ord()
和chr()
将字符值转换为字节值,反之亦然。
请注意,temp
值不能小于0,因此可以删除第二个if语句。
注:这超出了问题的范围,但我也注意到你在分析自己的论点我强烈建议您改用argparse
,因为它非常简单,而且免费为您提供很多额外的功能(即,如果您使用“--help”选项启动应用程序,它会执行错误检查并打印一条很好的帮助消息)请参见下面的示例代码:
import argparse
parser = argparse.ArgumentParser()
parser.add_argument(dest='filenames', metavar='FILE', type=str, nargs='+',
help='file(s) to encrypt')
args = parser.parse_args()
for filename in args.filenames:
with open(filename, 'rt', encoding='ascii') as file:
lines = file.readlines()
for line in lines:
result = ""
for value in line:
temp = ord(value) # character to int value
temp += 15
if temp > 0x7a:
temp -= 0x7a
result += chr(temp) # int value to character
print(result)