我的问题是关于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 ++代码示例,那么这些资源将非常受欢迎。
答案 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_key
和create_public_key
中执行此操作。
原因是,AutoSeededRandomPool
基类为RandomPool
,RandomPool
基类为NotCopyable
。 NotCopyable
通过将其设为私有来隐藏副本和分配。我想这就是“隐含”部分来自编译器错误的地方。
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。