2016-09-04 9 views
0

C++でファイルを暗号化するのにCrypto ++を使用しています。私は以下のコードを使用しています。エラー: 'GlobalRNG'がこのスコープで宣言されていません

#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 

私はGoogleで検索し、私はそれはバグだことを発見し、固定されているが、私は最新バージョン抱えている2日間のためのソリューションを探して保持:5.6.3を!

このエラーがなぜ表示されているのかわかりません。バージョン5.6.3 GlobalRNG

+0

これを宣言するヘッダーファイルを見つけるためにヘッダーファイルをgrepし、 '#include 'します。 –

+0

@SamVarshavchikもちろん私はそれをしました!!!!私はそれを宣言しているものは見つけられませんでした! – MeNotMe

+0

私はそのリンクを深く疑っています。適切に書かれた非対称暗号が「データ不一致エラー」を生成する方法はありません。また、対称キーを文字で構成する必要はありません。十分なランダムバイトを生成し、それを使用します。 (明らかに、対称鍵でバルクデータを暗号化するアプローチは正しいです。) –

答えて

1

として、ファイルvalidate.hで定義されている:定義の問題を解決するために

#include <cryptopp/validate.h> 

:ただ、このインクルージョンを追加

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

+0

'GlobalRNG()'はCrypto ++のテストと検証のスイートです。おそらく、テストスイートからのものを含めるのではなく、自分のジェネレータを使用するべきです。また、[RandomNumberGenerator | Test SuiteとGlobalRNG](http://cryptopp.com/wiki/RandomNumberGenerator#Test_Suite_and_GlobalRNG)をCrypto ++ wikiに追加しました。 – jww

+0

@jww確かに、私はちょうど彼の質問に答えました。彼が従っているチュートリアルの健全性を確認することはできません。とにかく、その情報を完全性のための答えに追加するつもりです –

0

GloablaRNGは、テストおよびベンチマーキングの一部です。ライブラリの一部ではない(つまり、libcryptopp.aまたはlibcryptopp.so)。お使いのプログラムが不足していることをお詫び申し上げます場合は、ライブラリはテストおよびベンチマーキング装置のいくつかと交差汚染されていました。

これらは、テストおよびベンチマークに使用されるファイルです。彼らは、ないライブラリのビルドまたはプロジェクトに含まれるべきである。

  • 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()と呼ばれる機能を自由に使用できます。図書館のテストとベンチマーキングにどのように使われているのですか?しかし、AutoSeededRandomPoolを代わりに使用することを検討することもできます。 AutoSeededRandomPoolは、PGPスタイルのジェネレータであり、/dev/urandom/dev/srandom/dev/randomまたはWindowsのエントロピープールからシードされています。

バリデーションの宣言。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およびCommit 73836e58a5f5c11cも参照してください。

関連する問題