java.security.NoSuchAlgorithmException: No such algorithm: SM4/ECB/PKCS5Padding

java.security.NoSuchAlgorithmException: No such algorithm: SM4/ECB/PKCS5Padding

出现这个问题的原因

1、没有引入合适的jar包

目前了解到的最低适用版本是1.59,所以需要使用1.59及以上的版本

		<dependency>
            <groupId>org.bouncycastle</groupId>
            <artifactId>bcprov-jdk15on</artifactId>
            <version>1.59</version>
        </dependency>

2、没有添加当前算法

解决办法:添加下面的代码

	static {
        Security.addProvider(new BouncyCastleProvider());
    }

这一行代码调用了 Security 类的 addProvider 方法,将一个新的 BouncyCastleProvider 实例添加到 Java 安全提供者列表中

3、项目中存在多个版本的jar包

使用BouncyCastleProvider 关键词搜索一下,看下整个项目是否存在多个版本的org.bouncycastle jar包
或者使用下面的语句打印一下当前的jar包版本

		if (Security.getProvider(BouncyCastleProvider.PROVIDER_NAME) != null) {
            double version = Security.getProvider(BouncyCastleProvider.PROVIDER_NAME).getVersion();
            log.info("sys原有version:{}", version);
        }

如果存在多个版本的jar包,且为maven多子模块结构的话

解决办法:

1、排除掉低版本的jar包,在父pom文件中统一
2、在子模块中单独引入合适版本的org.bouncycastle jar包

扩展思维

对于找不到类的这类报错,都可以使用上面第三点的思路,查看是否存在多个版本的jar包,针对于某些类,引入的低版本jar包可能不包含该类,这个时候就需要在父pom文件中将jar包统一,或者在需要用到的子模块pom中单独引入合适的版本,不过推荐统一jar包版本方便后续扩展和开发

### 关于Java JAR包在Windows上启动时报`NoSuchAlgorithmException`异常的问题 当遇到`java.security.NoSuchAlgorithmException: No such algorithm: RSA/ECB/PKCS1Padding`错误时,这通常意味着请求的安全算法未被JCE(Java Cryptography Extension)识别或支持[^1]。 对于指定的SM4 ECB PKCS5Padding模式,在确保使用的加密库确实实现了该算法的同时,还需要确认安全策略文件允许使用此算法。如果是在较新的Java版本中运行旧版应用程序,则可能需要安装不受限强度的Jurisdiction Policy Files来扩展默认权限范围。 另外一种常见情况是由于拼写错误或是不兼容的参数组合引起的。例如,“RSA/ECB/PKCS1Padding”的表述方式并不适用于所有环境;而针对SM4应采用类似于“SM4/ECB/PKCS5Padding”的形式。因此建议仔细核对所使用的具体算法名称及其变体是否正确无误。 为了验证并解决问题: - 检查当前环境中已加载的所有提供者列表以及它们所提供的服务,可以通过如下代码片段实现: ```java import java.security.Provider; import java.security.Security; public class ListProviders { public static void main(String[] args) { for (Provider provider : Security.getProviders()) { System.out.println(provider.getName() + ":\n" + provider.toString()); } } } ``` - 如果发现缺少必要的提供者或者其注册失败,则需进一步排查类路径设置、依赖项冲突等问题。 - 对于某些特定场景下无法找到所需算法的情况,可以尝试引入第三方库如BouncyCastle作为补充选项,并通过调用`Security.addProvider(new BouncyCastleProvider());`将其加入到全局可用的服务提供商之中。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值