Sm4

 

概述

SM4算法是国密算法中的对称算法.

术语和定义

分组长度 block length

一个信息分组的比特位数

密钥长度

密钥的比特位数 key length

密钥扩展算法 key expansion algorithm

将密钥变换为轮密钥的运算单元

轮数 rounds

轮函数的迭代次数

字 word

长度为32比特的组(串)

S盒 S-box

固定的8比特输入8比特输出的置换记为Sbox(⋅).

符号和缩略语

⨁ 32比特异或

«<i 32比特循环左移i位

算法结构

SM4密码算法是一个分组算法,分组长度为126比特,密钥长度为128比特.加密算法与密钥扩展算法都采用32非线性迭代结构.数据解密和数据加密的算法结构相同,只是轮密钥的使用顺序相反,解密轮密钥是加密轮密钥的逆序.

密钥及密钥参量

加密密钥长度为128比特,表示为 MK=(MK0,MK1,MK2,MK3)

轮密钥表示为 (rk0,rk1,rk2…rk31,) ,其中rki(i=0,1,2…31) 为32比特字.轮密钥由加密密钥生成.

FK=(FK0,FK1,FK2,FK3) 为系统参数, CK=(CK0,CK1…CK31) 为字.

轮函数 F

轮函数结构

设输入为 (X0,X1,X2,X3)∈(Z232)4,轮密钥为rk∈(Z232),则轮函数F为:F=(X0,X1,X2,X3,rk)=X0⨁(X1⨁X2⨁X3⨁rk)

合成置换T

