RSAES_OAEP_Encryptor生成的密文长度?

时间:2014-01-22 10:17:08

标签: rsa crypto++

我对Crypto++库的使用进展顺利,但我有一个小问题......

如果我使用RSAES_OAEP_Encryptor& RSAES_OAEP_Decryptor一切都很好。 (我正在使用OpenSSL生成的PEM文件中的2048位密钥。

我的问题是:ciphertext产生的encryptor.Encrypt(...)的长度是否总是等于decryptor.FixedCiphertextLength()或者可能低于{{1}}?我只是问,因为这是在许多应用程序使用的库中,我需要理智检查参数.....

顺便说一句。是否有更快的加密/解密使用RSA,至少保持OAEP提供的相同安全级别?使用1024位密钥,在一个示例测试框中,平均超过1000次迭代,我发现编码短字符串需要大约80uS,而要解密需要1.03mS(12倍长)。使用2048位密钥加密需要190uS和解密,4.3mS(22倍长)。我知道RSA解密速度很慢,但......系统运行的是XP Pro SP3 / Xeon E5520,并且使用VS2008而不是/ MT编译VS2008。出于合规性原因,我不能使用比2048位短的密钥......

非常感谢

尼克

1 个答案:

答案 0 :(得分:1)

  

RSAES_OAEP_Encryptor生成的密文长度?

就RSA而言,我相信FixedPlaintextLength()FixedCiphertextLength()致电MaxPreImage()MaxImage()。反过来,MaxPreImage()MaxImage()会返回n - 1


  

encryptor.Encrypt(...)生成的密文的长度是否总是等于decryptor.FixedCiphertextLength()或者可以小于那个?

这取决于所使用的密码系统。通常,它的大小决定了FixedCiphertextLength()是否成立(而不是纯文本的大小)。对于RSA / OAEP和其他类似ElGamal的情况,我认为它有效。

我认为这里感兴趣的课程是PK_CryptoSystem Class Reference。像RSAES_OAEP_Encryptor这样的类继承自PK_CryptoSystem,这就是FixedCiphertextLength()和朋友来自的地方。


  

使用1024位密钥,在一个示例测试框中,平均超过1000次迭代,我发现编码短字符串需要大约80uS,而解密需要1.03mS(12倍长)。使用2048位密钥加密需要190uS和解密,4.3mS(22倍长)

这是一个不同的问题,但是......

在加密或验证的情况下,使用公共指数。默认情况下,公共指数为65537(IIRC)。它具有较低的汉明重量(0的高密度),因此方程和乘法指数运行相对较快。

另一方面,解密和签名使用私有指数,该指数应具有1和0的正态分布。有很多正方形和倍数可以执行,这些需要额外的时间。

利用这些微小的时间差异,如果你不小心,那么你的辅助渠道来自哪里。如果你不小心,国家安全局会感谢你。


  

出于合规性原因,我不能使用比2048位更短的密钥

2048位模数比1024位模数慢约10倍。这就是为什么这么多人不愿意从1024位移动,以及为什么1024位仍然是首选。

Peter Gutmann在他的工程安全书(第229页)中对此有所说明:

  

[破坏威胁模型]的另一个例子是密钥输入   证书,浏览器供应商(响应NIST   要求)强制CA从1024位切换到2048位密钥,   任何仍然使用1024位密钥被公开谴责为   不安全的。如第1页“问题”中所述,坏人没有   甚至注意他们的欺诈证书是否正在签署   使用或包含2048位密钥。

相关问题