首先我创建一个像这样的签名对象:
CryptoPP::ECDSA<CryptoPP::ECP, CryptoPP::SHA256>::Signer signer;
我这样生成它们:
CryptoPP::AutoSeededRandomPool prng; //Create a random number
signer.AccessKey().Initialize(prng, CryptoPP::ASN1::secp256r1());
我还验证生成的密钥以检查一切正常:
signer.AccessKey().Validate(prng, 3))
然后将它们导出为字符串:
std::string key;
CryptoPP::StringSink pss(key);
signer.AccessKey().Save(pss);
然而,当涉及到加载这些密钥时:
CryptoPP::StringSink ss(key);
signer.AccessKey().Load(ss);
我收到并例外:
BER decode error
只是要注意签名对象在尝试加载时是空白的可能就是这样吗?
我不确定我做错了什么我相信它是将密钥加载回Access密钥的方法,我应该以不同的方式将密钥导入StringSink但是我&# 39;我不确定。我可以帮忙试着加载我的钥匙。
答案 0 :(得分:2)
这是正确的:
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 ++中管道的一部分。来自Crypto ++ wiki的Pipelines和Keys and Formats可能对您有用。但是你展示的代码是干净的(除了拼写错误),所以你可能不需要它们。