【问题标题】:RSA Signature Size MismatchRSA 签名大小不匹配
【发布时间】:2015-09-10 14:24:32
【问题描述】:

here 所述,消息签名的长度等于私钥的模数,又名公钥。

我正在实施一个对消息进行签名的系统,但我遇到了无法解决的大小不匹配问题。 我用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 );

输出是:

>> RSA Keys generated (420 bytes)
>> ServerHello sent (436 bytes)
   MaxSignatureLength 384
   RSA Signature length 384

MaxSignatureLengthRSA Signature length 不应该是 420 字节长吗?

是我使用的算法有问题吗?

【问题讨论】:

  • 我对加密和加密算法编程不太熟悉,但是当我做一些研究时,我发现这个网站可以为您提供一些帮助。 cryptopp.com/docs/ref/index.html
  • @Eisen - 相关,我认为您正在将原始字节传递给Crafter,如果您有一条跨越多个在线(或超过- the-air) 第 1 层帧。你看过Protocol Buffers吗?我认为您可以使用它们在Crafter 中构建消息。或者,您可以 ASN.1 对您的消息进行编码。或者,您可以使用BSON 之类的内容。在所有这些情况下,您将知道您发送和接收的消息的长度。

标签: c++ rsa digital-signature crypto++


【解决方案1】:

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

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

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

cout <<" ("<< spki.size()<<" bytes)"<<endl;

这是{OID,n,e} 的大小,带有ASN.1 框架或开销。请参阅您之前的问题Sending PublicKey within packet payload 了解它的外观(特别是命令dumpasn1 rsa-public.der 的输出)。

cout <<"MaxSignatureLength " <<length<<endl;

如果我没记错的话,这是 RSA 的 n - 1

是我使用的算法有问题吗?

不,您通过调用MaxSignatureLength() 做的事情是正确的。


 >> RSA Keys generated (420 bytes)
 >> ServerHello sent (436 bytes)

我只是推测,但您似乎也有设计问题。

当您加密消息时,例如ServerHello,您通常使用对称密码(例如 AES 或 Camellia)对其进行加密。然后,您获取该对称密钥,并使用 RSA 密钥对其进行加密。最后,您将{encrypted symmetric cipher key, encrypted message under symmetric cipher} 发送给对方。

在上面部分描述的系统中,您仅在公钥下加密 16 或 32 个字节。


认为你应该做的是使用集成加密方案来回发送加密消息。为此,请参阅 Elliptic Curve Integrated Encryption Scheme (ECIES)Discrete Logarithm Integrated Encryption Scheme (DLIES)。 ECIES 对椭圆曲线进行运算,DLIES 对整数进行运算。

集成加密方案具有一些非常理想的安全属性,例如IND-CCA2。他们通过允许您做一些事情来实现它,例如重用安全上下文,因此安全性被纳入方案。

不过,您仍然必须解决密钥分配问题。这是一个棘手的问题,我们没有一个好的、可扩展的解决方案。

现在您明白了为什么算法敏捷性很重要,以及为什么您希望在握手阶段将该 OID 作为密钥的一部分发送 :)

【讨论】:

  • 感谢您提供完整的答案!但为什么它说密钥是 420 字节长?是因为RSA:PublicKey 包含比 actual 键更多的数据(页眉/页脚)吗?你还说我的信息太长了。实际上,消息是Server Public ECDHE key,它有32 字节长。是不是太长了?或者你说消息时是指ServerHello?在这种情况下这很正常,我将rng(16 个字节)放在 publicKey 之前。并且 420+16 = 436 :)
  • @Eisen - 我在答案中添加了更多信息。
猜你喜欢
  • 1970-01-01
  • 2011-10-03
  • 2019-04-24
  • 1970-01-01
  • 2023-03-22
  • 1970-01-01
  • 1970-01-01
  • 2020-10-08
  • 2014-02-09
相关资源
最近更新 更多