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

Importing a private key from a string using 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

请注意,在尝试加载时签名对象是空白的,可能是这样吗?

我不确定我做错了什么我相信这是将密钥加载回访问密钥的方法,我应该以不同的方式将密钥导入 StringSink 但我不确定。请帮我加载密钥。

这是正确的:

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 的 Pipelines and Keys and Formats 可能对您有用。但是您显示的代码是干净的(除了拼写错误)所以您可能不需要它们。