Android使用国密,我们直接需要导入就搞定
implementation 'org.bouncycastle:bcpkix-jdk15to18:1.68'
implementation 'org.bouncycastle:bcprov-jdk15to18:1.68'
sm4为(原名SMS4)是中华人民共和国政府采用的一种分组密码标准,由国家密码管理局于2012年3月21日发布;
需要注意:
1:padding,填充
2:安卓系统,自带版本BouncyCastle
我主要就是这两个地方没注意!!!
第一个问题
填充,c/s两端需要协商好,有无填充,如果是默认的填充那无所谓。如果是无填充模式,那么请记得在你的Padding设置为无填充。
例如CBC模式
private static final String ALGORITHM_CBC_NOPADDING = "SM4/CBC/NOPadding";
第二个问题
自带版本BouncyCastle
在应用启动的时候,已经有了一个自带版本的BCprovider被自动add进当前系统,需要先移除再加入我们的版本
这个时候需要先检查下,并且清除下本地的。代码如下:
static {
if (Security.getProvider(BouncyCastleProvider.PROVIDER_NAME) != null) {
double version = Security.getProvider(BouncyCastleProvider.PROVIDER_NAME).getVersion();
Log.i("Sm4", "原有version=" + version);
Security.removeProvider(BouncyCastleProvider.PROVIDER_NAME);
}
if (Security.getProvider(BouncyCastleProvider.PROVIDER_NAME) == null) {
Log.i("Sm4", "运行环境没有BouncyCastleProvider");
Security.addProvider(new BouncyCastleProvider());
double version = Security.getProvider(BouncyCastleProvider.PROVIDER_NAME).getVersion();
Log.i("Sm4", "现有version=" + version);
}
}
问题记录完毕;下次就不会被搞死了~