一文带你学习“国密算法”

本文涉及的产品
密钥管理服务KMS,1000个密钥,100个凭据,1个月
简介: 一文带你学习“国密算法”

博主介绍: ✌博主从事应用安全和大数据领域,有8年研发经验,5年面试官经验,Java技术专家✌

Java知识图谱点击链接:体系化学习Java(Java面试专题)

💕💕 感兴趣的同学可以收藏关注下不然下次找不到哟💕💕

1687654690579.jpg

1、国密算法分类

国密算法主要分为以下四类:

  1. 对称加密算法:SM1、SM4

  2. 非对称加密算法:SM2、SM9

  3. 杂凑算法:SM3

  4. 签名算法:SM2、SM3、SM4

其中,SM1 和 SM4 是对称加密算法,SM2 和 SM9 是非对称加密算法,SM3 是杂凑算法,SM2、SM3、SM4 是签名算法。这些算法都是由中国密码学专家团队自主研发的,被广泛应用于我国政府、军队、金融、电信等领域的信息安全保护中。

2、SM1 算法

SM1 算法是一种对称加密算法,也称为国密 SM1 算法,是中国密码学家自主研发的一种块加密算法,是国家密码管理局公布的商用密码算法标准之一。SM1 算法采用了分组密码体系结构,每个分组的长度为 128 比特,密钥长度为 128 比特,是一种轻量级的加密算法,适用于低功耗、低带宽、低存储等资源受限环境下的数据加密和保护。

SM1 算法的加密过程主要包括以下四个步骤:

  1. 密钥扩展:将输入的 128 比特密钥扩展为 32 个 32 比特的子密钥,用于后续的加密过程。

  2. 初始置换:将输入的明文按照一定的规则进行置换,生成新的分组。

  3. 轮函数:将上一轮生成的分组和当前轮的子密钥进行异或运算,并通过 S 盒和 P 盒进行置换和替换,生成新的分组。

  4. 逆置换:将最后一轮生成的分组按照一定的规则进行逆置换,得到最终的密文。
    SM1 算法的安全性得到了广泛认可,已被广泛应用于金融、电子政务、物联网等领域的数据加密和保护中。

    3、SM2 算法

    3.1、SM2 算法简介

    SM2 算法是中国密码学家自主设计的一种非对称加密算法,是国家商用密码算法,具有高效、安全、公开透明等特点。SM2 算法是基于椭圆曲线密码体制的一种公钥密码算法,用于数字签名、密钥协商和加密等场景。

SM2 算法的安全性基于椭圆曲线离散对数问题,其密钥长度为 256 位,比 RSA 算法的密钥长度短,但安全性更高。SM2 算法不仅具有高效、安全的特点,还具有公开透明、自主可控的特点,符合国家信息安全要求。

SM2 算法在数字签名、密钥协商和加密等场景中都有应用。在数字签名方面,SM2 算法支持国密标准的数字证书和证书链,可以用于保证电子文档的真实性和完整性;在密钥协商方面,SM2 算法可以用于安全地生成会话密钥,保障通信的机密性和完整性;在加密方面,SM2 算法可以用于保护敏感数据的机密性。

SM2 算法是一种高效、安全、公开透明的密码算法,具有自主可控的特点,是中国自主设计的一种重要的密码算法。

3.2、SM2 算法的原理

SM2算法是一种基于椭圆曲线密码学的公钥密码算法,是中国密码算法标准的一部分。SM2算法的实现原理如下:

  1. 椭圆曲线参数的选择:SM2算法使用的是一种特定的椭圆曲线,其参数由国家密码管理局(CMCA)和国家密码管理办公室(NSA)联合指定。这些参数包括曲线方程、基点坐标、模数等。
  2. 密钥生成:SM2算法的密钥对由公钥和私钥组成。公钥是由基点和私钥生成的,私钥是一个随机数。
  3. 数字签名:SM2算法的数字签名过程分为两步。第一步是计算消息的哈希值,第二步是使用私钥对哈希值进行签名。签名过程中还需要使用一些随机数和椭圆曲线运算。
  4. 验证数字签名:SM2算法的数字签名验证过程也分为两步。第一步是计算消息的哈希值,第二步是使用公钥对签名进行验证。验证过程中也需要使用一些随机数和椭圆曲线运算。
  5. 密钥交换:SM2算法的密钥交换过程使用了一种基于Diffie-Hellman密钥交换的协议,但是使用了椭圆曲线密码学的技术来保证安全性。

