- 密码学教程
- 密码学 - 首页
- 密码学 - 起源
- 密码学 - 历史
- 密码学 - 原理
- 密码学 - 应用
- 密码学 - 优缺点
- 密码学 - 现代
- 密码学 - 传统密码
- 密码学 - 加密的需求
- 密码学 - 双重强度加密
- 密码系统
- 密码系统
- 密码系统 - 组成部分
- 密码系统攻击
- 密码系统 - 彩虹表攻击
- 密码系统 - 字典攻击
- 密码系统 - 暴力破解攻击
- 密码系统 - 密码分析技术
- 密码学类型
- 密码系统 - 类型
- 公钥加密
- 现代对称密钥加密
- 密码学散列函数
- 密钥管理
- 密码系统 - 密钥生成
- 密码系统 - 密钥存储
- 密码系统 - 密钥分发
- 密码系统 - 密钥撤销
- 分组密码
- 密码系统 - 流密码
- 密码学 - 分组密码
- 密码学 - Feistel 分组密码
- 分组密码操作模式
- 分组密码操作模式
- 电子密码本 (ECB) 模式
- 密码分组链接 (CBC) 模式
- 密码反馈 (CFB) 模式
- 输出反馈 (OFB) 模式
- 计数器 (CTR) 模式
- 经典密码
- 密码学 - 反向密码
- 密码学 - 凯撒密码
- 密码学 - ROT13 算法
- 密码学 - 换位密码
- 密码学 - 加密换位密码
- 密码学 - 解密换位密码
- 密码学 - 乘法密码
- 密码学 - 仿射密码
- 密码学 - 简单替换密码
- 密码学 - 简单替换密码加密
- 密码学 - 简单替换密码解密
- 密码学 - 维吉尼亚密码
- 密码学 - 维吉尼亚密码的实现
- 现代密码
- Base64 编码和解码
- 密码学 - XOR 加密
- 替换技术
- 密码学 - 单表替换密码
- 密码学 - 单表替换密码破解
- 密码学 - 多表替换密码
- 密码学 - Playfair 密码
- 密码学 - 希尔密码
- 多表替换密码
- 密码学 - 一次一密密码
- 一次一密密码的实现
- 密码学 - 换位技术
- 密码学 - 栅栏密码
- 密码学 - 列移位密码
- 密码学 - 隐写术
- 对称算法
- 密码学 - 数据加密
- 密码学 - 加密算法
- 密码学 - 数据加密标准
- 密码学 - 三重DES
- 密码学 - 双重DES
- 高级加密标准
- 密码学 - AES 结构
- 密码学 - AES 变换函数
- 密码学 - 字节替换变换
- 密码学 - 行移位变换
- 密码学 - 列混合变换
- 密码学 - 轮密钥加变换
- 密码学 - AES 密钥扩展算法
- 密码学 - Blowfish 算法
- 密码学 - SHA 算法
- 密码学 - RC4 算法
- 密码学 - Camellia 加密算法
- 密码学 - ChaCha20 加密算法
- 密码学 - CAST5 加密算法
- 密码学 - SEED 加密算法
- 密码学 - SM4 加密算法
- IDEA - 国际数据加密算法
- 公钥(非对称)密码算法
- 密码学 - RSA 算法
- 密码学 - RSA 加密
- 密码学 - RSA 解密
- 密码学 - 创建 RSA 密钥
- 密码学 - RSA 密码破解
- 密码学 - ECDSA 算法
- 密码学 - DSA 算法
- 密码学 - Diffie-Hellman 算法
- 密码学中的数据完整性
- 密码学中的数据完整性
- 消息认证
- 密码学数字签名
- 公钥基础设施
- 散列
- MD5(消息摘要算法 5)
- SHA-1(安全散列算法 1)
- SHA-256(安全散列算法 256 位)
- SHA-512(安全散列算法 512 位)
- SHA-3(安全散列算法 3)
- 散列密码
- Bcrypt 散列模块
- 现代密码学
- 量子密码学
- 后量子密码学
- 密码协议
- 密码学 - SSL/TLS 协议
- 密码学 - SSH 协议
- 密码学 - IPsec 协议
- 密码学 - PGP 协议
- 图像和文件加密
- 密码学 - 图像
- 密码学 - 文件
- 隐写术 - 图像
- 文件加密和解密
- 密码学 - 文件加密
- 密码学 - 文件解密
- 物联网中的密码学
- 物联网安全挑战、威胁和攻击
- 物联网安全加密技术
- 物联网设备通信协议
- 常用密码技术
- 自定义构建密码算法(混合密码)
- 云密码学
- 量子密码学
- 密码学中的图像隐写术
- DNA 密码学
- 密码学中的一次性密码 (OTP) 算法
- 区别
- 密码学 - MD5 与 SHA1
- 密码学 - RSA 与 DSA
- 密码学 - RSA 与 Diffie-Hellman
- 密码学与密码学
- 密码学 - 密码学与密码分析
- 密码学 - 经典与量子
- 密码学与隐写术
- 密码学与加密
- 密码学与网络安全
- 密码学 - 流密码与分组密码
- 密码学 - AES 与 DES 密码
- 密码学 - 对称与非对称
- 密码学有用资源
- 密码学 - 快速指南
- 密码学 - 讨论
密码学 - SM4 加密算法
SM4 方法是第一个商业化的分组密码算法,由中国于 2006 年以 SMS4 的名称发布。SM4 方法用于中国无线局域网 WAPI(有线认证和隐私基础设施)的国家标准。WAPI 成为中国的强制性国家标准。
从安全性和通信性能的角度来看,WAPI 是通信基础设施的绝佳解决方案。本工作在以太网加密系统中使用 SM4 算法。
SM4 的结构
SM4 算法表示标准的 Feistel 结构。SM4 算法的输入、输出和密钥均为 128 位。它们被分成四个部分,每个部分有 32 位,称为字。SM4 算法包含 32 轮相同的轮函数。加密和解密的结构相同。唯一执行的操作是异或、循环移位和 S 盒应用。用于解密的密钥与用于加密的密钥相同,但顺序相反。
SM4 方法易于在软件和硬件中实现。它还具有广泛的应用。
一个新的使用 SM4 作为基本算法的 f8 密钥流生成器可以安全地用于 3G 通信系统。SM4 算法在 MicroBlaze 软核的嵌入式处理器中以硬件和软件的方式共同设计,以便在设计加密通信设备时提供灵活性。SMS4 算法还在 Java 卡上进行了设计和实现。
密钥和密钥参数
加密密钥长度为 128 位,表示为 MK=(MK0, MK1, MK2, MK3),其中 MKi(i=0, 1, 2, 3)} 是一个 32 位字。轮密钥表示为 (rk0, rk1,...., rk31),其中每个 rki (i=0,..., 31)} 表示一个字。它是使用加密密钥和以下参数生成的:
- FK=(FK0, FK1, FK2, FK3)
- CK=(CK0, CK1,..., CK31)
FKi 和 CKi 是用于生成轮密钥的字。
轮函数
每个轮函数都基于前四个轮输出计算。Xi,Xi+1,Xi+2,Xi+3 使得:
Xi+4 = Xi⊕ F(Xi+1oplus Xi + 2⊕ Xi + 3⊕ rki),其中 F 是一个由非线性变换、S 盒和线性变换 L 组成的替换函数。
S 盒
S 盒对于 8 位输入和输出是固定的,表示为 Sbox()。与 AES 一样,S 盒使用 GF(28) 上的乘法逆元。仿射变换和多项式基与 AES 不同,但是由于仿射同构,它们可以使用 AES Rijndael S 盒快速计算。
它是如何工作的?
SM4 算法对数据进行混淆,使其在没有特殊密钥的情况下无法理解。它使用 128 位块进行操作,用于混淆和解混淆数据的密钥也是 128 位。这些块和密钥被分成四个部分,每个部分有 32 位。
该方法通过在 32 个循环中混合和修改位来混淆信息。这个过程对于混淆和解混淆都是相同的,但是解混淆的阶段顺序不同。
该方法只执行三件事:使用 XOR(类似于数字“或”运算)组合位、循环移位位以及使用称为 S 盒的特定函数。
以下是一些关键术语:
- 字和字节 - 它们只是用于描述位簇的术语。
- S 盒 - 它类似于秘密代码,将一组位转换为另一组位。
- 基本操作 - 这些是算法的核心函数,例如组合和移动位。
混淆密钥或 MK 由四个部分组成。另一种类型的密钥,称为轮密钥,由 MK 生成并在整个混淆过程中使用。这些密钥有助于混合位。
轮函数是算法的主要组成部分。它一次混淆 32 位,在每一轮中都使用密钥。
混淆信息后,我们可以反转该过程以对其进行解混淆。
以下是其工作原理的简要说明:
- 我们从明文(我们要保护的信息)开始。
- 我们将其分成 128 位的块。
- 我们使用密钥和几种其他方法对每个块进行 32 次混淆。
- 我们得到混淆后的文本作为输出。
- 要读取文本,我们使用相同的步骤,但顺序相反。
示例
假设我们有一个简单的消息,我们想用 SM4 方法对其进行加密。消息是“HELLO”,密钥是“KEY1234567890123”。以下是使用 SM4 加密它的方法。
将消息和密钥转换为二进制:
HELLO 变为
字母 | 二进制 |
---|---|
H | 01001000 |
E | 01000101 |
L | 01001100 |
L | 01001100 |
L | 01001111 |
O
字母 | 二进制 |
---|---|
KEY1234567890123 变为 | 01001011 |
E | 01000101 |
K | 01011001 |
1 | 00110001 |
2 | 00110010 |
3 | 00110011 |
4 | 00110100 |
5 | 00110101 |
6 | 00110110 |
7 | 00110111 |
8 | 00111000 |
9 | 00111001 |
0 | 00110000 |
1 | 00110001 |
2 | 00110010 |
3 | 00110011 |
Y
将消息和密钥分成块:
消息块(128 位):
块 1:01001000 01000101 01001100
块 2:01001111(用零填充以生成 128 位)
- 每个密钥块包含 128 位。
- 块 1:01001011 01000101 01011001 00110001。
- 块 2:00110010 00110011 00110100 00110101。
- 块 3:00110110 00110111 00111000 00111001。
块 4:00110000 00110001, 00110010, 00110011。
加密每个块 - 使用从密钥块接收的轮密钥对每个消息块应用加密过程。
组合加密块 - 组合加密块以形成最终的加密消息。