SUN JCE / Oracle JCE中的默认RSA填充

你能帮我指出什么是默认的RSA填充。

确切地说,如果我创建如下的密码实例,肯定java正在使用某种填充,因为加密文本字节长度总是显示256字节,用于2048 RSA密钥,无论纯文本是一个字符还是10个字符。

Cipher.getInstance("RSA") 

如果在Cipher.getInstance(“RSA”)中没有指定填充,我想知道内部默认填充java使用的是什么。 是PKCS#1 v 1.5?

谢谢,山姆

它与"RSA/ECB/PKCS1Padding"相同,其中ECB有点用词不当,因为它没有实现分组密码操作模式(它不处理大于“块大小”的明文)。 "RSA/None/PKCS1Padding"可能是一个更好的名称或"RSA/None/RSASSA-PKCS1-v1_5"因为您对填充机制的猜测是正确的。

这意味着它使用较旧的加密模式; OAEP更能抵御攻击并包含安全证据。 不幸的是,OAEP当然不能成为新的默认值,因为所有现有的密文都不会被解密。 这就是为什么首先使用默认值是愚蠢的原因之一。

PKCS#1 v1.5填充也意味着输入被限制为密钥大小减去11个字节的最大值。 请注意,生成的密文的大小始终与PKCS#1中的密钥大小相同; 即使得到的整数较小,也会用零字节填充。 我在这里假设密钥大小是8​​的倍数。

您不应该依赖算法规范的默认值。 它使代码更难以理解,并且每个提供程序的默认值可能确实不同(尽管大多数人会尝试遵循Oracle的主导,以避免不兼容)。 因此,仅使用它来了解现有代码中配置的算法。 在我看来,唯一一个平台默认有意义的地方是SecureRandom