SM2算法的实现原理是基于椭圆曲线密码学的技术,使用了一些复杂的数学运算和协议来保证安全性和可靠性。由于SM2算法是一种非常安全和高效的公钥密码算法,已经被广泛应用于各种数字安全场景中。

3.3、SM2算法的安全性

SM2算法是一种基于椭圆曲线密码学的公钥密码算法,其安全性得到了广泛认可。下面是SM2算法的安全性特点:

  1. 安全强度高:SM2算法采用了一种特定的椭圆曲线,其模数长度为256位,远高于传统RSA算法的安全强度。这使得SM2算法能够抵御各种暴力破解和穷举攻击。
  2. 难以被破解:SM2算法使用了一些复杂的数学运算和协议,包括椭圆曲线点的加法、倍乘、离散对数等。这些运算难以被破解,使得SM2算法具有很高的安全性。
  3. 安全性可验证:SM2算法的安全性经过了严格的评估和验证,包括安全性证明、攻击模型分析、实现安全性等方面。这些验证保证了SM2算法的安全性和可靠性。
  4. 适用性广泛:SM2算法已经被广泛应用于各种数字安全场景中,包括数字签名、密钥交换、身份认证等。其安全性和可靠性得到了实践的检验。

SM2算法是一种非常安全和高效的公钥密码算法,其安全性得到了广泛认可和验证。在实际应用中,我们需要遵循相关的规范和标准,以确保SM2算法的安全性和可靠性。

3.4、SM2 算法 java 运用

用 java 实现如下:

package com.pany.camp.encryption;

import org.bouncycastle.crypto.AsymmetricCipherKeyPair;
import org.bouncycastle.crypto.CipherParameters;
import org.bouncycastle.crypto.CryptoException;
import org.bouncycastle.crypto.generators.ECKeyPairGenerator;
import org.bouncycastle.crypto.params.ECDomainParameters;
import org.bouncycastle.crypto.params.ECKeyGenerationParameters;
import org.bouncycastle.crypto.params.ParametersWithRandom;
import org.bouncycastle.crypto.signers.SM2Signer;
import org.bouncycastle.jce.ECNamedCurveTable;
import org.bouncycastle.jce.provider.BouncyCastleProvider;
import org.bouncycastle.jce.spec.ECNamedCurveParameterSpec;
import org.bouncycastle.util.encoders.Hex;

import java.security.SecureRandom;
import java.security.Security;

/**
 *
 * @description: SM2 算法
 * @copyright: @Copyright (c) 2022 
 * @company: Aiocloud
 * @author: pany
 * @version: 1.0.0 
 * @createTime: 2023-06-24 22:37
 */
public class SM2Example {
   
   
    public static void main(String[] args) throws CryptoException {
   
   
        Security.addProvider(new BouncyCastleProvider());

        // 生成密钥对
        AsymmetricCipherKeyPair keyPair = generateKeyPair();

        // 明文消息
        byte[] message = "Hello, SM2!".getBytes();
        // 签名消息
        byte[] signature = sign(message, keyPair.getPrivate());

        // 验证签名
        boolean verified = verify(message, signature, keyPair.getPublic());

        System.out.println("Message: " + new String(message));
        System.out.println("Signature: " + Hex.toHexString(signature));
        System.out.println("Verified: " + verified);
    }

