我在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项目本身也是如此)。
有人能帮我吗?
2条答案
按热度按时间wfveoks01#
基本上,
"SunJCE"
提供商提供的"RSA/ECB/OAEPWITHSHA-256ANDMGF1PADDING"
中的ECB是一个误称。它可能是从旧Java版本中的块密码模式复制而来的。它不允许加密多个区块,这是您对ECB模式的期望。换句话说,它与"RSA/None/OAEPWITHSHA-256ANDMGF1PADDING"
完全相同,但Java SE通常不提供该算法。它在Sping Boot 项目中不会失败的原因是它可能包含Bouncy Castle提供程序(或提供此算法的其他提供程序)。然而,这是一个软件提供商,有侧通道保护问题。通常,您应该更喜欢在
"SunJCE"
提供程序中实现。只使用
"RSA/ECB/OAEPWITHSHA-256ANDMGF1PADDING"
而不显式指定提供程序是最好的方法。[编辑]我强烈建议使用
OAEPParameterSpec
和MGF1ParameterSpec
显式地设置SHA-256散列用于标签和MGF 1。不幸的是,Java可能默认使用SHA-1,并且使用完全相同的哈希函数是最兼容的选择。insrf1ej2#
当我遇到这个问题时,我能够通过指定提供程序(如
Security.addProvider(new org.bouncycastle.jce.provider.BouncyCastleProvider())
)来解决它。所以看来我们需要使用过载的电容器Cipher cipher = Cipher.getInstance("RSA/None/OAEPWITHSHA-256ANDMGF1PADDING", provider);