Eis*_*eim 5 c++ rsa digital-signature crypto++
如前所述这里,消息签名的长度等于私钥的模数,又称公钥.
我正在实现一个签署消息的系统,而且我的大小不匹配是我无法解决的.我用crypto++.
这是我使用的代码:
/* Create RSA Keys */
RSA::PrivateKey privateKey;
privateKey.GenerateRandomWithKeySize(prng, 3072);
RSA::PublicKey publicKey(privateKey);
cout << ">> RSA Keys generated";
/* Key Size */
string spki;
StringSink sSink(spki);
publicKey.Save(sSink);
cout <<" ("<< spki.size()<<" bytes)"<<endl;
RSASSA_PKCS1v15_SHA_Signer signer(privateKey);
size_t length = signer.MaxSignatureLength();
cout <<"MaxSignatureLength " <<length<<endl;
SecByteBlock signature( length );
Run Code Online (Sandbox Code Playgroud)
输出是:
>> RSA Keys generated (420 bytes)
>> ServerHello sent (436 bytes)
MaxSignatureLength 384
RSA Signature length 384
Run Code Online (Sandbox Code Playgroud)
不应该MaxSignatureLength,和RSA Signature length420字节长?
我使用的算法有问题吗?
MaxSignatureLength 和 RSA 签名长度不应该是 420 字节长吗?
不。您要求的是 3072 位或 384 字节的密钥。这就是签名大小的限制。
每个密码系统在这方面可能会有所不同。
Run Code Online (Sandbox Code Playgroud)cout <<" ("<< spki.size()<<" bytes)"<<endl;
这是ASN.1{OID,n,e}成帧或开销的大小。请参阅您之前的问题在数据包有效负载中发送公钥以了解其外观(特别是命令的输出)。dumpasn1 rsa-public.der
Run Code Online (Sandbox Code Playgroud)cout <<"MaxSignatureLength " <<length<<endl;
n - 1如果我没记错的话,这是针对 RSA 的。
是我使用的算法有问题吗?
不,您通过调用正确地做事MaxSignatureLength()。
>> RSA Keys generated (420 bytes)
>> ServerHello sent (436 bytes)
Run Code Online (Sandbox Code Playgroud)
我只是猜测,但看来您也存在设计问题。
当您加密消息(例如 )时ServerHello,通常会使用对称密码(例如 AES 或 Camellia)对其进行加密。然后,您获取该对称密钥,并使用 RSA 密钥对其进行加密。最后,您将这对发送{encrypted symmetric cipher key, encrypted message under symmetric cipher}给对方。
在上面部分描述的系统中,您仅使用公钥加密 16 或 32 字节。
我认为您应该做的是使用集成加密方案来回发送加密消息。为此,请参阅椭圆曲线集成加密方案 (ECIES)和离散对数集成加密方案 (DLIES)。ECIES 在椭圆曲线上运行,DLIES 在整数上运行。
集成加密方案具有一些非常理想的安全属性,例如IND-CCA2。他们通过不允许您执行某些操作(例如重用安全上下文)来实现这一目标,因此安全性已融入到方案中。
不过,您仍然需要解决密钥分配问题。这是一个棘手的问题,我们没有一个好的、可扩展的解决方案。
现在您明白为什么算法敏捷性很重要,以及为什么您希望在握手阶段将 OID 作为密钥的一部分发送:)
| 归档时间: |
|
| 查看次数: |
468 次 |
| 最近记录: |