首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用3DES和CBC损坏我的加密数据的前8个字节

使用3DES和CBC损坏我的加密数据的前8个字节
EN

Stack Overflow用户
提问于 2013-05-03 07:37:06
回答 1查看 2K关注 0票数 5

我在一个应用程序中使用PyCrypto来加密数据,但由于某些原因,无论我做什么,前8个字节(对应于第一个块)都会损坏。

代码语言:javascript
复制
>>> from Crypto.Cipher import DES3
>>> from Crypto import Random
>>> iv = Random.new().read(DES3.block_size)
>>> key = Random.new().read(DES3.key_size[-1])
>>> des3 = DES3.new(key, DES3.MODE_CBC, iv)
>>> des3.decrypt(des3.encrypt('12345678abcdefgh12345678'))
't\x1b\x0f\xcbD\x15M\xababcdefgh12345678'

我读到这是IV被破坏的迹象,但那些消息来源也说,使用CBC以外的模式将导致整个消息被破坏。事实并非如此:

代码语言:javascript
复制
>>> des3 = DES3.new(key, DES3.MODE_CFB, iv)
>>> des3.decrypt(des3.encrypt('12345678abcdefgh12345678'))
'\xe1\x85\xae,\xf1m\x83\x9cabcdefgh12345678'

我也可以排除密码是原因:

代码语言:javascript
复制
>>> from Crypto.Cipher import AES
>>> from Crypto import Random
>>> iv = Random.new().read(AES.block_size)
>>> key = Random.new().read(AES.key_size[-1])
>>> aes = AES.new(key, AES.MODE_CBC, iv)
>>> aes.decrypt(aes.encrypt('12345678abcdefgh12345678abcdefgh'))
'\xa7l\x00]\x1cW\xec\xd0\x04\x06\xba&\x1663\xd712345678abcdefgh'

请注意,在此示例中,前16个字节已损坏,这与AES的块大小相对应。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-05-03 08:55:22

你必须在解密前重置静脉矢量。尝试以下代码:

代码语言:javascript
复制
>>> from Crypto.Cipher import DES3
>>> from Crypto import Random
>>> iv = Random.new().read(DES3.block_size)
>>> key = Random.new().read(DES3.key_size[-1])
>>> des3enc = DES3.new(key, DES3.MODE_CBC, iv)
>>> des3dec = DES3.new(key, DES3.MODE_CBC, iv)
>>> des3dec.decrypt(des3enc.encrypt('12345678abcdefgh12345678'))

在加密/解密每个块之后,IV向量正在改变。您使用了相同的DES3类实例来加密和解密消息,因此您使用了错误的IV进行解密。

希望上面的代码可以工作--我没有测试它。

更多关于CBC模式的信息:http://en.wikipedia.org/wiki/Block_cipher_mode_of_operation

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16349441

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档