javax.crypto.Cipher为RSA使用了哪个填充

时间:2015-08-16 09:52:49

标签: java security cryptography rsa padding-oracle-attack

我需要通过RSA解密消息,以便通过不安全的通道发送消息,但我害怕Padding Oracle Attack。因此我已经问过以下几个问题:

  1. How to verify the integrity of RSA encrypted messages?
  2. How to ensure message integrity for RSA ciphers by using javax.crypto.Cipher
  3. 与第一个问题中提到的一样,

      

    但是,由于您使用的是高级加密库,因此您不必担心这一点。该图书馆的作者应该照顾它。

    我不应该考虑。据我所知,PKCS#1 v1.5的RSA实施容易受到Padding Oracale Attack的影响,OAEP不是(假设它已正确实施)

    因此,我想知道Java 7的javax.crypt.Cipher使用了哪个填充实现

2 个答案:

答案 0 :(得分:6)

这不是the first link to the cryptography site给出的好建议。您永远不应该依赖加密库加密算法的默认值。这有很多原因:

  1. 不同的实现,不同的默认值(加密提供程序对默认值没有要求,尽管大多数都会复制Oracle / Sun默认值);
  2. 现在安全性可能不会被认为是安全的,因为为了向后兼容,您永远不能更改默认值;
  3. 目前还不清楚任何人在阅读你的软件时默认是什么(你可以记录它,但在这种情况下你也可以把它写出来)。
  4. 由于历史原因,Oracle提供的SunJCEProvider默认为PKCS#1填充("PKCS1Padding")(参见上面的原因#2)。这没有很好的记录。

    那时设置了默认值,你基本上只有不安全的教科书RSA("NoPadding")和PKCS#1 v1.5版本("PKCS1Padding"RSAES-PKCS1-v1_5 in the PKCS#1 v2.1 standard)。当时RSAES-PKCS1-v1_5绝对是更安全的选择。现在将默认值更改为OAEP会破坏使用默认值的每个RSA实现。

    otus的建议(在本答案的第一个链接中)更适合于库中的协议实现而不是加密算法。 最终,您应该能够捍卫所做出的选择的安全性,无论您选择什么。

答案 1 :(得分:0)

仅指定RSA时,弹性城堡的默认值为RSA/NONE/NOPADDING

这也与RSA/ECB/NOPADDING相同。