C++ 加载密钥时发生BER解码错误
我一直在使用Crypto++开发数字签名器和验证器。我解决了以下问题:我的签名者和验证者可以很好地处理我使用第一个示例(生成RSA密钥对并保存)通过编程生成的公钥和私钥。但是,当我使用提供给我测试的另一个测试密钥对时,我出现了以下错误:“BER解码错误”,当我尝试加载密钥进行签名时。我一直在网上搜索,但无法解决这个问题。以下是我的课程:C++ 加载密钥时发生BER解码错误,c++,rsa,digital-signature,crypto++,C++,Rsa,Digital Signature,Crypto++,我一直在使用Crypto++开发数字签名器和验证器。我解决了以下问题:我的签名者和验证者可以很好地处理我使用第一个示例(生成RSA密钥对并保存)通过编程生成的公钥和私钥。但是,当我使用提供给我测试的另一个测试密钥对时,我出现了以下错误:“BER解码错误”,当我尝试加载密钥进行签名时。我一直在网上搜索,但无法解决这个问题。以下是我的课程: class DSUtility { protected: DSUtility() = default; template<typename
class DSUtility
{
protected:
DSUtility() = default;
template<typename KeyType, typename KeySourceType>
KeyType PrepareKey_(const std::string& key_source);
};
template<typename KeyType, typename KeySourceType>
KeyType DSUtility::PrepareKey_(const std::string& key_source)
{
CryptoPP::ByteQueue key_bytes;
KeySourceType(key_source.c_str(), true, new CryptoPP::Base64Decoder).TransferTo(key_bytes);
key_bytes.MessageEnd();
KeyType key;
key.Load(key_bytes); // FAILS WHEN TRYING TO SIGN WITH ANOTHER PRIVATE KEY
return key;
}
class Signer : private DSUtility
{
public:
Signer(const std::string& private_key);
std::string Sign(const std::string& data);
private:
typedef CryptoPP::RSA::PrivateKey PrivateKey;
CryptoPP::RSASS<CryptoPP::PKCS1v15, CryptoPP::SHA256>::Signer signer_;
};
Signer::Signer(const std::string& private_key) :
signer_(PrepareKey_<PrivateKey, CryptoPP::StringSource>(private_key))
{
}
std::string Signer::Sign(const std::string& data)
{
CryptoPP::SecByteBlock signature(signer_.SignatureLength());
signer_.SignMessage(CryptoPP::AutoSeededRandomPool(), (byte const*)data.c_str(), data.size(), signature);
return std::string(signature.begin(), signature.end());
}
另一个如下所示:
-----BEGIN RSA PRIVATE KEY-----
MIICXAIBAAKBgQDGwB5n/xMsDoqo+bGaws15FYGGjsJxCM2deHJZqV2QKfvkmStf
8HntPqaJ+mc9UA6ghN1uGndChg1PuHSNVaRU2x8fem/mFUhfOJaZcYich8JAy0nm
sJUOwoRqLfKjLWmqy0QZHXDDVw+sD5uq/oOvfFFjuYIcsskHQmGTfkdJrQIDAQAB...
但是,当我使用提供给我测试的另一个测试密钥对时,我出现了以下错误:“BER解码错误”,当我尝试加载密钥进行签名时
很难说到底出了什么问题。。。您应该提供真正的测试密钥。不值得花时间去尝试破译一个带有“…”的假货,因为我们知道它会失败
我只是猜测,但它可能是一个原始密钥(即,只有公钥或私钥,没有标识符)而不是密钥信息(即,带有内部公钥或私钥的外部序列和标识符)。后者(密钥信息)有时被称为主题PublicKeyIDNFO
,因为它是公钥
您可能想看看Crypto++wiki。你引用的指南有点旧,它是出于历史目的而提供的。以下是3秒钟的行程:
- 加载原始密钥时,请调用
BERDecode
- 加载
密钥信息时,请调用
load
- 保存原始密钥时,请调用
derecode
- 保存钥匙信息时,请调用
save
“…另一个如下所示:
----开始RSA私钥------
…”
有关PEM编码的密钥,请参见Crypto++wiki上的
这里引用了一个堆栈溢出问题,但它只是引用了Crypto++wiki页面(以及其他答案):
尝试使用其他私钥签名时失败 此外,“尝试签署另一私钥时失败”与“尝试加载时失败”不同。我试着专注于你提出的问题,所以这可能不是你希望的答案
在您花一些时间研究堆栈溢出后,您可能会对那些回答他们希望是而不是实际提出的问题的人感到厌倦。我很快就厌倦了它,所以我在回答时尽量保持专注(这就是我引用我回答的所有内容的原因,即使是评论)。您是否尝试删除明显不同的
-----BEGIN RSA私钥------
行?是的,我在第一步就这么做了:)
-----BEGIN RSA PRIVATE KEY-----
MIICXAIBAAKBgQDGwB5n/xMsDoqo+bGaws15FYGGjsJxCM2deHJZqV2QKfvkmStf
8HntPqaJ+mc9UA6ghN1uGndChg1PuHSNVaRU2x8fem/mFUhfOJaZcYich8JAy0nm
sJUOwoRqLfKjLWmqy0QZHXDDVw+sD5uq/oOvfFFjuYIcsskHQmGTfkdJrQIDAQAB...
template<typename KeyType, typename KeySourceType> KeyType
DSUtility::PrepareKey_(const std::string& key_source)
{
CryptoPP::ByteQueue key_bytes;
KeySourceType(key_source.c_str(), true, new CryptoPP::Base64Decoder).TransferTo(key_bytes);
key_bytes.MessageEnd();
KeyType key;
key.Load(key_bytes); // FAILS WHEN TRYING TO SIGN WITH ANOTHER PRIVATE KEY
return key;
}
template<typename KeyType, typename KeySourceType> KeyType
DSUtility::PrepareKey_(const std::string& key_source)
{
ArraySource as((const byte*)key_source.data(), key_source.size(),
true, new Base64Decoder());
key.Load(as);
return key;
}
key.BERDecode(as);