介绍
国密即国家密码局认定的国产密码算法。主要有 SM1、SM2、SM3、SM4几类,种类在不断完善和增长。
SM1
SM1 为对称加密,该算法的算法实现原理没有公开,他的加密强度和 AES 相当,需要调用加密芯片的接口进行使用。此算法为软硬一体,若需要使用此算法,需要特殊的计算机CPU芯片配合。
SM2
国密 SM2 为非对称加密,基于ECC算法实现,其签名速度和密钥生成速度均快于RSA算法。
JAVA实现SM2案例,新建SpringBoot应用程序,增加以下依赖
<!-- hutool -->
<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-all</artifactId>
<version>5.7.11</version>
</dependency>
<!-- 国密算法支持,hutool的国密工具类依赖此 -->
<dependency>
<groupId>org.bouncycastle</groupId>
<artifactId>bcprov-jdk15on</artifactId>
<version>1.68</version>
</dependency>
新建测试类,增加以下方法
@GetMapping("/test")
public String test() {
//明文
String text = "我是一段测试aaaa";
log.debug("content is :{}", text);
//生成公私钥
KeyPair pair = SecureUtil.generateKeyPair("SM2");
byte[] privateKey = pair.getPrivate().getEncoded();
byte[] publicKey = pair.getPublic().getEncoded();
//根据公私钥初始化一个SM2对象
SM2 sm2 = SmUtil.sm2(privateKey, publicKey);
// 公钥加密
String encryptStr = sm2.encryptBcd(text, KeyType.PublicKey);
log.debug("encryptText with publicKey is :{}", encryptStr);
//私钥解密
String decryptStr = StrUtil.utf8Str(sm2.decryptFromBcd(encryptStr, KeyType.PrivateKey));
log.debug("decryptText with privateKey is :{}", decryptStr);
return "ok";
}
配置文件设置日志级别为debug
SM3
SM3为杂凑算法,即摘要算法,是不可逆算法的一种,类似MD5,安全性比MD5还要高。
SM4
SM4为无线局域网标准的分组数据算法,为对称加密算法。
JAVA实现SM4案例,新建SpringBoot应用程序,增加以下依赖
<!-- hutool -->
<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-all</artifactId>
<version>5.7.11</version>
</dependency>
<!-- 国密算法支持,hutool的国密工具类依赖此 -->
<dependency>
<groupId>org.bouncycastle</groupId>
<artifactId>bcprov-jdk15on</artifactId>
<version>1.68</version>
</dependency>
新建测试类,增加以下方法
@GetMapping("/sm4")
public String sm4() {
String content = "test中文";
log.debug("content is :{}", content);
//密钥必须为16个字符。JAVA中字符占1字节,SM4要求密钥为 128 bit , 即16字节。
String key = "123456789-123456";
log.debug("key is :{}", key);
byte[] secretKey = key.getBytes(CharsetUtil.CHARSET_UTF_8);
SM4 sm41 = new SM4(secretKey);
String encryptHex = sm41.encryptHex(content, CharsetUtil.CHARSET_UTF_8);
log.debug("encryptText is :{}", encryptHex);
String decryptStr = sm41.decryptStr(encryptHex, CharsetUtil.CHARSET_UTF_8);
log.debug("decryptText is :{}", decryptStr);
return "ok";
}
引用
国家密码局标准规范查询网址:http://www.oscca.gov.cn/app-zxfw/zxfw/bzgfcx.jsp
http://www.wenwoha.com/blog_detail-6.html
bouncycastle介绍:https://www.liaoxuefeng.com/wiki/1252599548343744/1305362418368545
hutool对于国密的支持:https://www.hutool.cn/docs/#/crypto/%E5%9B%BD%E5%AF%86%E7%AE%97%E6%B3%95%E5%B7%A5%E5%85%B7-SmUtil?id=%e4%bb%8b%e7%bb%8d