许多年前,我在Windows上用C#编写了一个程序,该程序使用caeser chipher(我原本以为是)“加密”文本文件.
那时,我想要的字符不仅是A-Z,0-9,而且使之成为可能,但从未考虑过背后的实际理论.
查看一些文件,并将其与this website进行比较,看来UTF-8正在转移.
我启动了Windows VM(因为现在正在使用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
还是有任何更容易/更好的方法来做到这一点?
更新
我正在使用Python 3.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)