最近在使用java编写SM4加密遇到报错:java.security.NoSuchProviderException: No such provider: BC

at javax.crypto.Cipher.getInstance(Cipher.java:592)

问题分析

经过Debug发现当执行代码Cipher cipher = Cipher.getInstance(“SM4/GCM/NoPadding”, BouncyCastleProvider.PROVIDER_NAME);时抛出上述错误。从错误提示看,是缺少BC这个provider所致。

解决办法:

首先确保已经引入bcprov-jdk15on包,maven添加配置

1
2
3
4
5
<dependency>
    <groupId>org.bouncycastle</groupId>
    <artifactId>bcprov-jdk15on</artifactId>
    <version>1.68</version>
</dependency>

其次,更关键的是补充执行添加BC这个Provider的代码,在执行Cipher.getInstance的时机之前执行即可,通常我们在某个相关类添加一段静态代码,代码如下:

1
2
3
static {
    Security.addProvider(new org.bouncycastle.jce.provider.BouncyCastleProvider());
}