最近迁移国密算法,遇到了一些问题,原本算法已经调通过了。突然有一天不好用了。。
报错:
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 国密SM4CBC加解密 导致okhttp报错:No System TLS / BKS not found:https://maomao.ink/index.php/IT/1778.html
时找到的这个问题的根本原因。
原因是:Android自带了“BouncyCastle”的Provider,名叫“BC”,版本是1.61。这个自带的BC库版本Android做了删减,去掉了 SM4/CBC/PKCS5Padding
填充的支持。
我用的BC库版本是1.58,里面支持SM4/CBC/PKCS5Padding
填充。所以,需要先删除系统的“BC”Provider,再添加,才能将我的1.58版本的BC Provider替换掉系统的。否则直接添加是加不进去的,因为已经存在相同名字的Provider。
仅有一条评论