问题:
在android 10中运行程序时代码KeyFactory keyFactory = KeyFactory.getInstance("RSA", "BC");会报错提示The BC provider no longer provides an implementation for KeyFactory.RSA.
原因:
1.Provider被更改。在Android P或更高版本上,调用Cipher.getInstance("AES/CBC/PKCS7PADDING", "BC")
或者Cipher.getInstance("AES/CBC/PKCS7PADDING", Security.getProvider("BC"))
会报错NoSuchAlgorithmException
,
原因是Google将弃用AndroidOpenSSL(也称为Conscrypt)提供程序复制的BC提供程序中的某些功能。
2.删除加密提供程序。也就是从P开始,Crypto提供程序就不要使用了,使用就要报错NoSuchAlgorithmException
Google也在文中说了解决办法,那就是
在P及以后的系统中使用默认的接口
解决:
原报错代码:
KeyFactory keyFactory = KeyFactory.getInstance("RSA", "BC");
根据Google的建议,修改代码如下:
KeyFactory keyFactory;
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) {
keyFactory = KeyFactory.getInstance("RSA"); //适配Android P及以后版本,否则报错NoSuchAlgorithmException
} else {
keyFactory = KeyFactory.getInstance("RSA", "BC");
}