【发布时间】: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。