4

最近、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;
4

1 に答える 1

4

デフォルトでは、Crypto++ はプレーンテキスト文字列に PKCS5 パディングを採用しています。これにより、文字列の末尾にパディングが追加され、文字列がブロック サイズ (AES の場合は 16 バイト) の倍数になるようになります。平文がすでに 16 の倍数である場合、Crypto++ はさらに 16 バイトのパディングを平文に追加してから、全体を暗号化します。PyCrypto はこの余分なパディングを追加せず、ユーザーが正しいブロック サイズを確保できるようにします。Crypto++ で暗号化された暗号文を復号化すると、余分なパディングが自動的に削除されることに注意してください。

于 2011-01-28T02:33:45.470 に答える