报错
java.security.NoSuchAlgorithmException: Provider BC does not provide SM4/ECB/PKCS5Padding
代码
import org.bouncycastle.jce.provider.BouncyCastleProvider;
public static final String ALGORITHM_NAME_ECB_PADDING = "SM4/ECB/PKCS5Padding";
Cipher cipher = Cipher.getInstance(ALGORITHM_NAME_ECB_PADDING, BouncyCastleProvider.PROVIDER_NAME);
解决
下载jar包
代码引入了
import org.bouncycastle.jce.provider.BouncyCastleProvider;
需要从这里下载链接: bcprov-jdk15on-1.61.jar
build.gradle需要引入
implementation files('src/main/lib/bcprov-jdk15on-1.61.jar')
打印BC版本号,会发现没有调用成功
double version = Security.getProvider(BouncyCastleProvider.PROVIDER_NAME).getVersion();
Log.i(TAG,"原有version="+version);
需要调用removeProvider方法后再调用addProvider
private Provider provider;
public Util() {
Log.d(TAG, "addProvider");
Security.removeProvider(BouncyCastleProvider.PROVIDER_NAME);
provider = new BouncyCastleProvider();
Security.addProvider(provider);
}
避免内存泄漏,复用provider
public String encode(String data) {
String result = null;
try {
Cipher cipher = Cipher.getInstance(ALGORITHM_NAME_ECB_PADDING, provider);
Key sm4Key = new SecretKeySpec(key.getBytes(), ALGORITHM_NAME);
cipher.init(Cipher.ENCRYPT_MODE, sm4Key);
byte[] bytes = cipher.doFinal(data.getBytes());
result = Base64.getEncoder().encodeToString(bytes);
} catch (Exception e) {
Log.e(TAG, "EncryptUtil.encode error ! " + e);
e.printStackTrace();
}
return result;
}