你能帮我指出什么是默认的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
在我看来,唯一一个平台默认有意义的地方.