gpt4 book ai didi

c++ - 生成的加密字符串在 PyCrypto 和 Crypto++ 中的大小不同

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:57:40 25 4
gpt4 key购买 nike

我最近使用了一个 Python 脚本来加密一个字符串。但无法使用 Crypto++ 在 C++ 中解密它。我只是比较了生成的加密字符串,发现它们并不相同。有人可以帮忙吗?

这是我的 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;

最佳答案

默认情况下,Crypto++ 对明文字符串使用 PKCS5 填充。这将填充添加到字符串的末尾,以确保字符串是 block 大小的倍数,对于 AES, block 大小为 16 字节。如果明文已经是 16 的倍数,Crypto++ 会向明文添加另外 16 个字节的填充,然后对整个内容进行加密。 PyCrypto 不添加这个额外的填充,将其留给用户以确保正确的 block 大小。请注意,当您解密 Crypto++ 加密的密文时,额外的填充会自动删除。

关于c++ - 生成的加密字符串在 PyCrypto 和 Crypto++ 中的大小不同,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4632992/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com