java 找不到任何支持RSA/None/OAEPWITHSHA-256 ANDMGF 1 PADDING的提供程序

c9qzyr3d  于 2023-04-28  发布在  Java
关注(0)|答案(2)|浏览(1409)

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

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

...而且它在我的Sping Boot 项目中工作正常。
但是当我在同一个项目中通过main(String[] args)调用同一个函数时,我遇到了这个问题:

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

同样:如果我使用RSA/ECB/OAEPWITHSHA-256ANDMGF1PADDING,我会得到正确的输出!(我不想使用ECB,因为我知道它在RSA算法中没有用处)。
此外,在我的另一个Sping Boot 项目中,我也遇到了同样的问题(这次不仅是main(String[] args),Spring Boot项目本身也是如此)。
有人能帮我吗?

wfveoks0

wfveoks01#

基本上,"SunJCE"提供商提供的"RSA/ECB/OAEPWITHSHA-256ANDMGF1PADDING"中的ECB是一个误称。它可能是从旧Java版本中的块密码模式复制而来的。它允许加密多个区块,这是您对ECB模式的期望。换句话说,它与"RSA/None/OAEPWITHSHA-256ANDMGF1PADDING"完全相同,但Java SE通常不提供该算法。
它在Sping Boot 项目中不会失败的原因是它可能包含Bouncy Castle提供程序(或提供此算法的其他提供程序)。然而,这是一个软件提供商,有侧通道保护问题。通常,您应该更喜欢在"SunJCE"提供程序中实现。
只使用"RSA/ECB/OAEPWITHSHA-256ANDMGF1PADDING"而不显式指定提供程序是最好的方法。
[编辑]我强烈建议使用OAEPParameterSpecMGF1ParameterSpec显式地设置SHA-256散列用于标签和MGF 1。不幸的是,Java可能默认使用SHA-1,并且使用完全相同的哈希函数是最兼容的选择。

insrf1ej

insrf1ej2#

当我遇到这个问题时,我能够通过指定提供程序(如Security.addProvider(new org.bouncycastle.jce.provider.BouncyCastleProvider()))来解决它。所以看来我们需要使用过载的电容器
Cipher cipher = Cipher.getInstance("RSA/None/OAEPWITHSHA-256ANDMGF1PADDING", provider);

相关问题