    private static AsymmetricCipherKeyPair generateKeyPair() {
   
   
        // 创建ECDomainParameters对象
        ECNamedCurveParameterSpec spec = ECNamedCurveTable.getParameterSpec("secp256k1");
        ECDomainParameters domainParams = new ECDomainParameters(spec.getCurve(), spec.getG(), spec.getN(), spec.getH());

        // 定义密钥生成参数
        ECKeyGenerationParameters keyGenParams = new ECKeyGenerationParameters(
                domainParams, new SecureRandom());
        // 生成密钥对
        ECKeyPairGenerator keyPairGenerator = new ECKeyPairGenerator();
        keyPairGenerator.init(keyGenParams);
        return keyPairGenerator.generateKeyPair();
    }

    private static byte[] sign(byte[] message, CipherParameters privateKey) throws CryptoException {
   
   
        // 定义 SM2 签名器
        SM2Signer signer = new SM2Signer();
        // 初始化签名器
        signer.init(true, new ParametersWithRandom(privateKey, new SecureRandom()));
        // 计算签名
        signer.update(message, 0, message.length);
        return signer.generateSignature();
    }

    private static boolean verify(byte[] message, byte[] signature, CipherParameters publicKey) {
   
   
        // 定义 SM2 签名器
        SM2Signer signer = new SM2Signer();
        // 初始化签名器
        signer.init(false, publicKey);
        // 验证签名
        signer.update(message, 0, message.length);
        return signer.verifySignature(signature);
    }
}

4、SM3 算法

4.1、SM3 算法简介

SM3算法是中国密码学家设计的一种哈希算法,属于国密算法之一,是SHA-3算法的候选算法之一。SM3算法的设计目标是提供一个高安全性、高效率的哈希算法,适用于数字签名、认证和数据完整性校验等场景。SM3算法的设计和实现都经过了严格的安全评估和测试,已被广泛应用于政务、金融、电子商务等领域。

SM3算法的核心思想是基于Merkle-Damgård结构的迭代哈希算法,其输入和输出都是固定长度的二进制串。SM3算法的输入可以是任意长度的消息,经过填充、分组、迭代处理和输出处理等步骤,最终生成一个256位的哈希值。

SM3算法的安全性主要基于以下几个方面:

  1. 消息填充:SM3算法采用了与SHA-256相似的消息填充方式,能够有效地避免碰撞攻击和长度扩展攻击等攻击方式。
  2. 迭代处理:SM3算法采用了64轮的迭代处理,每轮都包括了多个基本运算,增加了攻击者的攻击难度。
  3. 置换、置换压缩和非线性函数:SM3算法采用了多种置换、置换压缩和非线性函数,增加了攻击者的攻击难度。

总体来说,SM3算法是一种高安全性、高效率的哈希算法,已被广泛应用于国内外各个领域,是中国自主研发的密码学算法之一。

4.2、SM3算法的原理

SM3算法是一种哈希函数,用于将任意长度的消息转换为固定长度的摘要。SM3算法的原理如下:

  1. 消息填充:SM3算法首先对输入的消息进行填充,使得消息长度满足一定的要求。填充过程包括添加一个1和若干个0,以及添加消息长度的二进制表示。
  2. 消息分组:填充后的消息被分成若干个固定长度的分组,每个分组的长度为512位。
  3. 初始值设置:SM3算法使用一些常量和随机数来初始化哈希值。这些常量和随机数由国家密码管理局(CMCA)和国家密码管理办公室(NSA)联合指定。
  4. 压缩函数:SM3算法使用一种特定的压缩函数来将每个分组与当前的哈希值进行混合。压缩函数包括若干轮迭代和一些逻辑运算,以保证哈希值的混淆性和扩散性。
  5. 最终处理:所有分组处理完后,将最终的哈希值输出作为消息的摘要。

SM3算法的原理是基于分组密码和哈希函数的技术,使用了一些复杂的数学运算和协议来保证安全性和可靠性。由于SM3算法具有很高的安全性和可靠性,已经被广泛应用于各种数字安全场景中,如数字签名、消息认证等。

4.3、SM3算法的安全性

