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_key
和 create_public_key
中都这样做。
原因是,AutoSeededRandomPool
基数class是RandomPool
,而RandomPool
基数class是NotCopyable
。 NotCopyable
通过将它们设为私有来隐藏复制和分配。我想这就是 "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。
我的问题是关于 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_key
和 create_public_key
中都这样做。
原因是,AutoSeededRandomPool
基数class是RandomPool
,而RandomPool
基数class是NotCopyable
。 NotCopyable
通过将它们设为私有来隐藏复制和分配。我想这就是 "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。