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

标签 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());

我还验证生成的 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_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++ 管道的一部分。 PipelinesKeys and Formats来自 Crypto++ wiki 的文章可能对您有用。但是您显示的代码是干净的(除了拼写错误),因此您可能不需要它们。

关于c++ - 使用 Crypto++ 从字符串导入私钥,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49616740/

相关文章:

java - AES 256 加密 - Qt 等同于 Java

c++ - AES-128 CFB-8 解密的前 16 个字节已损坏

c++ - 如何在 arduino 中传递函数参数?

c++ - 不引发异常时的性能 (C++)

c++ - pari/gp 中 LLL 算法的代码

ssl - 从私钥中提取公钥

c# - C# 中的 RSA 签名和 C++ 中的 Crypto++ 验证

c++ - 如何一步获得商和余数?

c++ - 如何在接受用户输入时运行相同的功能

.net - 从 BouncyCaSTLe 导出 EC 私钥并导入到 CngKey 或 ECDsaCng 中?