RSA签名大小不匹配
RSA Signature Size Mismatch
如本文所述,消息签名的长度等于私钥的模数,也就是公钥。
我正在实现一个签名消息的系统,并且我有一个无法解决的大小不匹配。我使用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
MaxSignatureLength
和RSA Signature length
不应该长420字节吗?
是我使用的算法有问题吗?
MaxSignatureLength和RSA签名长度不应该是420字节吗?
。您正在请求3072位或384字节的密钥。这是签名大小的限制。
每个密码系统在这方面可能是不同的。
cout <<" ("<< spki.size()<<" bytes)"<<endl;
这是带有ASN.1帧或开销的{OID,n,e}
的大小。请参阅前面的问题在数据包有效负载中发送PublicKey,以了解它的样子(特别是命令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个字节。
我认为你应该做的是使用集成加密方案来来回发送加密消息。具体请参见椭圆曲线综合加密方案(ECIES)和离散对数综合加密方案(DLIES)。ECIES操作在椭圆曲线上,DLIES操作在整数上。
集成加密方案具有一些非常理想的安全属性,例如IND-CCA2。他们通过而不是来实现它,允许您做一些事情,比如重用安全上下文,因此安全性被纳入方案。
但是,您仍然需要解决密钥分发问题。这是一个棘手的问题,我们没有一个好的、可扩展的解决方案。
现在你明白为什么算法敏捷性是重要的,以及为什么你希望OID作为密钥的一部分在握手阶段发送:)
- Qt SQLite没有查询或参数计数不匹配
- 模板参数推导失败,函数参数/参数不匹配
- 在使用累加时,C++中的运算符+不匹配
- C++ 与操作员不匹配<<
- 在 Arduino 上使用 sscanf 会导致与 const char * 不匹配,并且返回值始终相同,尽管输入值不同
- 与'operator='不匹配(操作数类型'String'且"void")
- C++模板/别名 - 模板参数列表中参数 1 处的类型/值不匹配
- C4018:类内有符号、无符号不匹配
- 我在 .h 中有一个枚举类,并且在.cpp错误中有一个运算符重载:与"运算符<<不匹配
- 为什么我收到错误:"运算符<<不匹配?
- RE2 不匹配非 ASCII 字符
- 函数签名与调用的函数不匹配,常量字符[]和字符*之间的区别?
- 模板推导:为什么函数指针模板定义在常量和/或引用时不匹配?
- 错误:"模板<类_Tp,类_Dp>类 std::unique_ptr"的模板参数列表中参数 1 的类型/值不匹配
- OpenSSL fips in C++ wrapper Library 如何?错误:指纹不匹配
- 为什么我的数组值与此处的全局变量不匹配?
- 引号之间匹配/不匹配,带有不可避免的引号和多行
- 映射迭代器与运算符不匹配
- C++调用和定义不匹配
- RSA签名大小不匹配