使用Crypto ++从字符串导入私钥

时间:2018-04-02 18:32:34

标签: c++ cryptography crypto++

首先我创建一个像这样的签名对象:

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;我不确定。我可以帮忙试着加载我的钥匙。

1 个答案:

答案 0 :(得分:2)

这是正确的:

std::string p_key;
CryptoPP::StringSink pss(p_key);
signer.AccessKey().Save(pss);

这似乎是假设p_keykey相同的问题:

CryptoPP::StringSink ss(key);
signer.AccessKey().Load(ss);

加载时使用StringSource,而不是StringSink

CryptoPP::StringSource ss(key);
signer.AccessKey().Load(ss);

所有来源和汇都可以互换。您可以使用FileSource代替StringSource;和FileSink而不是StringSink。但是您无法用接收器替换源(反之亦然)。

StringSourceStringSink是Crypto ++中管道的一部分。来自Crypto ++ wiki的PipelinesKeys and Formats可能对您有用。但是你展示的代码是干净的(除了拼写错误),所以你可能不需要它们。