问题描述
我对多个文件用相同的key和相同的iv做加密,所以用相同的key和相同的iv做解密。
我用了AES加密,按照规范操作了代码,但是解密出来总是前面有一部分不一致,但是后面的是一样的。如图:
文件原本内容
解密内容:
btw,crypto库的aes,同一个对象不能既做加密又做解密的。
问题代码
我加密&解密的是二进制文件。因为是用相同的key和iv解码,我觉得用一个crypto对象就可以了。于是代码写成了这样:
大致的意思就是for循环遍历所有文件,用相同对象去decrypt。
cryptos = AES.new(KEY, CYPHER_MODE, IV)
for name in model_names:
with open(from_path+name,'rb') as source:
# cryptos = AES.new(KEY, CYPHER_MODE, IV)
plain_text = cryptos.decrypt(a2b_hex(source.read()))
with open(to_path+name,'wb') as target:
target.write(plain_text.rstrip(b'\0'))
问题原因&正确写法
上述代码的问题在于,我用了同一个cryptos对象去decrypt多个文件。导致了解密错误。
不可以用一个cipher去decrypt多个密文,否则会出错。应该每个file对应一个新的cipher。(目前我是通过这种方法解决了这个现象。)
#crypto不应该在这里给所有文件解密,而是在for里面,每个file使用唯一一个crypto
for name in encrypted_model_names:
with open(from_path+name,'rb') as source:
#这里新声明
cryptos = AES.new(KEY, CYPHER_MODE, IV)
plain_text = cryptos.decrypt(a2b_hex(source.read()))
with open(to_path+name,'wb') as target:
target.write(plain_text.rstrip(b'\0'))