国密算法 国密加密 国密SM2 SM3

Java国密算法 Java国密加密 Java国密SM2 Java国密SM3

写在前面

随着国际安全形势的变化(主要是美丽国的变化),国家越来越重视信息安全,信创产品在加密要求方面,基本上都要求使用国密加密。

国密即国家密码局认定的国产密码算法。主要有 SM1,SM2,SM3,SM4。密钥长度和分组长度均为 128 位。

下面介绍一下国密Java的使用。Java hutool工具集已经集成了国密,下面以此工具为例。

依赖

<dependency>
     <groupId>cn.hutool</groupId>
     <artifactId>hutool-all</artifactId>
     <version>5.8.25</version>
 </dependency>

 <dependency>
     <groupId>org.bouncycastle</groupId>
     <artifactId>bcprov-jdk15on</artifactId>
     <version>1.68</version>
 </dependency>

国密SM1

SM1 为对称加密,其加密强度与 AES 相当。该算法不公开,需要通过加密芯片的接口调用该算法,依赖硬件的加密方式普通场景不会用到。此处跳过。

国密SM2

SM2 为非对称加密,使用一对公钥、私钥,用公钥加密私钥解密,私钥签名公钥验签,防抵赖,适合对安全要求比较高的场景。

基于 ECC 算法,签名速度与秘钥生成速度都快于 RSA。ECC 256位(SM2 采用的就是 ECC 256 位的一种)安全强度比 RSA 2048 位高,但运算速度快于RSA。

SM2 加密需要密钥,需要生成公钥、私钥密钥对,保存下来,初始化 SM2 时需要用到。

KeyPair pair = SecureUtil.generateKeyPair("SM2");
byte[] privateKey = pair.getPrivate().getEncoded();
byte[] publicKey = pair.getPublic().getEncoded();
String q = HexUtil.encodeHexStr(((BCECPublicKey)pair.getPublic()).getQ().getEncoded(false));
String priStr = HexUtil.encodeHexStr(privateKey);
String pubStr = HexUtil.encodeHexStr(publicKey);
System.out.println(q);
// 308193020100301306072a8648ce3d020106082a811ccf5501822d047930770201010420a9ef64215acbea0e6509ab3b9ff08afb8ec5f135970e414d4756ddff9ec799baa00a06082a811ccf5501822da14403420004c276a533a23eb6f8d242a8fd0c44a581ae5695715981241058a1c030e700fe11e8d3197197e91b1c674c331c5e2c34ac111f10a416e4680c84235be0520ac880
System.out.println(priStr);
// 3059301306072a8648ce3d020106082a811ccf5501822d03420004c276a533a23eb6f8d242a8fd0c44a581ae5695715981241058a1c030e700fe11e8d3197197e91b1c674c331c5e2c34ac111f10a416e4680c84235be0520ac880
System.out.println(pubStr);

使用国密 SM2 加密:

String priKey = "308193020100301306072a8648ce3d020106082a811ccf5501822d047930770201010420a9ef64215acbea0e6509ab3b9ff08afb8ec5f135970e414d4756ddff9ec799baa00a06082a811ccf5501822da14403420004c276a533a23eb6f8d242a8fd0c44a581ae5695715981241058a1c030e700fe11e8d3197197e91b1c674c331c5e2c34ac111f10a416e4680c84235be0520ac880";
String pubKey = "3059301306072a8648ce3d020106082a811ccf5501822d03420004c276a533a23eb6f8d242a8fd0c44a581ae5695715981241058a1c030e700fe11e8d3197197e91b1c674c331c5e2c34ac111f10a416e4680c84235be0520ac880";
byte[] bytesPri = HexUtil.decodeHex(priKey);
byte[] bytesPub = HexUtil.decodeHex(pubKey);
SM2 sm2 = SmUtil.sm2(bytesPri, bytesPub);
String email = "18812345678@18812345678.abcdefjhijk";
// 0471783c82ed0db84f77add1352262f7ecc81caf8f61c173955ea4f34559079f1563520a3ee59bcde242a13803a670ccd0efa75c1507fa972f0d336d38bf0d88a54d5c3ac9994064a6062815a66ebc8608c2805db55bf1146845d032a9697ebaaf15e899f61e1284632d8e7de0ea1f66b1d382
System.out.println("email sm2:" + sm2.encryptHex(email, KeyType.PublicKey));
// 18812345678@18812345678.abcdefjhijk
String emailDec = sm2.decryptStr(emailEnc, KeyType.PrivateKey);
System.out.println("email sm2:" + emailDec);

国密SM3

SM3 消息摘要算法(杂凑算法)。类似 MD5、hash算法,校验结果为 256 位。摘要信息无法还原到原始数据,适用于信息、文件完整性校验。

// b1b70878851ee44d70e51b4a5b802147387a781a3bc2b90e0b2313ff392e830d固定长度(每次都一样)
System.out.println("证件sm3:" + SmUtil.sm3("110101200001011234"));

国密 SM4

SM4 属于对称加密,无线局域网标准的分组数据算法,密钥长度和分组长度均为128位。
加密解密使用同一密钥,所以密钥保存尤为重要,适用于计算量小效率高的加密场景。

SM4 属于对称加密,无线局域网标准的分组数据算法,密钥长度和分组长度均为128位。加密解密使用同一密钥,所以密钥保存尤为重要,适用于计算量小效率高的加密场景。

byte[] sm4Key = new byte[16];
for (int i = 0; i < 16; i++) {
	sm4Key[i] = (byte) i;
}
String emailSm4 = SmUtil.sm4(sm4Key).encryptHex(email);
// aabb033e7c3a65ae803be72752f4fff803a8d16d89ca11611d062899b6ad169837216c3a6a713432bb2a3c765c2d26e3
System.out.println("email SM4:" + emailSm4);
String emailSm4Dec = SmUtil.sm4(sm4Key).decryptStr(emailSm4);
// 18812345678@18812345678.abcdefjhijk
System.out.println("email SM4Dec:" + emailSm4Dec);

国密和其他加密算法对比

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值