找不到任何支持 RSA/None/OAEPWITHSHA-256ANDMGF1PADDING 的提供商

Cannot find any provider supporting RSA/None/OAEPWITHSHA-256ANDMGF1PADDING

我在 javax crypto 中使用 RSA 加密时遇到了一个奇怪的问题。我使用 RSA/None/OAEPWITHSHA-256ANDMGF1PADDING 模式如下:

 Cipher cipher = Cipher.getInstance("RSA/None/OAEPWITHSHA-256ANDMGF1PADDING");

它在我的 spring 引导项目中正常工作。但是当我在同一个项目中通过 main(String[] args) 调用同一个函数时,我遇到了问题 Cannot find any provider supporting RSA/None/OAEPWITHSHA-256ANDMGF1PADDING。同样,如果我使用 RSA/ECB/OAEPWITHSHA-256ANDMGF1PADDING,我会得到正确的输出(我不想使用 ECB,因为我知道它在 RSA 算法中没有用)。

此外,在我的另一个 spring 引导项目中,我遇到了上述相同的问题(这次不仅是 main(String[] args),而且 Spring 引导项目本身也是如此)。

有人可以帮我解决这个问题吗?

基本上,"SunJCE" 提供商提供的 "RSA/ECB/OAEPWITHSHA-256ANDMGF1PADDING" 中的 ECB 用词不当。它可能是从旧 Java 版本的块密码模式复制而来的。它不允许 允许对多个块进行加密,这正是您对 ECB 模式 的期望。换句话说,它与 "RSA/None/OAEPWITHSHA-256ANDMGF1PADDING" 完全相同 - 但 Java SE 通常不提供该算法。

它在您的 Spring 引导项目中没有失败的原因是它可能包含 Bouncy Castle 提供程序(或提供此算法的其他提供程序)。然而,这是一个 纯软件 提供商,存在侧信道保护问题。一般来说,您应该更喜欢 "SunJCE" 提供程序中的实现。

只使用 "RSA/ECB/OAEPWITHSHA-256ANDMGF1PADDING" 而不明确指定提供商是最好的方法。


[编辑] 我强烈建议使用 OAEPParameterSpecMGF1ParameterSpec 明确设置用于标签和 MGF1 的 SHA-256 哈希。不幸的是,Java 可能默认为 SHA-1,并且在所有地方使用相同的散列函数是最兼容的选项。

当我遇到这个问题时,我可以通过像这样指定提供者来解决它 Security.addProvider(new org.bouncycastle.jce.provider.BouncyCastleProvider())。所以看来我们需要使用重载的consutructor

Cipher cipher = Cipher.getInstance("RSA/None/OAEPWITHSHA-256ANDMGF1PADDING", provider);