这只会让我发疯。
这就是发生的事情:
在python shell中:
>>> from Crypto.Cipher import ARC4
>>> a = ARC4.new('0123456789123456')
>>> b = ARC4.new('0123456789123456')
>>> de = b.decrypt
>>> en = a.encrypt
>>> en('abcd')
'\x18\x07\x8a\xdc'
>>> en('abcd')
'\x89>\xa0T'
>>> en('abcd')
'y\xe1-\xfe'
>>> en('abcd')
'\xc7\xf6\x19\xfc'
>>>
我使用相同的密钥加密abcd
4次。四次我都有不同的加密字符串。
当我做了以下事情时(也许我会在解密所有上述不同的加密消息时获得相同的解密消息)。
>>> al = []
>>> for i in range(10):
al.append(en('abcd'))
>>> al
['\x81\x05h\x06', '\x11;\x88\xc7', '\xb6\xb9g\x10', '\x1e$\x8c\xca', '\xbdh\xc2\xf0', 'ruiO', '7\xec\x7f\xdf', '\x08\xf3\x90\x8a', '\x1c\x95\xf3(', '\xbd@-\x11']
>>> gl = []
>>> for i in range(10):
gl.append(de(al[i]))
>>> gl
['\xc8\x0f6\xb7', '\x18y`A', 'tm\x12\t', '\x9c\xf65M', '\xd6\xe8\x02\xa3', 'M\xa5sc', '\x1b\x82|\x08', '\x87\xbd \xd7', '\xd3:f\xd7', '\x05\x81?\xc5']
>>>
所以我甚至没有得到原始消息abcd
..!
为什么会这样?
我如何克服这个?
请帮我解决这个问题。
我在Linux Mint机器上使用pyCrypto库。
答案 0 :(得分:6)
ACR4是流密码。它不会以您认为的方式加密。试试这个:
en("abcd" * 16)
看看会发生什么。结果将不是相同字节的16倍,但与您在问题中尝试的类似。
如果要加密到相同的字节,则必须使用ACR4的新实例:
e1 = ACR4.new('0123456789123456').encrypt
e2 = ACR4.new('0123456789123456').encrypt
assert e1("abcd") == e2("abcd")
答案 1 :(得分:3)
RC4是一个流密码,因此某些明文的加密形式取决于密码已加密的内容。
>>> encrypted = [en('abcd') for i in range(4)]
>>> encrypted
['(h=\xd5', 'h \x8b\xe2', '\xa3\xb6\x16}', '\xe3\xb0\xda\xe3']
>>> decrypted = [de(x) for x in encrypted]
>>> decrypted
['abcd', 'abcd', 'abcd', 'abcd']
在进行加密/解密之前创建新的RC4对象,您将获得预期的结果:
>>> a = ARC4.new('0123456789123456')
>>> b = ARC4.new('0123456789123456')
>>> de = b.decrypt
>>> en = a.encrypt
>>> al = []
>>> for i in range(10):
... al.append(en('abcd'))
...
>>> gl = []
>>> for i in range(10):
... gl.append(de(al[i]))
...
>>> gl
['abcd', 'abcd', 'abcd', 'abcd', 'abcd', 'abcd', 'abcd', 'abcd', 'abcd', 'abcd']