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

标签 java cryptography jce

你能帮我指出默认的 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/

相关文章:

java - 引用 Java 中特定父类(super class)的任何子类

java - 为什么默认情况下不包含 JCE Unlimited Strength?

ssl - 非RSA TLS1.2数据包解密

php - 我创建了一个伪随机生成器,它对密码学安全吗?

java - 在 JAVA 中检查加密 key 的正确性

Java 出现错误 'Unhandled exception type XYZ'

java - 使用 websocket javascript 客户端发送文件

javascript - Angular2/Spring Boot 允许在 PUT 上跨源

java - Spring Batch Json 自定义 ItemWriter

.net - .Net 和 iPhone 之间的三重 DES 互操作性?