【发布时间】:2014-12-01 15:50:43
【问题描述】:
我是 cryptopp 新手,并且一直在为 ECDSA 签名创建私钥而苦苦挣扎。
我有一个十六进制编码的私有指数E4A6CFB431471CFCAE491FD566D19C87082CF9FA7722D7FA24B2B3F5669DBEFB。这被存储为一个字符串。
我想用它来使用 ECDSA 对文本块进行签名。我的代码看起来有点像这样
string Sig::genSignature(const string& privKeyIn, const string& messageIn)
{
AutoSeededRandomPool prng;
ECDSA<ECP, SHA256>::PrivateKey privateKey;
privateKey.AccessGroupParameters().Initialize(ASN1::secp256r1());
privateKey.Load(StringSource(privKeyIn, true, NULL).Ref());
ECDSA<ECP, SHA256>::Signer signer(privateKey);
// Determine maximum size, allocate a string with that size
size_t siglen = signer.MaxSignatureLength();
string signature(siglen, 0x00);
// Sign, and trim signature to actual size
siglen = signer.SignMessage(prng, (const byte *) messageIn.data(), (size_t) messageIn.length(), (byte*)signature.data());
signature.resize(siglen);
cout << signature.data() << endl;
return signature;
}
当我尝试执行 privateKey.load(...) 时,此代码在 Visual Studio 中生成以下错误
First-chance exception at 0x7693C42D in DLLTest.exe: Microsoft C++ exception: CryptoPP::BERDecodeErr at memory location 0x0033EEA8.
Unhandled exception at 0x7693C42D in DLLTest.exe: Microsoft C++ exception: CryptoPP::BERDecodeErr at memory location 0x0033EEA8.
我猜我在做一些有点愚蠢的事情......任何帮助都会很棒???
PS 我在使用 ECDH 生成 GMAC 时遇到了类似的问题,但通过将密钥保存为 SECByteBlock 来解决这个问题,但这种“技巧”在这种情况下似乎不起作用。
【问题讨论】:
-
“我在使用 ECDH 生成 GMAC 时遇到了类似的问题......” - 我不清楚 ECDH 和 GMAC 之间的交集在哪里。您可能想在Code Review Stack Exchange 上要求进行代码审查。
-
ECDH 用于创建共享密钥,然后用于创建用于 GMAC 生成的 AES 密钥。
标签: c++ private-key crypto++ ecdsa signer