分组密码和流密码的区别。
1.分组密码和流密码的概念与区别:
所谓流密码,就是把明文的所有字符作为一个整体,然后一位一位地对明文字符进行加密。如维吉尼亚密码和Vernam密码,都属于流密码。一位明文被一位密钥加密为一位密文是流密码的特点。
分组密码:需要先对明文进行分组,然后**对分组后的明文一组一组地进行加密。它与流密码的区别是,分组密码一次用一个密钥k加密一组明文,而不是一位一位加密。如下图明文分组长度为 n, 密文分组长度为 m, 加密函数 E : V n × K → V m E : V_n \times K \rightarrow V_m E:Vn×K→Vm 。通常取n=m , 密文分组与明文分组相等。若 n < m ,则为有数据扩展的分组密码,若 n>m ,则为有数据压缩的分组密码。
2.理想的分组密码:
(1)分组密码的可逆映射: 一个明文分组一定对应着唯一一个密文分组。反之亦然(否则加解密不互逆)。这样的明文分组与密文分组之间的一一映射称为可逆映射 (称为代换)。而所有可能的明文分组集到对应的密文分组集的映射组成的表称为一个可逆映射表。
(2)分组密码变换的总数: 在长度为 n 的分组中,一个可能的可逆映射表中含有的映射对有 2 n 2^n 2n 个(因为长为n位的明文组可以有 2 n 2^n 2n 种,如2位的明文分组有 00,01,10,11 四种)。而第一种明文(如00)也可以对应其他4种密文(如00,01,10,11),第二种明文(如01)可以对应剩下的3种密文,以此类推,总数为 2 2 ! = 24 2^2 ! = 24 22!=24 种,当长度 n 为位分组,其明密文可逆映射表有 2 n ! 2^n ! 2n! 种。
(3)理想分组密码的密钥:对于一个长度为 n 位的分组,其明文组和密文组对应的映射本身就是加密函数,而加密函数又与密钥相对应。从本质上来说,明文对应的某一特定的密文就是从所有可能映射中决定某一特定映射的密钥。因此,对于一个分组长度为 n 的明文,其密钥长度为 n × 2 n n \times 2^n n×2n。
(4)理想分组密码遇到的困难和改进:因为对于一个理想的分组密码,其密钥长度为 n × 2 n n \times 2^n n×2n 。而分组密码的分组长度还不能太小,否则容易被攻破。但太大时,密钥会非常长:当n=64时, 64 × 2 6 4 ≈ 1 0 21 64 \times 2 ^64 \approx 10^{21} 64×264≈1021 。这造成了密钥共享的困难。考虑到这些困难,Feistel 提出,我们只是需要使用一种不太理想的分组密码,用来逼近理想分组密码即可(实际场景)。
分组密码设计的两种主要结构类型便是:SP 网络和 Feistel 密码体制。
2.1 SP 网络
在 Shannon 1949 的文章中,介绍了替代( Substitution )-置换( Permutation )网络的思想,即SP网络。这种思想形成了现代密码的基础,SP网络是替代-置换乘积密码的现代形式。
SP网络是基于下列两种最基本的密码运算: 替代( Substitution )、置换( Permutation )
在密码设计中,可选 n = r ⋅ n 0 n=r·n_0 n=r⋅n0,其中 r 和 n 0 n_0 n0 都为正整数,将设计 n 个变量的代换网络化为设计 r 个较小的子代换网络,而每个子代换网络只有 n 0 n_0 n0 个输入变量。称每个子代换网络为代换盒(Substitution Box)。如下图中 DES 算法中的代换 S 盒。
这三点使DES的S盒能够实现较好的混淆。
2.2 Feistel密码体制
1.分组密码的设计原则: 既然理想分组密码不太实用,那么我们可以从密码设计的本源进行探索,一个足够安全且实用的密码系统具有什么特征?
香农引进了混淆和扩散两个概念。
(1)扩散:
所谓扩散,就是使明文和密文之间的关系尽可能复杂,使明文中原有的统计规律在密文中消失。即无法通过密文来获知有关明文的任何信息。可以通过让明文中的多个位对密文的一位造成影响,从而造成扩散(这也是命名为扩散的原因)。实际中,可以对明文进行置换,然后使用多个函数多次对其作用,就能产生这样的效果。(如下面的 Feistel 密码机制)
(2)混淆
混淆是指使密文和密钥之间的关系尽可能复杂,即无法通过密文来推断出密钥。
扩散和混淆简明扼要地抓住了现代分组密码设计的最核心的本质。
2.乘积密码体制:
所谓乘积密码体制,就是指顺序地执行两个或多个基本密码系统,使得最后结果的密码强度高于每个基本密码系统产生的结果,达到扩散和混淆的效果。Feistel 建议多次使用古典密码中的两个重要方法:代替和置换。这种密码体制本质上密钥长度为 k k k 位,每一种密钥可以产生一个唯一的可逆映射表,因此可以产生的可逆映射表数量为 2 k 2^k 2k ,小于理想分组密码的可逆映射表数 2 n ! 2^n ! 2n! 。这种密码体制是向理想分组密码体制的一种逼近。
3.Feistel密码体制的描述:
一个 Feistel 密码体制包含 16 轮迭代和一次左右置换。如下图所示:
Feistel 网络分组密码实现的参数
1、分组大小: 分组越大则安全性越高,但加密速度就越慢。
2、密钥大小:密钥越长则安全性越高,但加密速度就越慢。
3轮数:单轮结构远不足以保证安全性,但多轮结构可提供足够的安全性。 典型地,轮数取为16。
4、子密钥产生算法:该算法的复杂性越大,则密码分析的困难性就越大。 5 轮函数:轮函数的复杂性越大,密码分析的困难性也越大。
4、Feistel 加密结构
输入是分组长为 2 w 2w 2w的明文和一个密钥 K K K。将每组明文分成左右两半 L 0 L_0 L0和 R 0 R_0 R0,在进行完 n n n轮迭代后,左右两半再合并到一起以产生密文分组。第 i i i 轮迭代的输入为前一轮输出的函数:
{ L i = R i − 1 R i = L i − 1 ⊕ F ( R i − 1 , K i ) \left\{\begin{matrix} L_i = R_{i-1} \\ R_i = L_{i-1} \oplus F(R_{i-1}, K_i) \end{matrix}\right. {Li=Ri−1Ri=Li−1⊕F(Ri−1,Ki)
5、Feistel解密结构
6、Feistel密码解密的正确性
一般地,加密过程中的第 i 轮有
L
E
i
=
R
E
i
−
1
R
E
i
=
L
E
i
−
1
⊕
F
(
R
E
i
−
1
,
K
i
)
\begin{array}{l} L E_{i}=R E_{i-1} \\ R E_{i}=L E_{i-1} \oplus F\left(R E_{i-1}, K_{i}\right) \end{array}
LEi=REi−1REi=LEi−1⊕F(REi−1,Ki)
因此可得解密过程:
R
E
i
−
1
=
L
E
i
L
E
i
−
1
=
R
E
i
⊕
F
(
R
E
i
−
1
,
K
i
)
=
R
E
i
⊕
F
(
L
E
i
,
K
i
)
\begin{array}{l} R E_{i-1}=L E_{i} \\ L E_{i-1}=R E_{i} \oplus F\left(R E_{i-1}, K_{i}\right)=R E_{i} \oplus F\left(L E_{i}, K_{i}\right) \end{array}
REi−1=LEiLEi−1=REi⊕F(REi−1,Ki)=REi⊕F(LEi,Ki)
注意:这里并没有要求轮函数 F 可逆,轮函数 F 是否可逆不会影响整个轮变换的可逆性。由于每个轮迭代都是可逆的,所以整个 16 轮迭代的输入输出都是可逆的。在解密时,只需将加密得到的密文输入,然后倒着使用加密过程的16轮轮迭代即可。
DES(Data Encryption Standard)是 1977 年美国国家标准局颁布的信息处理标准,多年来,DES是主流的对称加密算法。但现在DES已经不太安全了。DES主要采用了Feistel加密体制,是一种分组密码加密体制。
DES有两个输入,分别是分组长度为64位的明文,和长度为56位的密钥(实际为64位,剩下的8位可以作为奇偶校验码或随意设置)。
其加密过程如下,首先对64位明文进行初始置换,然后进行16轮的轮迭代(与Feistel密码体制完全相同),最后再进行一次逆初始置换,得到密文。每轮的密钥由一个专门的算法产生。
DES 加密过程简图如下:
1.初始置换和逆初始置换:
初始置换(Initial Permutation, IP)和逆初始置换( I P − 1 IP^{-1} IP−1 )是位于DES开始和结尾的两个置换。输入两个置换表的输入都是64位,输出的结果也是64位,具体置换规则是,将64位输入从1到64编号,然后按照表中的数字,将对应的编号位置上的数据位放到当前的位置上,即完成置换。初始置换表和逆初始置换表是互逆的,即满足 p = I P − 1 ( I P ( p ) ) p = IP^{-1}(IP(p)) p=IP−1(IP(p)) 。关于初始置换和逆置换表在此省略,关于算法细节推荐看后面推荐文章。
2.轮变换(轮迭代)的细节过程:
明文经过初始置换后,就进入了16轮轮迭代的过程。每轮迭代如上图左侧所示。(右侧为轮密钥产生方法)。与前面所讲的Feistel密码体制一样,经过初始置换的64位明文,被分成了左右32位: L i L_i Li 和 R i R_i Ri,然后经历下面的变换:
{ L i = R i − 1 R i = L i − 1 ⊕ F ( R i − 1 , K i ) \left\{\begin{matrix} L_i = R_{i-1} \\ R_i = L_{i-1} \oplus F(R_{i-1}, K_i) \end{matrix}\right. {Li=Ri−1Ri=Li−1⊕F(Ri−1,Ki)
其中 R R R 为 32 位,参与轮函数 F 的密钥 k 为48位(之后会讲密钥产生方法)。即输入为 (x , y) ,则 DES 的轮函数输出为: ( y , x ⊕ f k ( y ) ) (y, x \oplus f_k(y)) (y,x⊕fk(y)),它等价于两个对合变换的复合 (对合变换指经过两次变换后,回到初始本身状态信息):
( x , y ) → ( x ⊕ f ( k , y ) , y ) → ( y , x ⊕ f ( k , y ) ) (x,y) \rightarrow (x \oplus f(k,y),y) \rightarrow (y,x \oplus f(k,y)) (x,y)→(x⊕f(k,y),y)→(y,x⊕f(k,y)) , 外层复合的对合函数为 ( a , b ) → ( b , a ) (a, b)\rightarrow \ (b, a) (a,b)→ (b,a)
无论 f f f 函数如何选取,DES 的轮函数都是一个对合变换。 F ( x , y ) = ( x ⊕ f ( k , y ) , y ) F(x, y ) = (x \oplus f(k,y),\ y) F(x,y)=(x⊕f(k,y), y)
即 F ( F ( x , y ) ) = F ( x ⊕ f ( k , y ) , y ) = ( ( x ⊕ f ( k , y ) ) ⊕ f ( k , y ) , y ) = ( x , y ) F(F(x, y))=F(x \oplus f(k, y), y)=((x \oplus f(k, y)) \oplus f(k, y), y)=(x, y) F(F(x,y))=F(x⊕f(k,y),y)=((x⊕f(k,y))⊕f(k,y),y)=(x,y)
其中轮函数包含这么几个过程:进入轮函数中的32位的 R i − 1 R_{i-1} Ri−1 首先要经过一个扩展置换 E ,被扩展为48位,置换规则与初始置换相同。其后,被扩展出的48位与密钥 $ k_i $ 进行按位异或,得出 48 位的结果。之后,这48位将进入一个代替函数,产生出32位的输出。这个代替函数由8个S盒组成。查表规则如下图所示,每个 S 盒都对应着一个代换表格。
3.密钥产生算法,DES密钥编排
DES的密钥实际有64位,在输入密钥后,对其1-64位按顺序编号,
4、多重 DES
如果一个分组密码易受到穷举密钥搜索攻击,那么对同一消息加密多次就 有可能增强安全性.
多重DES就是使用多个密钥利用DES对明文进行多次加密。使用多重DES可以 增加密钥量,从而大大提高抵抗穷举密钥搜索攻击的能力
多重加密类似于一个有着多个相同密码的级联,但各级密码无需独立,且 每级密码既可以是一个分组密码加密函数,也可是相应的解密函数
双重DES
简单的对消息xi利用两个不同的密钥进行两次加密,目的是为了抵抗穷搜索攻击,期望密钥长度扩展为112比特。
三重DES中三个密码组件既可以是一个加密函数,也可以是一个 解密函数。当k1=k3时,则称为双密钥三重DES 。
优点:
缺点:
(1)相同明文分组对应相同密文分组
(2) 不能隐蔽明文分组的统计规律和结构规律,不能抵抗替换攻击
应用:
(1) 用于随机数的加密保护
(2) 用于单分组明文的加密。一个分组长度的短数据加密。
密码分组链接CBC (Cipher Block Chaining)模式
CBC模式的特点
利用CBC模式实现报文的完整性认证
密码反馈 CFB(Cipher Feedback)模式
CFB 模式的特点
输出反馈 OFB (Output Feedback)模式
OFB 工作模式的特点
四类工作模式比较和选用: ECB,CBC,CFB,OFB
1、明文不易丢信号,对明文的格式没有特殊要求的环境可选用CBC模式。需要完整性认证功能时也可选用该模式。
2、容易丢信号的环境,或对明文格式有特殊要求的环境,可选用CFB模式。
3 不易丢信号,但信号特别容易错,且明文冗余特别多,可选用OFB模式。
计数器模式 CTR
CTR的优点
因为 AES 中的相关操作都定义在 G F ( 2 8 ) GF(2^8) GF(28) 有限域上,故在了解学习 AES 之前,先了解一下有限域的相关操作。
1、什么是域
F 是一个非空集合,定义了加法、乘法两个二元运算,对这两个运算封闭
加法满足: 对于任意 a , b , c ∈ F a,b,c∈F a,b,c∈Fa
乘法满足:对于任意 a , b , c ∈ F a,b,c∈F a,b,c∈Fa
乘法对加法满足分配率
2、域的例子
1、数域
2、多项式
3、AES 中的处理单元表示以及运算
AES 加密标准算法中是以字节为处理单元。AES 中的字节表示方法:可以将每一字节看作是有限域 G F ( 2 8 ) GF(2^8) GF(28) 上的一个元素,分别对应于一个次数不超过 7 的多项式。如 b 7 b 6 b 5 b 4 b 3 b 2 b 1 b 0 b_7b_6b_5b_4b_3b_2b_1b_0 b7b6b5b4b3b2b1b0 可表示为多项式 b 7 x 7 + b 6 x 6 + b 5 x 5 + b 4 x 4 + b 3 x 3 + b 2 x 2 + b 1 x 1 + b 0 b_7x^7+b_6x^6+b_5x^5+b_4x^4+b_3x^3+b_2x^2+b_1x^1+b_0 b7x7+b6x6+b5x5+b4x4+b3x3+b2x2+b1x1+b0 ,还可以将每个字节表示为一个十六进制数,即每 4 比特表示为一个十六进制 数,代表较高位的4比特的符号仍在左边。例如,01101011 可表示为 6B
它们之间的运算为$GF(2^8) $中的运算.
在定义了 AES 中字节的表示方法后,我们来定义在 G F ( 2 8 ) GF(2^8) GF(28) 中的运算。
G F ( 2 8 ) GF(2^8) GF(28) 中的逆元和 x 乘法
定义: 对任何次数小于 8 的多项式 b(x),可用推广的欧几里得算法得 b ( x ) a ( x ) + m ( x ) c ( x ) = 1 b(x)a(x)+m(x)c(x)=1 b(x)a(x)+m(x)c(x)=1
即 a ( x ) ⋅ b ( x ) = 1 m o d m ( x ) a(x)·b(x)=1 mod m(x) a(x)⋅b(x)=1modm(x)。因此 a(x) 是 b(x) 的乘法逆元。
定义: 函数 x t i m e ( x ) xtime(x) xtime(x) 定义为 G F ( 2 ) GF(2) GF(2) 上的 x ⋅ b ( x ) x·b(x) x⋅b(x)。其运算如下: 若 b 7 = 0 b_7 =0 b7=0,则 x ⋅ b ( x ) x·b(x) x⋅b(x) 的结果就是把字节 b 左移一位,且在最右边补上上0; 若b7 =1,则先对 b(x) 在字节内左移一位(最后一位补0),则再与 ‘ 1 B ’ ( 00011011 ) ‘1B’(00011011) ‘1B’(00011011) 做逐比 特异或。
定义 xtime 函数的原因就是它比多项式乘法更加高效,是 G F ( 2 8 ) GF(2^8) GF(28) 上的快速乘法。
x t i m e ( x ) xtime(x) xtime(x) 例子
G F ( 2 8 ) GF(2^8) GF(28) 上的模多项式运算
4、AES 提出的背景及其框架参数说明
1、AES 提出的背景
2、AES 框架参数及其说明简述
3、 AES 的轮函数
字节代换
非线性代换,独立地对状态的每个字节进行,并且代换表(S盒) 可逆,记为ByteSub(State),分两步
行移位
列混淆
轮密钥加
4、AES的密钥编排及伪代码
秘钥编排
秘钥扩展
轮常数
•以上两个算法中, R c o n [ i / N k ] Rcon[i/Nk] Rcon[i/Nk] 为轮常数,其值与Nk无关,定义 为(字节用十六进制表示,同时理解为 G F ( 2 8 ) GF(2^8) GF(28)上的元素):
R c o n [ i ] = ( R C [ i ] , ‘ 00 ’ , ‘ 00 ’ , ‘ 00 ’ ) Rcon [i]=(RC[i], ‘00’, ‘00’, ‘00’) Rcon[i]=(RC[i],‘00’,‘00’,‘00’) 其中 R C [ i ] RC[i] RC[i] 是 G F ( 2 8 ) GF(2^8) GF(28) 中值为$x^{i-1} 的元素,因此
R C [ 1 ] = 1 ( 即 ‘ 01 ’ ) 、 R C [ i ] = x ( 即 ‘ 02 ’ ) ⋅ R C [ i − 1 ] = x i − 1 RC[1] =1(即‘01’)、 RC[i] = x(即‘02’)·RC[i-1]= x^{i-1} RC[1]=1(即‘01’)、RC[i]=x(即‘02’)⋅RC[i−1]=xi−1
轮密钥选取
轮密钥i (即第i 个轮密钥) 由轮密钥缓冲字 W[Nb* i] 到 W[Nb*(i+1)]给出,如图所示,更详细的不走可参见 here
Cipher(byte in[4*Nb], byte out[4*Nb], word w[Nb*Nr+1]) begin byte state[4,Nb] state = in AddRoundKey(state, w[0, Nb-1]) for round = 1 step 1 to Nr-1 SubBytes(state) ShiftRows(state) MixColumns(state) AddRoundKey(state, w[round*Nb, (round+1)*Nb-1]) end for SubBytes(state) ShiftRows(state) AddRoundKey(state, w[Nr*Nb, (Nr+1)*Nb-1]) Out = state end
InvCipher(byte in[4*Nb], byte out[4*Nb], word w[Nb*Nr+1]) begin byte state[4,Nb] state = in AddRoundKey(state, w[Nr*Nb, (Nr+1)*Nb-1]) for round = Nr-1 step -1 downto 1 InvShiftRows(state) InvSubBytes(state) AddRoundKey(state, w[round*Nb, (round+1)*Nb-1]) InvMixColumns(state) end for SubBytes(state) ShiftRows(state) AddRoundKey(state, w[0, Nb-1]) Out = state end
KeyExpansion (byte key[4*Nk] , word w[Nb*(Nr+1)], Nk) begin word temp i=0 while (i<Nk) w[i]=word(Key[4* i], Key[4* i +1], Key[4* i +2], Key[4* i +3] ) i=i+1 end while i=Nk while(i<Nb*(Nr+1)) temp=W[i-1] if (I mod Nk= =0) temp=SubByte (RotByte (temp)) xor Rcon[i /Nk] else if (Nk>6 and i mod Nk = 4) temp=SubWord(temp) end if w[i]=w[i-Nk ] xor temp end while end
4、SM4 (商密)
SM4概况
SM4 算法的术语说明
Z 2 e Z_2^e Z2e 表示 e-比特的向量集, Z 2 8 Z_2^8 Z28 中的元素称为字节, Z 2 32 Z_2^{32} Z232 中的元素为字
S 盒是一个固定的 8 比特输入 8 比特输出的置换,记为Sbox(.)
SM4 中的采用了两个基本运算: ⊕ \oplus ⊕,32 比特异或; < < < i <<< i <<<i,32 比特循环左移 i 位。
SM4 算法的加密密钥长度为 128 比特,表示为 M K = ( M K 0 , M K 1 , M K 2 , M K 3 ) MK = (MK_0, MK_1, MK_2, MK_3) MK=(MK0,MK1,MK2,MK3)
其中, M K i i = 0 , 1 , 2 , 3 MK_i\ i= 0,1,2,3 MKi i=0,1,2,3 为字。
• 轮密钥为 ( r k 0 , r k 1 , ⋅ ⋅ ⋅ , r k 31 ) , r k i (rk_0,rk_1,···,rk_{31}), rk_i (rk0,rk1,⋅⋅⋅,rk31),rki 为字。轮密钥由加密密钥通过密钥扩展算法生成。
• F K = ( F K 0 , F K 1 , F K 2 , F K 3 ) FK = (FK_0,FK_1,FK_2,FK_3) FK=(FK0,FK1,FK2,FK3)为系统参数,
• C K = ( C K 0 , C K 1 , ⋅ ⋅ ⋅ , C K 31 ) CK = (CK_0 ,CK_1, ··· , CK_{31}) CK=(CK0,CK1,⋅⋅⋅,CK31) 为固定参数,用于密钥扩展算法。
SM4 加密算法整体结构
SM4 的轮函数
X i + 4 = F ( X i , X i + 1 , X i + 2 , X i + 3 , r k i ) = X i ⊕ T ( X i + 1 ⊕ X i + 2 ⊕ X i + 3 ⊕ r k i ) , i = 0 , 1 , ⋯ , 31 X_{i+4}=F\left(X_{i}, X_{i+1}, X_{i+2}, X_{i+3}, r k_{i}\right)=X_{i} \oplus T\left(X_{i+1} \oplus X_{i+2} \oplus X_{i+3} \oplus r k_{i}\right), \quad i=0,1, \cdots, 31 Xi+4=F(Xi,Xi+1,Xi+2,Xi+3,rki)=Xi⊕T(Xi+1⊕Xi+2⊕Xi+3⊕rki),i=0,1,⋯,31
其中 T : Z 2 32 → Z 2 32 T : Z_2^{32} \rightarrow Z_2^{32} T:Z232→Z232 称为合成置换,是一个由非线性变换和一个线性变换复合而成的可逆变换,即 T ( . ) = L ( τ ( . ) ) T (.) = L(\tau (.)) T(.)=L(τ(.))
如下是 SM4 的加密算法和解密算法以及秘钥扩展算法示意图