#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
.