SM3算法是一种哈希函数,其安全性得到了广泛认可。下面是SM3算法的安全性特点:

  1. 抗碰撞:SM3算法能够将任意长度的消息转换为固定长度的摘要,且不同的消息产生相同摘要的概率极小,因此SM3算法具有很高的抗碰撞能力。
  2. 抗预像攻击:SM3算法能够在不知道摘要原始消息的情况下,难以找到与摘要相对应的原始消息,因此具有很高的抗预像攻击能力。
  3. 抗第二原像攻击:SM3算法能够在已知一条消息的摘要的情况下,难以找到另一条消息,使得它们的摘要相同,因此具有很高的抗第二原像攻击能力。
  4. 安全性可验证:SM3算法的安全性经过了严格的评估和验证,包括安全性证明、攻击模型分析、实现安全性等方面。这些验证保证了SM3算法的安全性和可靠性。

SM3算法是一种非常安全和高效的哈希函数,其安全性得到了广泛认可和验证。在实际应用中,我们需要遵循相关的规范和标准,以确保SM3算法的安全性和可靠性。

4.4、SM3 算法 java 运用

用 java 实现如下:

package com.pany.camp.encryption;

import org.bouncycastle.crypto.digests.SM3Digest;
import org.bouncycastle.util.encoders.Hex;

/**
 *
 * @description:  SM3算法
 * @copyright: @Copyright (c) 2022 
 * @company: Aiocloud
 * @author: pany
 * @version: 1.0.0 
 * @createTime: 2023-06-24 22:55
 */
public class SM3Example {
   
   

    public static String encrypt(String str) {
   
   
        byte[] bytes = str.getBytes();
        byte[] result = new byte[32];
        SM3Digest sm3 = new SM3Digest();
        sm3.update(bytes, 0, bytes.length);
        sm3.doFinal(result, 0);
        return Hex.toHexString(result);
    }

    public static void main(String[] args) {
   
   
        String str = "hello world";
        String result = SM3Example.encrypt(str);
        System.out.println(result);
    }
}

输出如下:

44f0061e69fa6fdfc290c494654a05dc0c053da7e5c52b84ef93a9d67d3fff88

Process finished with exit code 0

5、SM4 算法

5.1、SM4 算法简介

SM4算法是一种对称加密算法,也称为国密算法。它是由中国密码学家提出的一种分组密码算法,被中国政府采用为商用密码算法,并被纳入ISO/IEC标准。SM4算法的安全性和效率都得到了广泛认可,已经被广泛应用于各种加密场景中。

SM4算法采用128位密钥和128位分组长度,具有高强度的安全性和较快的加解密速度。它的加密过程包括4轮加密和4轮密钥扩展,解密过程与加密过程相似,但需要按照相反的顺序进行。SM4算法的密钥长度为128位,可以保证足够的安全性,同时也便于密钥的管理和存储。

5.2、SM4 算法特点

SM4算法的特点如下:

  1. 高强度的安全性:SM4算法采用了分组密码的结构,通过多轮迭代和置换运算,使得密文与明文之间的关系非常复杂,难以破解。
  2. 高效的加解密速度:SM4算法采用了高效的S-box代换和线性变换,使得加解密速度较快,适合于各种加密场景。
  3. 简单易用的密钥管理:SM4算法的密钥长度为128位,可以保证足够的安全性,同时也便于密钥的管理和存储。
  4. 适用于各种加密场景:SM4算法可以应用于各种加密场景,包括数据加密、通信加密、电子签名、数字证书等。

总之,SM4算法是一种安全性高、效率高、易用性好的加密算法,已经被广泛应用于各种加密场景中。

5.3、SM4 算法的 java 运用

package com.pany.camp.encryption;

import org.bouncycastle.crypto.engines.SM4Engine;
import org.bouncycastle.crypto.params.KeyParameter;
import org.bouncycastle.util.encoders.Hex;

/**
 *
 * @description:  SM4算法
 * @copyright: @Copyright (c) 2022 
 * @company: Aiocloud
 * @author: pany
 * @version: 1.0.0 
 * @createTime: 2023-06-25 8:32
 */
