一、国密算法是什么?
国密算法,即国家密码局认定的国产密码算法,主要用于保护国家关键信息基础设施和商业领域的加密通信和数据安全。根据 2019年10月26日第十三届全国人民代表大会常务委员会第十四次会议通过的《中华人民共和国密码法》,国家对密码实行分类管理,密码分为核心密码、普通密码和商用密码
核心密码、普通密码用于保护国家秘密信息,核心密码保护信息的最高密级为绝密级,普通密码保护信息的最高密级为机密级。
核心密码、普通密码属于国家秘密。
商用密码用于保护不属于国家秘密的信息。公民、法人和其他组织可以依法使用商用密码保护网络与信息安全。
二、商用密码的分类
以下国密算法都是应用于商用密码,核心密码和普通密码属于国家秘密,不公开
主要有:SM1、SM2、SM3、SM4、SM7、SM9、祖冲之密码(ZUC)
- 对称加密算法:国密算法中的对称加密算法包括SM1、SM4、SM7、祖冲之密码(ZUC)等。这些算法使用相同的密钥进行加密和解密,适用于大量数据的高效加密和解密。
- 非对称加密算法:国密算法中的非对称加密算法包括SM2和SM9。这些算法使用公钥和私钥进行加密和解密,提供了更高的安全性和数字签名功能。
- 杂凑算法:国密算法中的杂凑算法包括SM3。杂凑算法用于将任意长度的输入数据转换为固定长度的输出值,常用于验证数据的完整性和生成摘要。
- 密钥交换协议:国密算法中的密钥交换协议包括SM2 Key Exchange和SM9 Key Exchange。这些协议用于在通信双方之间安全地交换密钥,以实现加密通信的会话密钥的建立。
- 数字签名算法:国密算法中的数字签名算法包括SM2和SM9。这些算法用于验证数据的真实性和完整性,并确保签名的不可伪造。
最常用的算法是SM2(非对称)、SM3(摘要)、SM4(对称),用于替换掉国际上常用的 RSA,MD5,AES,DES 等加密算法,实现算法的自主可控。
以上算法,除了SM1、SM7算法未公开以外,这两种主要通过加密芯片,外部需要通过其提供的接口调用,其余已公开,在商用密码检测中心可以下载到源码。
三、国密算法的使用
各种国密算法,已经有非常成熟的轮子了,根本无需自己动手,我们只需要调用即可。下面以hutool为例,如果还不知道 hutool 的话,出门左拐,打开百度
- 打开hutool文档,文档写的是非常非常详细了
- 引入依赖
<dependency> <groupId>org.bouncycastle</groupId> <artifactId>bcprov-jdk15to18</artifactId> <version>1.69</version> </dependency>
- 注意这里 jdk15to18 的意思不是 jdk 15 ,而是1.5-1.8
以下是maven中央仓库的描述
Overview The Bouncy Castle Crypto package is a Java implementation of cryptographic algorithms. This jar contains JCE provider and lightweight API for the Bouncy Castle Cryptography APIs for JDK 1.5 to JDK 1.8. Bouncy Castle Crypto包是加密算法的Java实现。此 jar 包含 JCE 提供程序和轻量级 API,用于 JDK 1.5 到 JDK 1.8 的 Bouncy Castle Cryptography API。
- 开始调用
SM2 是非对称加密,类似国际上的RSA算法,使用公钥加密,私钥解密
当使用无参的构造函数时,默认使用随机生成的密钥对
- 也可以使用自定义的密钥对
String text = "我是一段测试aaaa"; KeyPair pair = SecureUtil.generateKeyPair("SM2"); byte[] privateKey = pair.getPrivate().getEncoded(); byte[] publicKey = pair.getPublic().getEncoded(); SM2 sm2 = SmUtil.sm2(privateKey, publicKey); // 公钥加密,私钥解密 String encryptStr = sm2.encryptBcd(text, KeyType.PublicKey); String decryptStr = StrUtil.utf8Str(sm2.decryptFromBcd(encryptStr, KeyType.PrivateKey));
- 签名和验签
String content = "我是Hanley."; final SM2 sm2 = SmUtil.sm2(); String sign = sm2.signHex(HexUtil.encodeHexStr(content)); // true boolean verify = sm2.verifyHex(HexUtil.encodeHexStr(content), sign);
- 当然,也可以使用自定义的密钥对来验签。
- SM3 是散列函数,类似于国际上的MD5,SHA,SHA256等,加密后不可逆,一般用于密码的存储,数字签名的验证等
//结果为:136ce3c86e4ed909b76082055a61586af20b4dab674732ebd4b599eef080c9be String digestHex = SmUtil.sm3("aaaaa");
- SM4是对称加密,类似于国际上的AES、DES等
String content = "test中文"; SymmetricCrypto sm4 = SmUtil.sm4(); String encryptHex = sm4.encryptHex(content); String decryptStr = sm4.decryptStr(encryptHex, CharsetUtil.CHARSET_UTF_8);