2010-09-16 3 views
1

Не могу понять, почему я получаю кажущийся случайным вывод из декодера Crypto ++ RC2. Вход всегда один и тот же, но выход всегда отличается.Получение случайного вывода из Crypto ++

const char * cipher  ("o4hk9p+a3+XlPg3qzrsq5PGhhYsn+7oP9R4j9Yh7hp08iMnNwZQnAUrZj6DWr37A4T+lEBDMo8wFlxliuZvrZ9tOXeaTR8/lUO6fXm6NQpa5P5aQmQLAsmu+eI4gaREvZWdS0LmFxn8+zkbgN/zN23x/sYqIzcHU"); 
int   keylen  (64); 

unsigned char keyText[] = { 0x1a, 0x1d, 0xc9, 0x1c, 0x90, 0x73, 0x25, 0xc6, 0x92, 0x71, 0xdd, 0xf0, 0xc9, 0x44, 0xbc, 0x72, 0x00 }; 
std::string key((char*)keyText); 

std::string data; 
CryptoPP::RC2Decryption rc2(reinterpret_cast<const byte *>(key.c_str()), keylen); 
CryptoPP::ECB_Mode_ExternalCipher::Decryption rc2Ecb(rc2); 
CryptoPP::StringSource 
    (cipher 
    , true 
    , new CryptoPP::Base64Decoder 
     (new CryptoPP::StreamTransformationFilter 
      (rc2Ecb 
      , new CryptoPP::StringSink(data) 
      , CryptoPP::BlockPaddingSchemeDef::NO_PADDING 
      ) 
     ) 
    ); 

std::cout << data << '\n'; 
+0

Пожалуйста, сделайте полный пример: нет ничего явно неправильного в том, что вы показываете нам, поэтому я полагаю, что проблема заключается в том, что вы * не * показываете нам (то есть, где ключ, ключ и шифр исходят из ?) –

+0

Это просто константы, определенные непосредственно выше, и они правильно расшифровываются на Java с помощью RC2/ECB/NOPADDING. –

+0

А, я вижу, вы сами это поняли. Как вы видите, константа может быть важной: не было очевидно, была ли keylen длиной «ключа» или (как это было) эффективной длины ключа. –

ответ

0

Параметры для RC2 :: дешифрование конструктор являются: (указатель ключевых байтов, длина ключа-байт). Вы даете ему указатель на 16 байт, но с длиной 64 байта. Crypto ++ читает неинициализированную память при чтении ключа, поэтому вы получаете случайные результаты.

Если вы хотите, чтобы указать эффективный ключ длины, вы можете использовать другой конструктор, как это:

CryptoPP::RC2Decryption rc2(keyText, 16, keylen); 

Обратите внимание, что вы должны не использовать в зЬй :: строку для хранения ключа. Полноценно для ключа содержать 0x00-байтов, а std :: string не предназначена для их хранения.

+0

Вы ошибаетесь. std :: string предназначена для хранения любого элемента типа char, включая '\ 0'. См. Bjarne Stroustrup «Язык программирования C++», 4-е изд., P1041 (p583 в 3-м издании). – user515430

0

RC2Decryption должны были определены как:

CryptoPP::RC2Decryption rc2(reinterpret_cast<const byte *>(key.c_str()), key.size(), keylen); 
Смежные вопросы