使用 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_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 and Keys and Formats 可能对您有用。但是您显示的代码是干净的(除了拼写错误)所以您可能不需要它们。
所以首先我创建一个签名对象,如下所示:
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_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 and Keys and Formats 可能对您有用。但是您显示的代码是干净的(除了拼写错误)所以您可能不需要它们。