你能帮我指出默认的 RSA 填充是什么吗?
准确地说,如果我如下创建密码实例,确保 java 使用某种填充作为加密文本字节长度始终显示 256 字节的 2048 RSA key ,无论纯文本是一个字符还是 10 个字符。
Cipher.getInstance("RSA")
如果在 Cipher.getInstance("RSA") 中未指定填充,我想知道 java 在内部使用的默认填充是什么。是 PKCS#1 v 1.5 吗?
谢谢, 山姆
最佳答案
它与 "RSA/ECB/PKCS1Padding"
相同,其中 ECB 有点用词不当,因为它没有实现分组密码操作模式(它不处理大于“ block 大小”)。 "RSA/None/PKCS1Padding"
或 "RSA/None/RSASSA-PKCS1-v1_5"
会是更好的名称,因为您对填充机制的猜测是正确的。
这意味着它使用了旧的加密模式; OAEP 更能抵抗攻击并包含安全证明。不幸的是,OAEP 当然不能成为新的默认值,因为所有现有的密文都不会再解密了。这就是为什么使用默认值首先是愚蠢的原因之一。
PKCS#1 v1.5 填充还意味着输入被限制为最大 key 大小减去 11 个字节。请注意,生成的密文的大小始终与 PKCS#1 中的 key 大小相同;即使生成的整数更小,它也会被填充为零字节。我在这里假设 key 大小是 8 的倍数。
您不应依赖算法规范的默认值。它使代码更难理解,并且每个提供商的默认值可能确实不同(尽管大多数人会尝试遵循 Oracle 的领导,以避免不兼容)。因此,仅使用它来了解现有代码中配置了哪种算法。在我看来,平台默认值唯一有意义的地方是 SecureRandom
。
关于java - SUN JCE/Oracle JCE 中的默认 RSA 填充,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21066902/