public class SM4Example {
   
   

    public static void main(String[] args) {
   
   
        byte[] key = Hex.decode("0123456789abcdeffedcba9876543210");
        byte[] plaintext = Hex.decode("681edf34d206965e86b3e94f536e4246");
        SM4Engine engine = new SM4Engine();
        engine.init(true, new KeyParameter(key));
        byte[] ciphertext = new byte[plaintext.length];
        engine.processBlock(plaintext, 0, ciphertext, 0);
        System.out.println("Cipher text: " + Hex.toHexString(ciphertext));
    }
}

在此示例中,我们使用了Bouncy Castle密码库来实现SM4算法。我们首先将密钥和明文转换为字节数组,然后初始化SM4引擎并使用密钥对其进行配置。最后,我们将明文传递给引擎以加密它,并将结果打印到控制台上。

运行结果:

Cipher text: f324184f3c8892b72bdc9d7c612919de

Process finished with exit code 0

6、SM7算法

SM7是中国密码算法标准的一部分,是一种对称密钥加密算法。它是在SM4算法的基础上开发的,由中国密码管理局(CMCA)和国家密码管理办公室(NSA)联合发布。SM7算法具有更高的安全性和更强的抗攻击能力,可用于保护国家机密和商业机密等重要信息。

SM7算法使用了类似于SM4算法的分组密码结构,但是分组长度为256位。它采用了一种新的密钥扩展算法,可以生成更强的密钥。此外,SM7还使用了一种新的置换算法,可以增强其抗攻击能力。

SM7算法还具有多种加密模式,包括ECB、CBC、CFB和OFB等。它还支持多种填充模式,包括零填充、PKCS#5填充和ISO/IEC 7816-4填充等。

总之,SM7算法是一种非常安全的加密算法,可以用于保护各种重要信息。它已经成为了中国密码算法标准的一部分,并且在国际上也得到了广泛的认可和应用。

目前还没有开源的SM7算法的Java实现,因为SM7算法是中国密码算法标准的一部分,受到国家保密法的保护,因此它的实现和使用受到了严格的限制。

7、SM9算法

SM9算法是中国密码算法标准的一部分,是一种基于椭圆曲线密码学的公钥密码算法,也被称为“超越式密码算法”。它由中国密码管理局(CMCA)和国家密码管理办公室(NSA)联合发布,可用于数字签名、密钥交换和身份认证等应用场景。

SM9算法的主要特点是具有高度的安全性、高效性和灵活性。它使用了一种新的椭圆曲线加密算法,可以在保证安全性的同时提高加密和解密的效率。此外,SM9算法还具有多种身份认证方式,包括基于ID的认证、基于证书的认证和基于密码的认证等。

SM9算法还支持多种密钥交换方式,包括基于Diffie-Hellman密钥交换的方式和基于椭圆曲线密码学的方式等。它还具有多种数字签名方式,包括基于SM3哈希算法的数字签名和基于椭圆曲线密码学的数字签名等。

总之,SM9算法是一种非常安全、高效和灵活的公钥密码算法,适用于各种数字安全应用场景。它已经成为了中国密码算法标准的一部分,并且在国际上也得到了广泛的认可和应用。

由于SM9算法是一种新的公钥密码算法,目前还没有公开的Java实现。
1686494501743.jpg

💕💕 本文由激流丶创作,原创不易,感谢支持!
💕💕喜欢的话记得点赞收藏啊!

