我正在尝试从密码派生密钥并想随机生成盐(我不知道SHA-256的大小是多少,就像AES256中的IV(它应该是128位)一样,给人提示知道)与AutoSeededRandomPool,但异常已解决



我在QT 5.5.1和/ MD发行模式下使用crypto ++ 5.6.3rc5,这可能是错误或某人未完成的工作。

#include <QCoreApplication>
#include <sha.h>
#include <base64.h>
#include <iostream>
#include <string>
#include <pwdbased.h>
#include <cstdio>
#include <iostream>
#include <osrng.h>
using CryptoPP::AutoSeededRandomPool;

#include <iostream>
using std::cout;
using std::cerr;
using std::endl;

#include <string>
using std::string;

#include <cstdlib>
using std::exit;

#include <cryptlib.h>
using CryptoPP::Exception;

#include <hex.h>
using CryptoPP::HexEncoder;
using CryptoPP::HexDecoder;

#include <filters.h>
using CryptoPP::StringSink;

//#include <stdlib.h>
#include <time.h>

int main(int argc, char *argv[])
{

    QCoreApplication a(argc, argv);

    try
    {
        AutoSeededRandomPool rng;
        byte salt[16*8];
        rng.GenerateBlock(salt, 16*8);

        byte password[] ="password";
        size_t plen = strlen((const char*)password);

        size_t slen = strlen((const char*)salt);

        int c = 1;
        byte derived[32];

        CryptoPP::PKCS5_PBKDF2_HMAC<CryptoPP::SHA256> pbkdf2;
        pbkdf2.DeriveKey(derived, sizeof(derived), 0, password, plen, salt, slen, c);

        string result;
        HexEncoder encoder(new StringSink(result));

        encoder.Put(derived, sizeof(derived));
        encoder.MessageEnd();

        cout << "Derived: " << result << endl;
    }
    catch (const Exception& ex) {
        cerr << ex.what() << endl;
    }
    return a.exec();
}

最佳答案



您可以在Crash in RandomNumberGenerator::GenerateWord32 due to stack recursion上读取有关更改的历史记录。更改最终被撤消。

它已在RC6中修复,但尚未宣布。 Crypto++ 5.6.3 Files有一个准pre-RC6。但是,一旦宣布,它将一成不变,并且不会改变。

目前,由于Cygwin,MinGW和Debian Unstable上的C++ 11,RC6正在进行细微的更改。所做的更改还不错,但是对其进行测试很痛苦。有些脚本需要半天的时间才能在仿真平台(例如S / 390x)上运行。

如果您想避免该问题并避免下载RC6之前的版本,则可以使用以下生成器之一。他们称GenerateIntoBufferedTransformation为:

  • AutoSeededX917RNG< AES >
  • X917RNG
  • RandomPool

  • 或者,您可以使用 OS_GenerateRandomBlock 直接从操作系统池中进行绘制。

    或者,您可以删除引发的代码。打开cryptlib.h,找到RandomNumberGenerator,删除保护旧代码的#if 0/#endif并删除throw。

    另请参阅Crypto ++ Wiki上的RandomNumberGenerator

    09-27 08:52