最近迁移国密算法,遇到了一些问题,原本算法已经调通过了。突然有一天不好用了。。

报错:

java.security.NoSuchAlgorithmException:Provider BC does not provide SM4/ECB/PKCS5Padding

java.security.NoSuchAlgorithmException:Provider BC does not provide SM4/CBC/PKCS5Padding

网上说是java后台传的参数BouncyCastleProvider.PROVIDER_NAME,在Android里面不能用。

也有说是版本问题。

可以参考:
用方法打印版本号:Security.getProvider(BouncyCastleProvider.PROVIDER_NAME).getVersion()
看看是不是跟导入的jar包版本不一致,

解决方法:在

    Cipher cipher = Cipher.getInstance(algorithmName, BouncyCastleProvider.PROVIDER_NAME);

之前添加下面两行代码:
Security.removeProvider(BouncyCastleProvider.PROVIDER_NAME);
Security.addProvider(new BouncyCastleProvider());

如下:

        Security.removeProvider(BouncyCastleProvider.PROVIDER_NAME);
        Security.addProvider(new BouncyCastleProvider());
        Cipher cipher = Cipher.getInstance(algorithmName, BouncyCastleProvider.PROVIDER_NAME);

再次运行,查看是否还有报错。

(补充)

问题根本原因

之后再解决另一个问题

时找到的这个问题的根本原因。

原因是:Android自带了“BouncyCastle”的Provider,名叫“BC”,版本是1.61。这个自带的BC库版本Android做了删减,去掉了 SM4/CBC/PKCS5Padding填充的支持。

我用的BC库版本是1.58,里面支持SM4/CBC/PKCS5Padding填充。所以,需要先删除系统的“BC”Provider,再添加,才能将我的1.58版本的BC Provider替换掉系统的。否则直接添加是加不进去的,因为已经存在相同名字的Provider。