使用cryptopp解密用PyCrypto加密的密文

Decrypt cipher text encrypted with PyCrypto using cryptopp

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

\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

具有本文开头所述的计数器功能 post 使用 crypto++。如果你成功了,请 post 解密文本(仅包含数字)和你的解决方案。

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

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

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