我刚刚使用pyCrypto轻松加密数据字符串,但不知道如何在crypto ++中解密它。任何人都可以使用crypto ++帮助使用C ++中的示例解密代码? 这是我的python代码:
key = '0123456789abcdef'
data = "aaaaaaaaaaaaaaaa"
iv = ''.join(chr(random.randint(0, 0xFF)) for i in range(16))
encryptor = AES.new(key, AES.MODE_CBC, iv)
enc = encryptor.encrypt(data)
答案 0 :(得分:2)
与@Jon相同的方法,有点简化
std::string ciphertext = "..."; // what Python encryption produces
std::string decryptedtext;
byte key[ CryptoPP::AES::DEFAULT_KEYLENGTH ], iv[ CryptoPP::AES::BLOCKSIZE ];
// populate key and iv with the correct values
CryptoPP::CBC_Mode< CryptoPP::AES >::Decryption decryptor;
decryptor.SetKeyWithIV(key, sizeof(key), iv);
CryptoPP::StringSource(ciphertext, true,
new CryptoPP::StreamTransformationFilter( decryptor,
new CryptoPP::StringSink( decryptedtext )
)
);
true
CryptoPP::StringSource
参数意味着“消耗整个输入”
请注意(显然)您需要使用C ++解密器来了解用于加密的IV。由于您在python中生成随机IV,因此流行的技术是将IV添加到加密文本中。
答案 1 :(得分:1)
这段代码来自2005年的一个例子,但它应该给你一个很好的起点:
std::string ciphertext = "..."; // what Python encryption produces
std::string decryptedtext;
byte key[ CryptoPP::AES::DEFAULT_KEYLENGTH ], iv[ CryptoPP::AES::BLOCKSIZE ];
// populate key and iv with the correct values
CryptoPP::AES::Decryption aesDecryption(key, CryptoPP::AES::DEFAULT_KEYLENGTH);
CryptoPP::CBC_Mode_ExternalCipher::Decryption cbcDecryption( aesDecryption, iv );
CryptoPP::StreamTransformationFilter stfDecryptor(cbcDecryption, new CryptoPP::StringSink( decryptedtext ) );
stfDecryptor.Put( reinterpret_cast<const unsigned char*>( ciphertext.c_str() ), ciphertext.size() );
stfDecryptor.MessageEnd();
// it's all in decryptedText now