Crypto++ AutoSeededRandomPool 复制构造函数隐式删除

Crypto++ AutoSeededRandomPool copy constructor implicitly deleted

我的问题是关于 crypto++ 构造函数以及为什么它处于 "implicitly deleted" 状态,即使它遵循文档中提供的示例。

我试图脱离 Crypto++'s documentation to create a digital signature key pair 上的示例提供的代码,但我在调用 AutoSeededRandomPool 对象的构造函数时遇到问题。 这是我调用到终端的命令:

g++  -I /usr/local/include/ -l cryptopp -std=c++11 -c -o build/account.o src/account.cpp 

我收到以下错误:

error: call to implicitly-deleted copy constructor of 'CryptoPP::AutoSeededRandomPool',
note: copy constructor of 'AutoSeededRandomPool' is implicitly deleted because base
class 'CryptoPP::RandomPool' has a deleted copy constructor

此外,我收到这条不寻常的消息:

clang: warning: -lcryptopp: 'linker' input unused [-Wunused-command-line-argument]

这是我用来生成 public/private 密钥对的文件。他们几乎遵循这个例子:

DSA::PrivateKey create_private_key(AutoSeededRandomPool rng) {
  DSA::PrivateKey private_Key;
  private_Key.GenerateRandomWithKeySize(rng, 1024);
  return private_Key;
}

DSA::PublicKey create_public_key(DSA::PrivateKey private_key, AutoSeededRandomPool rng) {
  DSA::PublicKey public_Key;
  public_Key.AssignFrom(private_key);
  if (!private_key.Validate(rng, 3) || !public_Key.Validate(rng, 3))
  {
    throw std::runtime_error("DSA key generation failed");
  }
  return public_Key;
}

我在构造函数中声明并初始化 AutoSeededRandomPool 对象,如下所示:

account::account() {
  balance = 0;
  AutoSeededRandomPool rng;
  private_key = utils::create_private_key(rng);
  public_key = utils::create_public_key(private_key, rng);
}

我已经链接了为此所需的库,并且在调用 g++ 时链接了它们。此外,如果有人知道是否有更详细的 Crypto++ 代码示例,将不胜感激这些资源。

 g++ -I /usr/local/include/ -l cryptopp -std=c++11 -c -o build/account.o src/account.cpp 

clang: warning: -lcryptopp: 'linker' input unused

尝试:

g++ ... src/account.cpp -c -o build/account.o

省略-l cryptopp。仅在 link.

期间需要
DSA::PrivateKey create_private_key(AutoSeededRandomPool rng) {
  DSA::PrivateKey private_Key;
  private_Key.GenerateRandomWithKeySize(rng, 1024);
  return private_Key;
}

error: call to implicitly-deleted copy constructor of 'CryptoPP::AutoSeededRandomPool', note: copy constructor of 'AutoSeededRandomPool' is implicitly deleted because base class 'CryptoPP::RandomPool' has a deleted copy constructor

通过 rng 引用:

DSA::PrivateKey create_private_key(AutoSeededRandomPool& rng) {
    ...
}

create_private_keycreate_public_key 中都这样做。

原因是,AutoSeededRandomPool基数class是RandomPool,而RandomPool基数class是NotCopyableNotCopyable 通过将它们设为私有来隐藏复制和分配。我想这就是 "implicit" 部分来自编译器错误的地方。

class RandomPool : public RandomNumberGenerator, public NotCopyable
{
    ...
}

IF你不想通过引用传递,那就在本地创建一个。在生成私钥时,您 想要 这样做是有某些原因的。有关详细信息,请参阅 Cryptography Engineering: Design Principles and Practical Applications

DSA::PrivateKey create_private_key() {
  AutoSeededRandomPool rng;
  DSA::PrivateKey private_Key;
  private_Key.GenerateRandomWithKeySize(rng, 1024);
  return private_Key;
}

相关,当你link时,将-lcryptopp放在命令的末尾。类似于:

g++ -o myprog -std=c++11 build/account.o build/some-other-object.o -lcryptopp -pthread

顺序很重要,因为 LD 是单程 linker。图书馆总是走到最后。您可以使用 -(--start-group 等选项解决它,但很容易记住将库放在最后。


更多的 C++11 背景故事是,当您遇到 copy constructor implicitly deleted 时,您通常会在 class 中定义一个。例如,参见 Use of deleted function error.

但是,对于 AutoSeededRandomPool,我们不希望它们被复制,原因有几个。 Crypto++ Algorithm class 是 AutoSeededRandomPool 的基础 class,有一个 Clone。但是,我们也不希望克隆生成器。再次参见 Cryptography Engineering: Design Principles and Practical Applications