【问题标题】:Default RSA padding in SUN JCE/Oracle JCESUN JCE/Oracle JCE 中的默认 RSA 填充
【发布时间】:2014-01-11 19:35:31
【问题描述】:
您能帮我指出默认的 RSA 填充是什么吗?
确切地说,如果我创建如下密码实例,确保 java 使用某种填充作为加密文本字节长度始终显示 256 字节的 2048 RSA 密钥,无论纯文本是一个字符还是 10 个字符。
Cipher.getInstance("RSA")
如果在 Cipher.getInstance("RSA") 中没有指定填充,我想知道 java 内部使用的默认填充是什么。那是 PKCS#1 v 1.5 吗?
谢谢,
山姆
【问题讨论】:
标签:
java
cryptography
jce
【解决方案1】:
它与"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。