Python XOR加密算法不适用于>;54查尔

Python XOR加密算法不适用于>;54查尔,python,string,encryption,random,Python,String,Encryption,Random,在玩了欧拉项目之后,我最近开始研究密码学,我制作了一个基本的XOR加密系统。在这种情况下,输出的浓缩和随机密钥被生成并保存到文本文件中(仅作为测试,我将在修复此错误后使其更好),但我注意到某些消息没有正确加密或解密。我已将此范围缩小到长度>54的消息。我的代码如下: #encrypt.py import random msg = raw_input("Enter your message: ") out = "" key = "" for i in xrange(len(msg)):

在玩了欧拉项目之后,我最近开始研究密码学,我制作了一个基本的XOR加密系统。在这种情况下,输出的浓缩和随机密钥被生成并保存到文本文件中(仅作为测试,我将在修复此错误后使其更好),但我注意到某些消息没有正确加密或解密。我已将此范围缩小到长度>54的消息。我的代码如下:

#encrypt.py

import random

msg = raw_input("Enter your message: ")
out = ""
key = ""

for i in xrange(len(msg)):
    key += chr(random.randint(0,255))

k = 0

for char in msg:
    out += chr(ord(msg[k]) ^ ord(key[k]))
    k += 1

print "\nYour output is:", out
print "Your key is:", key

raw_input()

with open("output.txt","r+") as f:
    f.truncate()
    f.write(out+key)
和解密:

#decrypt.py

import sys

if not len(sys.argv) > 1: exit()

with open(sys.argv[1],"r+") as f:
    content = f.read()

msg, key = content[:len(content)/2], content[len(content)/2:]

out = ""

k = 0

for char in msg:
    out += chr(ord(char) ^ ord(key[k]))
    k += 1

print out
raw_input()

对于较长的消息(超过54个字符),解密后将给出一个随机字符字符串。有人知道为什么会发生这种情况吗?

由于使用随机位生成字符可能会产生屏幕上看起来很难看的字符,因此可以在打印输出之前尝试对输出进行十六进制编码

#encrypt.py
随机输入
msg=原始输入(“输入您的消息:”)
out=“”
key=“”
对于x范围内的i(len(msg)):
key+=chr(random.randint(0255))
k=0
对于msg中的字符:
out+=chr(ord(消息[k])^ord(键[k]))
k+=1
out=“:”.join({:02x}).c-in-out的格式(ord(c))
key=“:”.join({:02x}).key中c的格式(ord(c))
打印“\n输出为:”,输出
打印“您的密钥是:”,密钥
原始输入()
打开(“output.txt”、“w+”)作为f:
f、 截断()
f、 写入(输出+键)
然后对于解密,您必须先删除冒号和十六进制解码,然后才能继续进行常规解密

#decrypt.py
导入系统
如果不是len(sys.argv)>1:exit()
将open(sys.argv[1],“r+”)作为f:
content=f.read()
content=content.replace(':','')
msg,key=content[:len(content)/2],content[len(content)/2:]
msg=msg.decode('hex')
key=key.decode('hex'))
out=“”
k=0
对于msg中的字符:
out+=chr(ord(char)^ord(key[k]))
k+=1
打印出来
原始输入()
在控制台上,结果如下所示:

$python encrypt.py
输入您的消息:Onetworfourfivesixeveneightneeleventwelvethirteen
您的输出是:7f:09:d0:8c:2e:1a:e0:a0:84:e7:bf:3b:e8:cc:f3:4e:35:e4:4f:20:c8:00:72:9d:f0:bc:de:54:88:30:a6:3d:93:3f:c1:6d:46:4a:68:ca:96:2e:16:50:43:0f:30:fa:27:f3:f2:8d:35:4b:6a:11:cc:02:04
你的钥匙是:10:67:b5:f8:59:75:94:c8:f6:82:da:5d:87:b9:81:28:5c:92:2a:53:a1:78:01:f8:86:d9:b0:31:e1:57:ce:49:fd:56:af:08:32:2f:06:af:fa:4b:60:35:2d:7b:47:9f:4b:85:97:f9:5d:22:18:65:a9:67:6a
$cat output.txt
例如:来源:来源:来源:来源:来源:来源:来源:来源:来源:来源:来源:来源:来源:来源:来源:来源:来源:来源:来源:来源:来源:来源:来源:来源:来源:来源:来源:来源:来源:来源:来源:来源:来源:来源:来源:来源:来源:来源:来源:来源:来源:来源:来源:来源:来源:来源:来源:来源:来源:来源:来源:来源:来源:来源:来源:来源:来源:来源:来源:来源:来源:来源:来源:来源:来源:来源:来源:来源:来源:来源:来源:来源:来源:来源:来源:来源:来源:来源:来源:来源:来源:来源:来源:来源:来源:来源:来源:来源:来源:来源:来源:来源:来源:来源:来源:来源:来源:来源:来源:来源:来源:来源:来源:来源:来源:来源:来源:来源:来源:来源:来源:来源:来源:来源:来源:来源:来源:来源:来源:来源01:f8:86:d9:b0:31:e1:57:ce:49:fd:56:af:08:32:2f:06:af:fa:4b:60:35:2d:7b:47:9f:4b:85:97:f9:5d:22:18:65:a9:67:6a
$python decrypt.py output.txt
一、二、三、四、五、六、七、九、十一、十三

对于范围(255)内的x:print chr(x)
打印的大部分字符都是不好的字符这似乎并没有特别的错误,但您的for循环不同,并且(对我来说)在加密和解密程序中有点奇怪。此外,如果错误发生在54个字符处,请在您使用的代码、库和工具中查找数字54和108。例如,如果您的文本编辑器自动将文本包装为108个字符,您将添加一些控制字符,并在54个字符后获得乱码输出。这是有效的,因为我很确定问题是由我不想要的退格字符引起的。