生成的加密字符串在PyCrypto和Crypto++中大小不同
我最近用一个Python脚本对一个字符串进行了加密。但是在用C++和Crypto++解密的时候,发现解不出来。我对比了一下生成的加密字符串,发现它们并不相同。有没有人能帮帮我?
这是我的Python代码:
key = "0123456789abcdef"
data = "ccccccccccccccccdddddddddddddddd"
iv = "aaaaaaaaaaaaaaaa"
encryptor = AES.new(key, AES.MODE_CBC, iv)
enc = encryptor.encrypt(data)
print enc
这是我的C++代码:
std::string key = "0123456789abcdef";
std::string iv = "aaaaaaaaaaaaaaaa";
std::string plaintext = "ccccccccccccccccdddddddddddddddd";
std::string ciphertext;
std::string decryptedtext;
std::cout << "Plain Text (" << plaintext.size() << " bytes)" << std::endl;
std::cout << plaintext;
std::cout << std::endl << std::endl;
CryptoPP::AES::Encryption aesEncryption((byte *)key.c_str(), CryptoPP::AES::DEFAULT_KEYLENGTH);
CryptoPP::CBC_Mode_ExternalCipher::Encryption cbcEncryption( aesEncryption, (byte *)iv.c_str() );
CryptoPP::StreamTransformationFilter stfEncryptor(cbcEncryption, new CryptoPP::StringSink( ciphertext ) );
stfEncryptor.Put( reinterpret_cast<const unsigned char*>( plaintext.c_str() ), plaintext.length() + 1 );
stfEncryptor.MessageEnd();
std::cout << "Cipher Text (" << ciphertext.size() << " bytes)" << std::endl;
for( int i = 0; i < ciphertext.size(); i++ ) {
std::cout << "0x" << std::hex << (0xFF & static_cast<byte>(ciphertext[i])) << " ";
}
CryptoPP::AES::Decryption aesDecryption((byte *)key.c_str(), CryptoPP::AES::DEFAULT_KEYLENGTH);
CryptoPP::CBC_Mode_ExternalCipher::Decryption cbcDecryption( aesDecryption, (byte *)iv.c_str() );
CryptoPP::StreamTransformationFilter stfDecryptor(cbcDecryption, new CryptoPP::StringSink( decryptedtext ) );
stfDecryptor.Put( reinterpret_cast<const unsigned char*>( ciphertext.c_str() ), ciphertext.size() );
stfDecryptor.MessageEnd();
std::cout << "Decrypted Text: " << std::endl;
std::cout << decryptedtext;
std::cout << std::endl << std::endl;
1 个回答
4
默认情况下,Crypto++在明文字符串的末尾会加上一些填充。这是为了确保字符串的长度是块大小的整数倍,对于AES加密来说,这个块大小是16个字节。如果明文的长度已经是16的倍数,Crypto++会再额外加16个字节的填充,然后再进行加密。而PyCrypto则不加这个额外的填充,用户需要自己确保字符串的长度符合要求。需要注意的是,当你解密Crypto++加密后的密文时,这些额外的填充会被自动去掉。