所以首先我创建一个签名对象,如下所示:
CryptoPP::ECDSA<CryptoPP::ECP, CryptoPP::SHA256>::Signer signer;
我这样生成它们:
CryptoPP::AutoSeededRandomPool prng; //Create a random number
signer.AccessKey().Initialize(prng, CryptoPP::ASN1::secp256r1());
我还验证生成的 key 以检查一切是否正常:
signer.AccessKey().Validate(prng, 3))
然后将这些导出为字符串:
std::string key;
CryptoPP::StringSink pss(key);
signer.AccessKey().Save(pss);
然而,在加载这些 key 备份时:
CryptoPP::StringSink ss(key);
signer.AccessKey().Load(ss);
我收到异常:
BER decode error
请注意,在尝试加载时签名对象是空白的,可能是这样吗?
我不确定我做错了什么我相信这是将 key 加载回访问 key 的方法,我应该以不同的方式将 key 导入 StringSink 但我不确定。请帮我加载我的 key 。
最佳答案
这是正确的:
std::string p_key; CryptoPP::StringSink pss(p_key); signer.AccessKey().Save(pss);
这看起来像是假设 p_key
和 key
相同的问题:
CryptoPP::StringSink ss(key); signer.AccessKey().Load(ss);
加载时用作StringSource
,而不是StringSink
:
CryptoPP::StringSource ss(key);
signer.AccessKey().Load(ss);
所有源和接收器都是可互换的。您可以使用 FileSource
而不是 StringSource
;和 FileSink
而不是 StringSink
。但是您不能用接收器替换源(反之亦然)。
StringSource
和 StringSink
是 Crypto++ 管道的一部分。 Pipelines和 Keys and Formats来自 Crypto++ wiki 的文章可能对您有用。但是您显示的代码是干净的(除了拼写错误),因此您可能不需要它们。
关于c++ - 使用 Crypto++ 从字符串导入私钥,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49616740/