Как расшифровать строковые данные в C ++ с помощью Crypto ++, где исходная строка зашифрована в Python с помощью pyCrypto - PullRequest
3 голосов
/ 04 января 2011

Я просто зашифровал строку данных с помощью pyCrypto, но не знаю, как расшифровать ее в crypto ++. Кто-нибудь может помочь с примером кода расшифровки в C ++ с crypto ++? Вот мой код 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)

Ответы [ 2 ]

2 голосов
/ 04 января 2011

тот же подход, что и у @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, который вы использовали для шифрования. Поскольку вы генерируете случайный IV в Python, популярный метод заключается в добавлении IV к зашифрованному тексту.

1 голос
/ 04 января 2011

Этот код взят из примера 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
...