T:Z232 -> Z232是一个可逆变换,由非线性变换t和线性变换L符合而成.即T(⋅) = L(t(⋅)

非线性变换 t

t由4个并行的S盒构成:

SM4合成置换

算法描述

加密算法

本加密算法由32次迭代运算和1次反序变换R组成.

设明文输入为 (X0,X1,X2,X3)∈(Z232)4,密文输出为 (Y0,Y1,Y2,Y3)∈(Z232)4,轮密钥为 rki∈Z232,i=0,1…31,加密算法的运算过程如下:

  • 32次迭代运算: Xi+4=F(Xi,Xi+1,Xi+2,Xi+3,rki),i=0,1…31;
  • 反序变换: (Y0,Y1,Y2,Y3)=R(X32,X33,X34,X35)=(X35,X34,X33,X32).

    解密算法

    解密变换和加密变换结构相同,不同的是轮密钥的使用顺序.解密时的轮密钥序 (rk31,rk30…rk0).

    密钥扩展算法

    轮密钥由加密密钥通过密钥扩展算法生成. 加密密钥MK=(MK0,MK1,MK2,MK3)∈(Z232)4,轮密钥生成方法为:(K0,K1,K2,K3)=(MK0⨁FK0,MK1⨁FK1,MK2⨁FK2,MK3⨁FK3),

rki=Ki+4=Ki⨁T`(Ki+1⨁Ki+2⨁Ki+3,Ki+4⨁CKi), i=0,1,…31.

其中:

  • T` 是将合成置换中的T的线性变换L置换为 L`

    L`(B)=B⨁(B«<13)⨁(B«<23);

  • 系统参数FK的取值为:

    FK<sub>0</sub>=(A3B1BAC6)
    FK<sub>1</sub>=(56AA3350)
    FK<sub>2</sub>=(677D9197)
    FK<sub>3</sub>=(B27022DC)
  • 固定参数CK的取值方法为:

cki,jCKi 的第 j字节(i=0,1..31,j=0,1,2,3),即CKi=(cki,0,cki,1,cki,2,cki,3)∈(Z28)4, 则 cki,j=(4i+j)X7(mod256).

固定参数*CKi(i=0,1…31)具体值为:

00070E15, 1C232A31, 383F464D, 545B6269,

70777E85, 8C939AA1, A8AFB6BD, C4CBD2D9,

E0E7EEF5, FC030A11, 181F262D, 343B4249,

50575E65, 6C737A81, 888F969D, A4ABB2B9,

C0C7CED5, DCE3EAF1, F8FF060D, 141B2229,

30373E45, 4C535A61, 686F767D, 848B9299,

A0A7AEB5, BCC3CAD1, D8DFE6ED, F4FB0209,

10171E25, 2C333A41, 484F565D, 646B7279。

示例

输入参数以及固定参数

输入明文:

01 23 45 67 89 AB CD EF FE DC BA 98 76 54 32 10

(X0,X1,X2,X3)= (01234567,89ABCDEF,FEDCBA98,76543210) 4比特*8*4 = 128比特

输入密钥:

01 23 45 67 89 AB CD EF FE DC BA 98 76 54 32 10 > *MK=(MK<sub>0</sub>,MK<sub>1</sub>,MK<sub>2</sub>,MK<sub>3</sub>)=(01234567,89ABCDEF,FEDCBA98,76543210)*   4比特\*8*4 = 128比特

系统参数:

FK0=(A3B1BAC6),FK1=(A3B1BAC6),FK2=(A3B1BAC6),FK3*=(A3B1BAC6).

固定参数:

CKi(i=0,1…31) 由公式生成,见上面.

加密流程:

加密准备

(K0,K1,K2,K3)=(MK0⨁FK0,MK1⨁FK1,MK2⨁FK2,MK3⨁FK3)=(a292ffa1,df01febf,99a12b0f,c42410cc).

初始化轮密钥

rki=Ki+4=Ki⨁T`(Ki+1⨁Ki+2⨁Ki+3,Ki+4⨁CKi), i=0,1,…31.

T`(A)=L`(t(A))

L`(A)=A⨁(A«<13)⨁(A«<23)

A=(a0,a1,a2,a3)∈(Z28)4

t(A)=(Sbox(a0),Sbox(a1),Sbox(a2),Sbox(a3))

rk0=K4=f12186f9

rk31=K35=9124A012

生成加密结果

Xi+4=F(Xi,Xi+1,Xi+2,Xi+3,rki),i=0,1…31;

F=(X0,X1,X2,X3,rk)=X0⨁T(X1⨁X2⨁X3⨁rk)

T(A)=L(t(A))

L(A)=A⨁(A«<2)⨁(A«<10)⨁(A«<18)⨁(A«<24)

A=(a0,a1,a2,a3)∈(Z28)4

t(A)=(Sbox(a0),Sbox(a1),Sbox(a2),Sbox(a3))

X4=27FAD345

X35=681EDF34

取反得到结果

(Y0,Y1,Y2,Y3)=R(X32,X33,X34,X35)=(X35,X34,X33,X32)=(681EDF34 D206965E 86B3E94F 536E4246).

加密模式

IV

IV,Initialization Vector是许多任务作模式中用于将加密随机化的一个位块,由此即使同样的明文被多次加密也会产生不同的密文,避免了较慢的重新产生密钥的过程。

初始化向量与密钥相比有不同的安全性需求,因此IV通常无须保密,然而在大多数情况中,不应当在使用同一密钥的情况下两次使用同一个IV。

对于CBC和CFB,重用IV会导致泄露明文首个块的某些信息,亦包括两个不同消息中相同的前缀。对于OFB和CTR而言,重用IV会导致完全失去安全性。

另外,在CBC模式中,IV在加密时必须是无法预测的;特别的,在许多实现中使用的产生IV的方法,例如SSL2.0使用的,即采用上一个消息的最后一块密文作为下一个消息的IV,是不安全的。

填充

有的模式支持对非128比特整的数据进行加密,有的模式不支持,填充是用各种可以恢复的方法把数据流填充为128比特整.

设数据流还差n字节

在数据流结尾填充n字节n(如果n=0,填充16字节16)

ECB模式

最简单的加密模式即为电子密码本(Electronic codebook,ECB)模式。需要加密的消息按照块密码的块大小被分为数个块,并对每个块进行独立加密:

ecb模式

在特定情况下ecb模式会有风险,例如:

ecb风险

CBC模式

1976年,IBM发明了密码分组链接(CBC,Cipher-block chaining)模式。在CBC模式中,每个明文块先与前一个密文块进行异或后,再进行加密。在这种方法中,每个密文块都依赖于它前面的所有明文块。同时,为了保证每条消息的唯一性,在第一个块中需要使用初始化向量.

加密过程:

Ci=EK(Pi⨁Ci-1)

C0=IV

解密过程: Pi=DK(Ci)⨁Ci-1

C0=IV

cbc加解密

ps:加密时先异或再加密,解密时先解密再异或

缺点: 加密无法并行,解密可以.

PCBC模式

和CBC模式的区别是,使用上一组的明文和密文异或作为下一组的IV.

PCBC加解密

CFB模式

密文反馈(CFB,Cipher feedback)模式类似于CBC,可以将块密码变为自同步的流密码;工作模式亦非常相似.加解密过程如下:

Ci=EK(Ci-1)⨁Pi

Pi=EK(Ci-1)⨁Ci

C0=IV 块密码变为流密码是指这个模式可以对非128比特的数据进行加密

cfb有cfb128 cfg8 cfb1 3个模式,主要区别是每隔1 8 128位即对数据进行一次加密

  • 使用加密器加密IV的数据;
  • 将明文的最高1/8/128位与IV的最高1/8/128位异或得到1/8/128位密文;
  • 将IV数据左移1/8/128位,最低1位用刚刚计算得到的1/8/128位密文补上。

cfb加解密

ofb模式

output feedback ofb模式是先用块加密器生成密钥流,然后将密钥流和明文流异或得到密文流,解密过程是重新异或一次.

加密不能并行,解密可以

ofb加解密

可以一次计算出所有的密钥流,每次加解密只需要做异或操作.

如果已经计算出所有的密钥流,可以并行的进行加解密.

ctr模式

Counter mode,CM ctr模式是使用随机数等方式产生一个IV`和IV拼接成一个串,对这个串加密,然后和明文做异或操作.

使用计数器是常用的做法,但有人评价说计数器比其他随机算法风险更高.

ctr模式支持并行的加解密.

ctr加解密