错误:' GlobalRNG '未在此范围内声明

error: ‘GlobalRNG’ was not declared in this scope

本文关键字:范围内 声明 GlobalRNG 错误      更新时间:2023-10-16

我使用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,在CryptoPP命名空间中添加Test命名空间并提交73836e58a5f5c11c.