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

时间:2017-07-25 01:44:47

标签: c++11 constructor crypto++ dsa

我的问题是关于crypto ++构造函数以及为什么它处于“隐式删除”的状态,即使它遵循文档中提供的示例。

我试图摆脱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]

以下是我用来生成公钥/私钥对的文件。他们几乎都遵循这个例子:

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 ++代码示例,那么这些资源将非常受欢迎。

1 个答案:

答案 0 :(得分:0)

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

clang:警告:-lcryptopp:'链接'输入未使用

尝试:

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

省略-l cryptopp。只在链接期间才需要它。

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

错误:调用隐式删除的复制构造函数   'CryptoPP :: AutoSeededRandomPool',注意:复制构造函数   'AutoSeededRandomPool'被隐式删除,因为基类   'CryptoPP :: RandomPool'有一个删除的拷贝构造函数

通过引用传递rng

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

同时在create_private_keycreate_public_key中执行此操作。

原因是,AutoSeededRandomPool基类为RandomPoolRandomPool基类为NotCopyableNotCopyable通过将其设为私有来隐藏副本和分配。我想这就是“隐含”部分来自编译器错误的地方。

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;
}

相关,当您链接时,将-lcryptopp放在命令的末尾。类似的东西:

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

顺序很重要,因为LD是单通道链接器。图书馆总是走到尽头。您可以使用-(--start-group等选项解决此问题,但很容易记住将库放在最后。

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

但是,在AutoSeededRandomPool的情况下,我们不希望它们被复制有几个原因。 Crypto ++ Algorithm类是AutoSeededRandomPool的基类,具有Clone。但是,我们也不希望克隆生成器。再次,请参阅Cryptography Engineering: Design Principles and Practical Applications