密码学 - 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 卡上进行了设计和实现。

SM4 Encryption Algorithm

密钥和密钥参数

加密密钥长度为 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。

加密每个块 - 使用从密钥块接收的轮密钥对每个消息块应用加密过程。

组合加密块 - 组合加密块以形成最终的加密消息。

广告