使用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)开始。
我的服务器在 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)开始。