很多年前,我在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#源代码。我可以尝试找到它
答案 0 :(得分:2)
假设您输入的是ASCII文本,最简单的解决方案是将ASCII编码/解码并使用内置方法ord()
和chr()
从字符转换为字节值,反之亦然。 / p>
请注意,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)
答案 1 :(得分:1)
您可以使用proxy
和int()
在integers和hex之间来回转换十六进制。但是,hex()
方法仅适用于整数。因此,首先您需要使用base = 16转换为整数。
hex()
现在将其循环应用,您可以根据需要向左或向右移动结果。当然,您也可以压缩代码。
hex_int = int(hex_str, 16)
cipher = hex_int - 15
hex_cipher = hex(cipher)
答案 2 :(得分:0)
您可以使用int('somestring'.encode('utf-8').hex(),16)
来获取该网站上的确切值。如果要对每个字符应用相同的规则,则可以在字符列表中进行操作。您可以使用
import codecs
def myencode(character,diff):
temp=int(character.encode('utf-8').hex(),16)
temp+=diff
if(temp>0x7a):
temp-=0x7a
elif(temp<=0):
temp+=0x7a
result=codecs.decode(hex(temp)[2:],"hex").decode("utf-8")
return result
diff
应该是密码的移位(可以是整数)。 encode('utf-8')
将字符串转换为字节数组,而.hex()
将字节显示为十六进制。您一次只应向该函数提供一个字符串的一个字符,这样移位所有内容都不会出现问题。
完成编码后,您需要将其解码为新字符,您可以使用库codecs
将其从整数转换为byte
(char
),然后用decode("utf-8")
编辑:已更新,现在可以使用。