安全基础学习-SM4加密算法

2024-08-20 18:28

本文主要是介绍安全基础学习-SM4加密算法,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

SM4 是一种中国国家密码标准(GB/T 32907-2016)中定义的分组加密算法,又称为“中国商用密码算法SM4”。它是由中国国家密码管理局发布的,并广泛应用于金融、电子商务和其他需要数据加密的场景。

1、SM4 算法概述

SM4 是一种对称加密算法,意味着加密和解密使用相同的密钥。它是一个 128 位(16 字节)分组密码,意味着它将明文分成 128 位的块,然后对每个块进行加密。SM4 使用了 128 位的密钥进行加密和解密。

SM4 算法的主要特点是:

分组长度:128 位。
密钥长度:128 位。
加密模式:支持多种模式,如ECB(电子密码本)、CBC(加密分组链接)、CTR(计数器模式)等。

2、SM4 的工作原理

SM4 的加密和解密过程主要由以下几个部分组成:

  1. 密钥扩展:从 128 位的主密钥生成 32 个轮密钥,每个轮密钥长度为 32 位。
    在这里插入图片描述

  2. 轮函数:加密和解密过程中,明文(或密文)经过 32 轮的迭代计算,每一轮使用一个轮密钥。
    在这里插入图片描述

  3. 非线性变换函数 τ:τ 是一个基于 S 盒的非线性变换,将 32 位输入数据通过 S 盒转换为 32 位输出数据。
    S 盒的每个字节输入都映射到一个输出字节。
    在这里插入图片描述

  4. 线性变换函数 L:L 是一个线性变换函数,它对输入数据进行移位和异或操作来实现扩散效果。
    C=L(B)=B⨁(B<<<2)⨁(B<<<10)⨁(B<<<18)⨁(B<<<24)

3、SM4 的实现步骤

3.1 参数设置

  • 输入数据:128 位的明文或密文数据。
  • 密钥:128 位的加密密钥。
  • 轮数:32 轮加密或解密操作。

3.2 密钥扩展 (Key Expansion)

SM4 使用一个 128 位的主密钥 MK 生成 32 个轮密钥 RK。
通过以下步骤生成轮密钥:

  1. 密钥初始化:将 MK 分为四个 32 位的部分 MK[0], MK[1], MK[2], MK[3],然后通过线性变换得到 K[0], K[1], K[2], K[3]。
  2. 轮密钥生成:从 K[0] 到 K[3] 开始,通过每轮的线性变换和非线性变换生成新的密钥 K[i],最终得到 32 个轮密钥 RK[0] 到 RK[31]。

3.3 加密过程 (Encryption Process)

加密过程包括 32 轮迭代,每轮都使用一个不同的轮密钥 RK。
具体步骤如下:

  1. 数据初始化:将 128 位明文 P 分为四个 32 位的部分 X[0], X[1], X[2], X[3]。
  2. 32 轮迭代:对于每一轮 i,执行以下操作:
    • 使用非线性变换函数 τ 和线性变换函数 L,结合当前状态 X[i-3], X[i-2], X[i-1], X[i] 和轮密钥 RK[i] 计算新状态 X[i+1]。
    • 新状态的计算公式为:
      X[i+1]=X[i−3]⊕L(τ(X[i]⊕X[i−1]⊕X[i−2]⊕RK[i]))
  3. 最终状态:在第 32 轮结束后,四个 32 位的状态 X[35], X[34], X[33], X[32] 将作为加密后的密文输出。

在这里插入图片描述

3.4 解密过程 (Decryption Process)

  • 解密过程与加密过程类似,但轮密钥的使用顺序相反。
  • 使用与加密相同的函数和操作步骤,只是在每轮中使用的轮密钥顺序相反,即从 RK[31] 到 RK[0]。

在这里插入图片描述

4、数据举例

  • 明文(128 位):0x0123456789ABCDEFFEDCBA9876543210
  • 密钥(128 位):0x0123456789ABCDEFFEDCBA9876543210

4.1 密钥扩展 (Key Expansion)

首先,将 128 位的密钥 MK 分为四个 32 位的部分:

