RSA签名大小不匹配

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字节长?

我使用的算法有问题吗?

jww*_*jww 4

MaxSignatureLength 和 RSA 签名长度不应该是 420 字节长吗?

不。您要求的是 3072 位或 384 字节的密钥。这就是签名大小的限制。

每个密码系统在这方面可能会有所不同。

cout <<" ("<< spki.size()<<" bytes)"<<endl;
Run Code Online (Sandbox Code Playgroud)

这是ASN.1{OID,n,e}成帧或开销的大小。请参阅您之前的问题在数据包有效负载中发送公钥以了解其外观(特别是命令的输出)。dumpasn1 rsa-public.der

cout <<"MaxSignatureLength " <<length<<endl;
Run Code Online (Sandbox Code Playgroud)

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 作为密钥的一部分发送:)