在Crypto ++中输入autoseed PNRG的输出字符串

时间:2011-10-30 23:16:29

标签: 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;

我在代码中添加了一个新的var:string str = ""。 然后在for append中为每个结果添加字符串的一部分。 但我的输出很脏!我只看到奇怪的ASCII字符。 我该如何设置好字符串?

谢谢。

3 个答案:

答案 0 :(得分:1)

您需要一些输出编码,例如

  • 的base64
  • hex

因为你看到的是原始二进制数据,解释为它是文本。随机字符是结果

AFAICT(谷歌)你应该可以使用这样的东西

#include <base64.h>

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

答案 1 :(得分:1)

将任意字节(字符串)附加到字符串的末尾将导致包含一些不可打印的字符:

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();

答案 2 :(得分:0)

您还可以使用HexEncoder内置的Crypto ++:

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&#39;拥有&#39; HexEncoder,因此无需拨打delete