我在
javax.crypto
中使用RSA加密时遇到了一个奇怪的问题。
我正在使用
RSA/None/OAEPWITHSHA-256ANDMGF1PADDING
模式如下...
Cipher cipher = Cipher.getInstance("RSA/None/OAEPWITHSHA-256ANDMGF1PADDING");
...它在我的 Spring Boot 项目中工作正常。
但是当我在同一个项目中通过
main(String[] args)
调用相同的函数时,我遇到了问题:
Cannot find any provider supporting RSA/None/OAEPWITHSHA-256ANDMGF1PADDING
再次强调:如果我使用
RSA/ECB/OAEPWITHSHA-256ANDMGF1PADDING
我会得到正确的输出! (我不想使用 ECB,因为我知道它在 RSA 算法中没有用)。
此外,在我的另一个 Spring Boot 项目中,我也遇到了上述相同的问题(这次不仅是
main(String[] args)
,而且在 Spring Boot 项目本身中也是如此)。
有人可以帮我吗?
基本上,由
"RSA/ECB/OAEPWITHSHA-256ANDMGF1PADDING"
提供商提供的 "SunJCE"
中的 ECB 是用词不当。它可能是从旧 Java 版本中的分组密码模式复制而来的。它不允许加密多个块,这正是您对 ECB 模式所期望的。换句话说,它与 "RSA/None/OAEPWITHSHA-256ANDMGF1PADDING"
完全相同 - 但 Java SE 通常不接受该算法名称。
它在 Spring Boot 项目中没有失败的原因是它可能包含 Bouncy Castle 提供程序(或在其中注册带有
none
的算法名称的另一个提供程序)。然而,Bouncy Castle 是一家“纯软件”提供商,存在侧通道保护问题。一般来说,您应该更喜欢在"SunJCE"
内实现。仅使用 "RSA/ECB/OAEPWITHSHA-256ANDMGF1PADDING"
而不明确指定提供者是最好的方法。
[编辑] 我强烈建议使用OAEPParameterSpec
和
MGF1ParameterSpec
明确设置用于标签和 MGF1 的 SHA-256 哈希值。不幸的是,Java 可能默认使用 SHA-1,并为标签使用相同的哈希函数,并且 MGF1 是最兼容的选项。Security.addProvider(new org.bouncycastle.jce.provider.BouncyCastleProvider())
。所以看来我们需要使用重载构造函数
Cipher cipher = Cipher.getInstance("RSA/None/OAEPWITHSHA-256ANDMGF1PADDING", provider);