MK[0] = 0x01234567
MK[1] = 0x89ABCDEF
MK[2] = 0xFEDCBA98
MK[3] = 0x76543210

接下来,定义系统参数 FK 和 CK,然后通过公式生成初始密钥 K[0], K[1], K[2], K[3]。计算过程如下:

K[0] = MK[0] ⊕ FK[0]
K[1] = MK[1] ⊕ FK[1]
K[2] = MK[2] ⊕ FK[2]
K[3] = MK[3] ⊕ FK[3]

假设 FK 的值为:

FK[0] = 0xA3B1BAC6
FK[1] = 0x56AA3350
FK[2] = 0x677D9197
FK[3] = 0xB27022DC

计算得到:

K[0] = 0xA3B1BAC6 ⊕ 0x01234567 = 0xA3928FE1
K[1] = 0x56AA3350 ⊕ 0x89ABCDEF = 0xDF01FE9F
K[2] = 0x677D9197 ⊕ 0xFEDCBA98 = 0x9971AB0F
K[3] = 0xB27022DC ⊕ 0x76543210 = 0xC42410CC

通过 32 轮迭代生成每一轮的轮密钥 RK。在此只演示前几轮的轮密钥生成:

RK[0] = K[0] ⊕ L(τ(K[1] ⊕ K[2] ⊕ K[3] ⊕ CK[0]))
RK[1] = K[1] ⊕ L(τ(K[2] ⊕ K[3] ⊕ RK[0] ⊕ CK[1]))

4.2 加密过程 (Encryption Process)

将 128 位的明文 P 分为四个 32 位的部分:

X[0] = 0x01234567
X[1] = 0x89ABCDEF
X[2] = 0xFEDCBA98
X[3] = 0x76543210

通过 32 轮迭代计算每一轮的新状态 X[i+1]。同样,我们只演示前几轮的计算:

X[4] = X[0] ⊕ L(τ(X[1] ⊕ X[2] ⊕ X[3] ⊕ RK[0]))
X[5] = X[1] ⊕ L(τ(X[2] ⊕ X[3] ⊕ X[4] ⊕ RK[1]))

以此类推,直至第 32 轮计算完成。

4.3 最终密文生成

在第 32 轮结束后,四个 32 位的状态 X[35], X[34], X[33], X[32] 将作为加密后的密文输出。最终密文将是这四个 32 位状态的组合。

例如,假设最终结果为:

X[32] = 0xF58A8A5C
X[33] = 0x70F7C3A7
X[34] = 0xA8E62D79
X[35] = 0xD2F0C1BC

则输出密文为:0xF58A8A5C70F7C3A7A8E62D79D2F0C1BC

4.4 解密过程

解密过程与加密过程类似,只需将轮密钥 RK 的顺序逆转,从 RK[31] 到 RK[0] 使用同样的操作。

5、应用模式

SM4 可以结合多种模式使用,例如 ECB(电子密码本模式)、CBC(密码分组链接模式)、CFB(密码反馈模式)、OFB(输出反馈模式)等,以适应不同的应用场景。

6、python实现(ECB模式)