目录
相关文章
|
1月前
|
机器学习/深度学习 人工智能 资源调度
【博士每天一篇文献-算法】连续学习算法之HAT: Overcoming catastrophic forgetting with hard attention to the task
本文介绍了一种名为Hard Attention to the Task (HAT)的连续学习算法,通过学习几乎二值的注意力向量来克服灾难性遗忘问题,同时不影响当前任务的学习,并通过实验验证了其在减少遗忘方面的有效性。
43 12
|
1月前
|
算法 Java
掌握算法学习之字符串经典用法
文章总结了字符串在算法领域的经典用法,特别是通过双指针法来实现字符串的反转操作,并提供了LeetCode上相关题目的Java代码实现,强调了掌握这些技巧对于提升算法思维的重要性。
|
1月前
|
算法 NoSQL 中间件
go语言后端开发学习(六) ——基于雪花算法生成用户ID
本文介绍了分布式ID生成中的Snowflake(雪花)算法。为解决用户ID安全性与唯一性问题,Snowflake算法生成的ID具备全局唯一性、递增性、高可用性和高性能性等特点。64位ID由符号位(固定为0)、41位时间戳、10位标识位(含数据中心与机器ID)及12位序列号组成。面对ID重复风险,可通过预分配、动态或统一分配标识位解决。Go语言实现示例展示了如何使用第三方包`sonyflake`生成ID,确保不同节点产生的ID始终唯一。
go语言后端开发学习(六) ——基于雪花算法生成用户ID
|
1月前
|
存储 机器学习/深度学习 算法
【博士每天一篇文献-算法】连续学习算法之HNet:Continual learning with hypernetworks
本文提出了一种基于任务条件超网络(Hypernetworks)的持续学习模型,通过超网络生成目标网络权重并结合正则化技术减少灾难性遗忘,实现有效的任务顺序学习与长期记忆保持。
31 4
|
1月前
|
存储 机器学习/深度学习 算法
【博士每天一篇文献-算法】连续学习算法之RWalk:Riemannian Walk for Incremental Learning Understanding
RWalk算法是一种增量学习框架,通过结合EWC++和修改版的Path Integral算法,并采用不同的采样策略存储先前任务的代表性子集,以量化和平衡遗忘和固执,实现在学习新任务的同时保留旧任务的知识。
68 3
|
1月前
|
存储 机器学习/深度学习 算法
【博士每天一篇文献-综述】基于脑启发的连续学习算法有哪些?附思维导图
这篇博客文章总结了连续学习的分类,包括经典方法(重放、正则化和稀疏化方法)和脑启发方法(突触启发、双系统启发、睡眠启发和模块化启发方法),并讨论了它们在解决灾难性遗忘问题上的优势和局限性。
25 2
|
2月前
|
机器学习/深度学习 数据采集 算法
Python实现ISSA融合反向学习与Levy飞行策略的改进麻雀优化算法优化支持向量机回归模型(SVR算法)项目实战
Python实现ISSA融合反向学习与Levy飞行策略的改进麻雀优化算法优化支持向量机回归模型(SVR算法)项目实战
102 9
|
2月前
|
机器学习/深度学习 数据采集 算法
Python实现ISSA融合反向学习与Levy飞行策略的改进麻雀优化算法优化支持向量机分类模型(SVC算法)项目实战
Python实现ISSA融合反向学习与Levy飞行策略的改进麻雀优化算法优化支持向量机分类模型(SVC算法)项目实战
|
2月前
|
机器学习/深度学习 数据采集 监控
算法金 | DL 骚操作扫盲,神经网络设计与选择、参数初始化与优化、学习率调整与正则化、Loss Function、Bad Gradient
**神经网络与AI学习概览** - 探讨神经网络设计,包括MLP、RNN、CNN,激活函数如ReLU,以及隐藏层设计,强调网络结构与任务匹配。 - 参数初始化与优化涉及Xavier/He初始化,权重和偏置初始化,优化算法如SGD、Adam,针对不同场景选择。 - 学习率调整与正则化,如动态学习率、L1/L2正则化、早停法和Dropout,以改善训练和泛化。
26 0
算法金 | DL 骚操作扫盲,神经网络设计与选择、参数初始化与优化、学习率调整与正则化、Loss Function、Bad Gradient
|
2月前
|
Dart 算法 JavaScript
C#数据结构与算法入门教程,值得收藏学习!
C#数据结构与算法入门教程,值得收藏学习!