国密算法及简单使用

本文涉及的产品
密钥管理服务KMS,1000个密钥,100个凭据,1个月
简介: 国密算法,即国家密码局认定的国产密码算法,主要用于保护国家关键信息基础设施和商业领域的加密通信和数据安全。根据 2019年10月26日第十三届全国人民代表大会常务委员会第十四次会议通过的《中华人民共和国密码法》,国家对密码实行分类管理,密码分为核心密码、普通密码和商用密码

一、国密算法是什么?


国密算法,即国家密码局认定的国产密码算法,主要用于保护国家关键信息基础设施和商业领域的加密通信和数据安全。根据 2019年10月26日第十三届全国人民代表大会常务委员会第十四次会议通过的《中华人民共和国密码法》,国家对密码实行分类管理,密码分为核心密码普通密码商用密码

核心密码、普通密码用于保护国家秘密信息,核心密码保护信息的最高密级为绝密级,普通密码保护信息的最高密级为机密级。

核心密码、普通密码属于国家秘密。

商用密码用于保护不属于国家秘密的信息。公民、法人和其他组织可以依法使用商用密码保护网络与信息安全。


二、商用密码的分类


以下国密算法都是应用于商用密码,核心密码和普通密码属于国家秘密,不公开

主要有:SM1SM2SM3SM4SM7SM9祖冲之密码(ZUC

  1. 对称加密算法:国密算法中的对称加密算法包括SM1SM4SM7、祖冲之密码(ZUC)等。这些算法使用相同的密钥进行加密和解密,适用于大量数据的高效加密和解密。
  2. 非对称加密算法:国密算法中的非对称加密算法包括SM2SM9。这些算法使用公钥和私钥进行加密和解密,提供了更高的安全性和数字签名功能。
  3. 杂凑算法:国密算法中的杂凑算法包括SM3。杂凑算法用于将任意长度的输入数据转换为固定长度的输出值,常用于验证数据的完整性和生成摘要。
  4. 密钥交换协议:国密算法中的密钥交换协议包括SM2 Key Exchange和SM9 Key Exchange。这些协议用于在通信双方之间安全地交换密钥,以实现加密通信的会话密钥的建立。
  5. 数字签名算法:国密算法中的数字签名算法包括SM2SM9。这些算法用于验证数据的真实性和完整性,并确保签名的不可伪造。

最常用的算法是SM2(非对称)、SM3(摘要)、SM4(对称),用于替换掉国际上常用的 RSA,MD5,AES,DES 等加密算法,实现算法的自主可控。

以上算法,除了SM1、SM7算法未公开以外,这两种主要通过加密芯片,外部需要通过其提供的接口调用,其余已公开,在商用密码检测中心可以下载到源码。


三、国密算法的使用


各种国密算法,已经有非常成熟的轮子了,根本无需自己动手,我们只需要调用即可。下面以hutool为例,如果还不知道 hutool 的话,出门左拐,打开百度

  1. 打开hutool文档,文档写的是非常非常详细了
  2. 引入依赖


<dependency>
  <groupId>org.bouncycastle</groupId>
  <artifactId>bcprov-jdk15to18</artifactId>
  <version>1.69</version>
</dependency>
  1. 注意这里 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。
  1. 开始调用
    SM2 是非对称加密,类似国际上的RSA算法,使用公钥加密,私钥解密
    当使用无参的构造函数时,默认使用随机生成的密钥对


  


         
  1. 也可以使用自定义的密钥对


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));
  1. 签名和验签


String content = "我是Hanley.";
final SM2 sm2 = SmUtil.sm2();
String sign = sm2.signHex(HexUtil.encodeHexStr(content));
// true
boolean verify = sm2.verifyHex(HexUtil.encodeHexStr(content), sign);
  1. 当然,也可以使用自定义的密钥对来验签。
  2. SM3 是散列函数,类似于国际上的MD5,SHA,SHA256等,加密后不可逆,一般用于密码的存储,数字签名的验证等


//结果为:136ce3c86e4ed909b76082055a61586af20b4dab674732ebd4b599eef080c9be
String digestHex = SmUtil.sm3("aaaaa");
  1. SM4是对称加密,类似于国际上的AES、DES等


String content = "test中文";
SymmetricCrypto sm4 = SmUtil.sm4();
String encryptHex = sm4.encryptHex(content);
String decryptStr = sm4.decryptStr(encryptHex, CharsetUtil.CHARSET_UTF_8);


目录
相关文章
|
6月前
|
存储 弹性计算 算法
倚天产品介绍|倚天ECS加速国密算法性能
倚天ECS是阿里云基于平头哥自研数据中心芯片倚天710推出arm架构实例,采用armv9架构,支持SM3/SM4指令,可以加速国密算法性能。本文基于OpenSSL 3.2和Tongsuo 实测对比了倚天ECS g8y实例和Intel g7 实例国密性能。为用户选择ECS提供参考。
|
6月前
|
算法 安全 Java
性能工具之 JMeter 自定义 Java Sampler 支持国密 SM2 算法
【4月更文挑战第28天】性能工具之 JMeter 自定义 Java Sampler 支持国密 SM2 算法
222 1
性能工具之 JMeter 自定义 Java Sampler 支持国密 SM2 算法
|
2月前
|
存储 算法 安全
超级好用的C++实用库之国密sm4算法
超级好用的C++实用库之国密sm4算法
55 0
|
6月前
|
算法 安全 数据处理
【国密算法】深入理解国密算法:原理、实践及注意事项
【国密算法】深入理解国密算法:原理、实践及注意事项
|
6月前
|
算法 安全 物联网
【国密算法】理解国密算法的基础概念
【国密算法】理解国密算法的基础概念
|
6月前
|
存储 算法 安全
【国密算法】国密算法在Java中的实践
【国密算法】国密算法在Java中的实践
|
6月前
|
算法 安全 网络安全
即时通讯安全篇(十三):信创必学,一文读懂什么是国密算法
本文将尽量以通俗易懂的文字,为你分享国密算法的种类、技术原理和应用场景等。
1038 0
|
存储 弹性计算 算法
倚天ECS加速国密算法性能
倚天ECS是阿里云基于平头哥自研数据中心芯片倚天710推出arm架构实例,采用armv9架构,支持SM3/SM4指令,可以加速国密算法性能。本文基于OpenSSL 3.2和Tongsuo 实测对比了倚天ECS g8y实例和Intel g7 实例国密性能。为用户选择ECS提供参考。
|
存储 算法 安全
成方金科“基于国密算法”TPRE贡献于隐语开源社区
成方金科“基于国密算法”TPRE贡献于隐语开源社区
355 0
|
24天前
|
算法 安全 数据安全/隐私保护
基于game-based算法的动态频谱访问matlab仿真
本算法展示了在认知无线电网络中,通过游戏理论优化动态频谱访问,提高频谱利用率和物理层安全性。程序运行效果包括负载因子、传输功率、信噪比对用户效用和保密率的影响分析。软件版本:Matlab 2022a。完整代码包含详细中文注释和操作视频。