【问题标题】:Decrypt cipher text encrypted with PyCrypto using cryptopp使用 cryptopp 解密使用 PyCrypto 加密的密文
【发布时间】:2016-06-23 15:54:08
【问题描述】:

我的服务器在 CTR 模式下使用 pycrypto 和 AES 加密文件。我的计数器是这样一个简单的计数器:

\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01
\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02
\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x03

我想在我的客户中使用 c++ 的 cryptopp 库解密密文。我该怎么做?

Python 代码:

encryptor = AES.new(
    CRYPTOGRAPHY_KEY,
    AES.MODE_CTR,
    counter=Counter.new(128),
)
cipher = encryptor.encrypt(plain_text)

目前为止的 C++ 代码:

byte ctr[] = "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01"
mDecryptor = new CryptoPP::CTR_Mode<CryptoPP::AES>::Decryption(key, 32, ctr);
std::string plain;
CryptoPP::StringSource(std::string(data, len), true, new CryptoPP::StreamTransformationFilter(*mDecryptor, new CryptoPP::StringSink(plain)));

但是在运行这个plain 之后是垃圾。

更新:

您可以尝试使用crypto++解密的示例加密数据,这样即使您不了解python并且您只是对crypto++有经验,也可以帮助我:

尝试解密这个base64编码的文本:

2t0lLuSBY7NkfK5I4kML0qjcZl3xHcEQBPbDo4TbvQaXuUT8W7lNbRCl8hfSGJA00wgUXhAjQApcuTCZckb9e6EVOwsa+eLY78jo2CqYWzhGez9zn0D2LMKNmZQi88WuTFVw9r1GSKIHstoDWvn54zISmr/1JgjC++mv2yRvatcvs8GhcsZVZT8dueaNK6tXLd1fQumhXCjpMyFjOlPWVTBPjlnsC5Uh98V/YiIa898SF4dwfjtDrG/fQZYmWUzJ8k2AslYLKGs=

用这个键:

12341234123412341234123412341234

具有本文开头描述的使用crypto++的计数器功能。如果您成功发布解密文本(仅包含数字)和您的解决方案。

更新 2: 我没有在 python 代码中提供 IV,python 模块忽略了 IV。我的 IV 是导致问题的原因。

【问题讨论】:

  • 我明白了,所以 CTR 中没有初始向量,或者更好地说它在 CTR 中被计数器/随机数取代。 (我假设这里的斜线表示它们都是 CTR 的情况),对吧?
  • 如果是,那么我不知道为什么 C++ 代码不解密密文。
  • 另外我已经阅读了您引用的维基百科文章至少 5 次,“如果 IV/nonce 是随机的,那么它们可以使用任何无损操作(连接、加法、或 XOR) 来生成实际唯一的计数器块”它假设 IV/nonce 是相同的,并且它们可以与计数器结合使用,这就是为什么我得出结论 C++ 库确实使用(组合)IV/nonce 而 python 库没有.
  • 我需要随机访问其他部分不可用但我有内容偏移量的文件部分(所以我有计数器)
  • 随机访问可以通过其他方式获得。使用 ECB(不推荐),只需要块边界上的键和数据。在 CBC 模式下,前一个加密数据块是 iv。

标签: python pycrypto crypto++


【解决方案1】:

当我阅读他们的源代码时,我可以说 PyCrypto 和 Crypto++ 都是 Python 和 C++ 密码学的完美库。问题是我在加密数据前面加上了一些关于文件的元信息,我完全忘记了这一点,在客户端 Crypto++ 中处理这些元数据后解密了我的文件。

由于我没有在任何地方(甚至在 Wikipedia 中都没有)找到明确的记录,所以我在这里写了它: Nonce、IV 和 Counter 的任何组合(如连接、xor 或 likes)都适用于 CTR 模式,但大多数库实现的标准是按顺序连接这些值。所以分组密码算法中使用的值通常是:Nonce + IV + Counter。并且计数器通常从 1(而不是 0)开始。

【讨论】:

  • “Nonce”只是“IV”的另一个名称,所以“Nonce + IV + Counter”没有多大意义。请注意,当使用相同的密钥时,每个加密的随机数必须不同。否则,你就是在给攻击者一个多次打击。随机数的常见大小是 96 位,剩余的 32 位将用于计数器。
  • 正如您在这个 ietf 文档中看到的那样:tools.ietf.org/html/rfc3686#page-9 “nonce”和“iv”有不同的字段,在 pycrypto 和 cryptopp 的源中有 2 个变量用于存储 nonce 和 iv 所以基于以上 3 个参考以完全相同的方式处理 nonce、iv 和 counter(pycrypto 和 cryptopp 都在运行上述 rfc3686 测试的源代码中嵌入了测试)我认为“Nonce”不仅仅是“IV”的另一个名称。据我所知,不同的密码学家对这些术语有不同的假设。
  • 也许 IPSec 人员需要为这两个部分使用不同的名称,但这不是常见加密库中的区别。它们在实现时考虑了一个单一的 IV/nonce,然后它们是同义的。
  • 我明白了。感谢您的信息。
猜你喜欢
  • 1970-01-01
  • 2012-04-16
  • 1970-01-01
  • 2014-01-18
  • 1970-01-01
  • 1970-01-01
  • 2013-08-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多