3

データ文字列を pyCrypto で簡単に暗号化しましたが、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)
4

2 に答える 2

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パラメータ toは、CryptoPP::StringSource「入力全体を消費する」ことを意味します

(明らかに) 暗号化に使用した IV を知るには、C++ デクリプタが必要であることに注意してください。Python でランダムな IV を生成するため、一般的な手法は IV を暗号化されたテキストの先頭に追加することです。

于 2011-01-04T14:02:16.267 に答える
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
于 2011-01-04T13:23:20.490 に答える