Поместите в строку вывод автоматического заполнения PNRG в 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. Как я могу правильно установить строку?

Спасибо.


person Community    schedule 30.10.2011    source источник


Ответы (3)


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

  • base64
  • шестигранник

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

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

#include <base64.h>

string base64encoded; 
StringSource(str, true, new Base64Encoder(new StringSink(base64encoded)));
person sehe    schedule 30.10.2011

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

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

Вы не упоминаете, чего хотели или ожидали. Вы хотели, чтобы строка совпадала с той, что была отправлена ​​на std::cout? Если это так, вы можете использовать строковый поток через #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();
person HostileFork says dont trust SE    schedule 30.10.2011

Вы также можете использовать 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.

person jww    schedule 17.04.2014