error: ‘GlobalRNG’ was not declared in this scope

error: ‘GlobalRNG’ was not declared in this scope

我正在使用 Crypto++ 在 C++ 中加密文件。我正在使用下面的代码。

它不包含头文件,所以我添加了自己的头文件:

#include <iostream>
#include <string>
#include <vector>
#include <algorithm>
#include <fstream>
#include <cryptopp/cryptlib.h>
#include <cryptopp/sha.h>
#include <cryptopp/secblock.h>
#include <cryptopp/files.h>
#include <cryptopp/queue.h>
#include <cryptopp/hex.h>
#include <cryptopp/base64.h>
#include <cryptopp/filters.h>
#include <cryptopp/osrng.h>
#include <cryptopp/integer.h>
#include <cryptopp/dh.h>
#include <cryptopp/sha.h>
#include <cryptopp/modes.h>
#include <cryptopp/eax.h>
#include <cryptopp/tea.h>
#include <cryptopp/blowfish.h>
#include <cryptopp/pssr.h>
#include <cryptopp/rsa.h>
#include <cryptopp/nbtheory.h>
#include <cryptopp/eccrypto.h>
#include <cryptopp/oids.h>
#include <cryptopp/modes.h>
#include <cryptopp/gzip.h>
#include <cryptopp/blowfish.h>
#include <cryptopp/rsa.h>
#include <cryptopp/rng.h>
#include <cryptopp/cryptlib.h>
#include <cryptopp/filters.h>
#include <cryptopp/rdrand.h>

using namespace std;
using namespace CryptoPP;

但不幸的是代码不起作用
表示未声明 GlobalRNG !

error: ‘GlobalRNG’ was not declared in this scope

我用谷歌搜索并一直在寻找解决方案 2 天,我发现这是一个错误并已修复,但我使用的是最新版本:5.6.3!

所以我真的不知道为什么会出现这个错误!

版本5.6.3 GlobalRNG在文件validate.h中定义为:

// Functions that need a RNG; uses AES inf CFB mode with Seed.
CryptoPP::RandomNumberGenerator & GlobalRNG();

只需添加以下内容:

#include <cryptopp/validate.h>

解决定义问题。

GloablaRNG 是测试和基准测试的一部分。它不应该是库本身的一部分(即 libcryptopp.alibcryptopp.so)。如果您的程序抱怨缺少 GloablaRNG,那么该库已被一些测试和基准测试设备交叉污染。

这些是用于测试和基准测试的文件。它们应该 而不是 包含在您构建的库或项目中:

  • validate.h
  • bench.h

  • test.cpp

  • bench1.cpp、bench2.cpp
  • validat0.cpp、validat1.cpp、validat2.cpp、validat3.cpp
  • datatest.cpp, regtest.cpp, fipsalgt.cpp, dlltest.cpp

您可以自由使用名为 GlobalRNG() 的功能。这是它在图书馆的测试和基准测试设备中的使用方式。但是您可以考虑改用 AutoSeededRandomPoolAutoSeededRandomPool 是一个 PGP 风格的生成器,它的种子来自 /dev/urandom/dev/srandom/dev/random 或 Windows 熵池。

validate.h

中的声明
NAMESPACE_BEGIN(CryptoPP)
NAMESPACE_BEGIN(Test)

CryptoPP::RandomNumberGenerator & GlobalRNG();

NAMESPACE_END  // Test
NAMESPACE_END  // CryptoPP

定义在test.cpp

NAMESPACE_BEGIN(CryptoPP)
NAMESPACE_BEGIN(Test)

ANONYMOUS_NAMESPACE_BEGIN
OFB_Mode<AES>::Encryption s_globalRNG;
NAMESPACE_END

RandomNumberGenerator & GlobalRNG()
{
    return dynamic_cast<RandomNumberGenerator&>(s_globalRNG);
}
NAMESPACE_END  // Test
NAMESPACE_END  // CryptoPP

在test.cpp

播种
// Don't do this in production because it creates a deterministic generator
OFB_Mode<AES>::Encryption& aesg = dynamic_cast<OFB_Mode<AES>::Encryption&>(Test::GlobalRNG());
aesg.SetKeyWithIV((byte *)seed.data(), 16, (byte *)seed.data());

多年来,很多人都遇到过这个问题。在 Crypto++ 6.0 中,我们将 GlobalRNG() 移到了 Test 命名空间中。 Test 是一个新的命名空间,我们希望 Test::GlobalRNG() 能够提供信号,表明您的库构建或项目配置存在问题。

另见 Issue 379, Add Test namespace within CryptoPP namespace and Commit 73836e58a5f5c11c