Поместить в строку вывод автозапуска PNRG в Crypto

#c #prng #crypto

#c #prng #crypto

Вопрос:

Я использую Cryptopp для генерации случайной строки. Это код:

 const unsigned int BLOCKSIZE = 16 * 8;
byte pcbScratch[ BLOCKSIZE ];

// Construction
//   Using a ANSI approved Cipher
CryptoPP::AutoSeededX917RNG<CryptoPP::DES_EDE3> rng;

rng.GenerateBlock( pcbScratch, BLOCKSIZE );

// Output
std::cout << "The generated random block is:" << std::endl;
string str = "";

for( unsigned int i = 0; i < BLOCKSIZE; i   )
{
    std::cout << "0x" << std::setbase(16) << std::setw(2) << std::setfill('0');
    std::cout << static_cast<unsigned int>( pcbScratch[ i ] ) << " ";
    str  = pcbScratch[i];
}
std::cout << std::endl;
std::cout << str <<std::endl;
 

Я ввел в код новую переменную: string str = "" .
Затем в for добавьте для каждого результата часть строки.
Но мой вывод грязный! Я вижу только странный символ ASCII.
Как я могу правильно настроить строку?

Спасибо.

Ответ №1:

Вам понадобится некоторая кодировка вывода, например

  • base64
  • шестнадцатеричный

потому что то, что вы видите, — это необработанные двоичные данные, интерпретируемые так, как если бы это был текст. Случайные символы являются следствием

AFAICT (google) вы должны иметь возможность использовать что-то вроде этого

 #include <base64.h>

string base64encoded; 
StringSource(str, true, new Base64Encoder(new StringSink(base64encoded)));
 

Ответ №2:

Добавление произвольных байтов (символов) в конец строки приведет к тому, что она будет содержать некоторые непечатаемые символы:

http://en.wikipedia.org/wiki/Control_character

Вы не упоминаете, чего вы хотели или ожидали. Вы хотели, чтобы строка была такой же, как та, что была отправлена в std::cout ? Если это так, вы можете использовать stringstream через #include <sstream> :

 std::stringstream ss;
for( unsigned int i = 0; i < BLOCKSIZE; i   )
{
    ss << "0x" << std::setbase(16) << std::setw(2) << std::setfill('0');
    ss << static_cast<unsigned int>(pcbScratch[i]);
}
str = ss.str();
 

Ответ №3:

Вы также можете использовать встроенные в Crypto HexEncoder :

 std::cout << "The generated random block is:" << std::endl;
string str = "0x";

StringSource ss(pcbScratch, BLOCKSIZE, true,
    new HexEncoder(
        new StringSink(str),
        true,   // uppercase
        2,      // grouping
        " 0x"   // separator
    ) // HexDecoder
); // StringSource
 

StringSource «Владеет» HexEncoder , поэтому нет необходимости вызывать delete .