很多年前,我在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)
你可以使用integers和hex在int()
和hex()
之间来回转换hex。但是,hex()
方法仅适用于整数。所以首先你需要使用base = 16转换为整数。
hex_int = int(hex_str, 16)
cipher = hex_int - 15
hex_cipher = hex(cipher)
现在将其应用于循环中,您可以根据需要向左或向右移动结果。当然,你也可以压缩代码。
result = hex(int(hex_string, 16) - 15)
#in a loop
hexes = ['70', '71', 'c280']
ciphered = []
for n in hexes:
ciphered.append(hex(int(n, 16) - 15))
您可以使用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")
的字符串
编辑:更新,现在可以使用了。