# SM4 Implementation in Python# Constants used in SM4
FK = [0xA3B1BAC6, 0x56AA3350, 0x677D9197, 0xB27022DC]
CK = [0x00070E15, 0x1C232A31, 0x383F464D, 0x545B6269, 0x70777E85, 0x8C939AA1, 0xA8AFB6BD, 0xC4CBD2D9,0xE0E7EEF5, 0xFC030A11, 0x181F262D, 0x343B4249, 0x50575E65, 0x6C737A81, 0x888F969D, 0xA4ABB2B9,0xC0C7CED5, 0xDCE3EAF1, 0xF8FF060D, 0x141B2229, 0x30373E45, 0x4C535A61, 0x686F767D, 0x848B9299,0xA0A7AEB5, 0xBCC3CAD1, 0xD8DFE6ED, 0xF4FB0209, 0x10171E25, 0x2C333A41, 0x484F565D, 0x646B7279
]# S-box
SBOX = [# 16x16 S-Box Table0xd6, 0x90, 0xe9, 0xfe, 0xcc, 0xe1, 0x3d

这篇关于安全基础学习-SM4加密算法的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1090837

相关文章

从基础到高级详解Python数值格式化输出的完全指南

《从基础到高级详解Python数值格式化输出的完全指南》在数据分析、金融计算和科学报告领域,数值格式化是提升可读性和专业性的关键技术,本文将深入解析Python中数值格式化输出的相关方法,感兴趣的小伙... 目录引言:数值格式化的核心价值一、基础格式化方法1.1 三种核心格式化方式对比1.2 基础格式化示例

redis-sentinel基础概念及部署流程

《redis-sentinel基础概念及部署流程》RedisSentinel是Redis的高可用解决方案,通过监控主从节点、自动故障转移、通知机制及配置提供,实现集群故障恢复与服务持续可用,核心组件包... 目录一. 引言二. 核心功能三. 核心组件四. 故障转移流程五. 服务部署六. sentinel部署

从基础到进阶详解Python条件判断的实用指南

《从基础到进阶详解Python条件判断的实用指南》本文将通过15个实战案例,带你大家掌握条件判断的核心技巧,并从基础语法到高级应用一网打尽,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一... 目录​引言:条件判断为何如此重要一、基础语法:三行代码构建决策系统二、多条件分支:elif的魔法三、

Python WebSockets 库从基础到实战使用举例

《PythonWebSockets库从基础到实战使用举例》WebSocket是一种全双工、持久化的网络通信协议,适用于需要低延迟的应用,如实时聊天、股票行情推送、在线协作、多人游戏等,本文给大家介... 目录1. 引言2. 为什么使用 WebSocket?3. 安装 WebSockets 库4. 使用 We

Unity新手入门学习殿堂级知识详细讲解(图文)

《Unity新手入门学习殿堂级知识详细讲解(图文)》Unity是一款跨平台游戏引擎,支持2D/3D及VR/AR开发,核心功能模块包括图形、音频、物理等,通过可视化编辑器与脚本扩展实现开发,项目结构含A... 目录入门概述什么是 UnityUnity引擎基础认知编辑器核心操作Unity 编辑器项目模式分类工程

从基础到高阶详解Python多态实战应用指南

《从基础到高阶详解Python多态实战应用指南》这篇文章主要从基础到高阶为大家详细介绍Python中多态的相关应用与技巧,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录一、多态的本质:python的“鸭子类型”哲学二、多态的三大实战场景场景1:数据处理管道——统一处理不同数据格式

Python学习笔记之getattr和hasattr用法示例详解

《Python学习笔记之getattr和hasattr用法示例详解》在Python中,hasattr()、getattr()和setattr()是一组内置函数,用于对对象的属性进行操作和查询,这篇文章... 目录1.getattr用法详解1.1 基本作用1.2 示例1.3 原理2.hasattr用法详解2.

MySQL数据类型与表操作全指南( 从基础到高级实践)

《MySQL数据类型与表操作全指南(从基础到高级实践)》本文详解MySQL数据类型分类(数值、日期/时间、字符串)及表操作(创建、修改、维护),涵盖优化技巧如数据类型选择、备份、分区,强调规范设计与... 目录mysql数据类型详解数值类型日期时间类型字符串类型表操作全解析创建表修改表结构添加列修改列删除列

Python 函数详解:从基础语法到高级使用技巧

《Python函数详解:从基础语法到高级使用技巧》本文基于实例代码,全面讲解Python函数的定义、参数传递、变量作用域及类型标注等知识点,帮助初学者快速掌握函数的使用技巧,感兴趣的朋友跟随小编一起... 目录一、函数的基本概念与作用二、函数的定义与调用1. 无参函数2. 带参函数3. 带返回值的函数4.

python panda库从基础到高级操作分析

《pythonpanda库从基础到高级操作分析》本文介绍了Pandas库的核心功能,包括处理结构化数据的Series和DataFrame数据结构,数据读取、清洗、分组聚合、合并、时间序列分析及大数据... 目录1. Pandas 概述2. 基本操作:数据读取与查看3. 索引操作:精准定位数据4. Group