DES.MODE_OFB无法恢复明文

时间:2015-04-17 09:33:17

标签: python encryption des pycrypto

考虑以下两个代码(基于http://pythonhosted.org//pycrypto/):

1)DES.MODE_ECB

from Crypto.Cipher import DES    
from Crypto import Random    
key = b'Eight888'    
cipher = DES.new(key, DES.MODE_ECB)    
plaintext = b'sona si latine loqueris '    
msg = cipher.encrypt(plaintext)    
msgback= cipher.decrypt(msg)

2)DES.MODE_OFB

from Crypto.Cipher import DES
from Crypto import Random
key = b'Eight888'
iv = Random.new().read(DES.block_size)
cipher = DES.new(key, DES.MODE_OFB, iv)
plaintext = b'sona si latine loqueris '
msg = iv + cipher.encrypt(plaintext)
msgback= cipher.decrypt(msg)

为什么代码1)恢复原始明文而2)没有?

1 个答案:

答案 0 :(得分:2)

你必须在解密之前切掉IV,因为它不是密文的一部分。

decCipher = DES.new(key, DES.MODE_OFB, msg[:DES.block_size])
msgback = decCipher.decrypt(msg[DES.block_size:])

与使用IV解密的CBC恢复至少一部分明文不同,OFB是流模式。如果实际密文与生成的流(基于IV和密钥)之间的对齐不完美,则原始明文无法恢复。