-
本节学习如何设计一个PRP,一个经典的PRP构造DES,并介绍AES。
-
目录:替换-置换网络、Feistel网络、DES、增加密钥长度、AES、差分分析与线性分析
-
块(分组)密码(Block Ciphers)
-
块密码
$F : {0,1}^n \times {0,1}^\ell \to {0,1}^\ell$ . 是一个带密钥的函数。$F_k : {0,1}^\ell \to {0,1}^\ell$ ,$F_k(x) \overset{\text{def}}{=} F(k,x)$ .$n$ 是密钥长度,$\ell$ 是块长度. -
构造是启发式的,而非被证明了的;
-
在实践中,块密码被当作是一个PRP,而非加密方案;在之前AES的提案召集中要求,算法输出的范围应该与输入块的随机排列是不可区分的;
-
方案被认为是“优秀的”,如果已知的最佳攻击具有的时间复杂性与蛮力搜索密钥大致相当
- 一个$n=112$的加密方案,可以在$2^{56}$时间内被破解是不安全的;
- 在渐进设定中,尽管$2^{\frac{n}{2}}$是指数,但与上面的例子一样,实际可能不安全;
-
-
漫画
- 略
-
混淆-扩散范式(The Confusion-Diffusion Paradigm)
- 目标:构造“简洁”的看上去随机的排列;强调“简洁”的原因在于直接存储随机排列所需的空间太大,需要
$2^{n\cdot 2^n}$ 比特; - 为此,香农提出了一种实现伪随机排列的方法——混淆-扩散范式;
- 混淆:令密钥和密文的关系尽可能地复杂和难懂;一个大的随机排列$F_k(x)$可以由若干小随机排列$f_i(x_i)$来构造,将一个大输入分为若干小输入,$F_k(x) = f_1(x_1)f_2(x_2) \cdots f_{i}(x_{i})$;
- 扩散:在明文统计特征中的冗余性在密文统计特征被消去;其中,统计“冗余性”是指明文中一部分信息可以从;
- 目标:构造“简洁”的看上去随机的排列;强调“简洁”的原因在于直接存储随机排列所需的空间太大,需要
-
替换-置换网络(Substitution-Permutation Network)
- 一种混淆-扩散范式的设计是替换-置换网络(SPN),如图所示:
- 明文首先与密钥混合(例如,异或);进行混淆
- 经过S盒的替换操作;进行混淆
- 经过P盒的置换操作;进行扩散
- 进入下一轮
- 一个关键点是在结尾需要有一次密钥混淆操作,否则最后一轮替换和置换操作都是无效的;
- 一种混淆-扩散范式的设计是替换-置换网络(SPN),如图所示:
-
设计原则1——S盒的可逆性
- S盒必须是可逆的,否则块密码不是排列;这可以从SPN构造中观察到,其中密钥混合(异或)和P盒(置换)都是排列操作,为了令SPN是排列,那剩下的S盒必须是可逆的;
- 定理:令$F$为一个带密钥的函数,该函数由一个SPN定义,其中的S盒是1对1的且满射。无论密钥生成方案和轮次,$F_k$是对于任意$k$都是一个排列;
-
设计原则2——雪崩效应(Avalanche Effect)
- 雪崩效应:改变输入的一个比特影响输出的每个比特;
- 严格雪崩条件:一个输入比特取补,每个输出比特都有50%的概率改变;
- 比特独立条件:对于任意$i, j, k$,当改变一个输入比特$i$时,输出比特
$j$ 和$k$ 应该独立改变; - S盒:改变1比特输入会改变至少2比特输出;
- P盒:每个S盒的输出都被扩散到下一轮的不同S盒;
- 问题:对于4比特的S盒,改变输入的1个比特,在经过$R$轮的SPN后,影响输出的$2^R$个比特;
-
一个针对块密码的KPA框架
- KPA:知道同一密钥下的若干明文/密文对;
- 分析步骤:
- 观察明文、密文、密钥之间的关系;
- 设计基于上面关系的$t$比特的测试;
- 搜索$k$比特空间;一个猜测的密钥通过测试的概率为$2^{-t}$;
- 用$p$对明文/密文对来确定密钥的期望是$2^{k-pt}$;期望足够小就可以,例如$2^{-10}$;
- 分析16比特密钥的一轮SPN下的KPA:
- 尽管这个例子“简单”得缺乏意义,但可以展示上述框架如何应用;
- 之前提到的一个关键点是在结尾需要有一次密钥混淆操作,否则最后一轮替换和置换操作都是无效的。**因此,这个结构并不是一个完整的一轮SPN。在教材的第二版在这方面存在一个修正。**这里我们沿用第一版的内容,因为更容易理解,并且不影响对缩减了轮次的SPN存在弱点的分析。
- 关系:PT
$\oplus$ Key$\oplus$ Input-of-$S$-boxes$=$ 0;其中,根据SPN的可逆性,S盒输入可以通过密文得到; - 测试:$t=16$ 比特,因为Input-of-$S$-boxes
$=$ PT$\oplus$ Key; - 搜索:密钥空间$k=16$比特;通过测试的概率是$2^{-16}$;
- 确定:使用$p=1$对明文/密文对来确定密钥,期望为$1$;
-
攻击轮次减少的SPN(作业)
- 攻击一个1轮SPN:64比特块,128比特密钥(2个64比特子密钥),16x4比特的S盒,以及用异或来实现密钥混合;
- 根据图中关系可以观察到,根据明文和密文知道的20个比特,密钥中未知的20个比特,以及4个比特来比较;
- 猜测20比特密钥:第一个子密钥的16比特,第二个字密钥的4个比特;
- 通过4比特测试的概率$2^{-4}$;
- 需要8对明文/密文对来确定密钥使得期望小于1,期望$2^{20-4\times 8}$;
- 破解的复杂性为$8\cdot 2^{20} \cdot 16= 2^{27} \ll 2^{128}$ ,其中,8是明文/密文对数,16是S盒数量(因为每次猜测只覆盖1个S盒对应的第2个子密钥中4个比特);
-
Feistel网络
- 为了构造排列,要求SPN网络中S盒是可逆的,这对S盒的设计提出了要求;那么,能不能放松对S盒设计需求,同时保留排列的?
- Feistel网络可以满足上面的需求:从若干非可逆组件构造一个可逆函数;
-
$L_i := R_{i-1}$ 并且$R_i := L_{i-1} \oplus f_i(R_{i-1})$ ; - 求逆:
$L_{i-1} :=\ ?$ - Luby-Rackoff定理:无论mangler函数$f_i{}$和轮次,对于任意$k$,$F_k$是一个排列;
-
Feistel网络的例题
- 问题:当输入($L_0, R_0$)是下面两个情况中之一时,一个$r$轮Feistel网络的输出是什么?
- 每个轮函数输出都是$0$,无论输入是什么;
- 每个轮函数输出都是一个恒等函数,即输入和输出相同;
- 问题:当输入($L_0, R_0$)是下面两个情况中之一时,一个$r$轮Feistel网络的输出是什么?
-
DES设计
- 16轮的Feistel网络;64位块;56位密钥,48位子密钥 (64位密钥带有8个校验位)
- 密钥编排: 56 bits
$\xrightarrow[\text{left rotation, PC}]{\text{divided into two halves}}$ 48 bits. - 以初始排列开始 (
$IP$ ) 以$IP^{-1}$ 结束; - 轮函数
$f$ 是一个 32位 I/O 的不可逆函数; -
$f_i$ 由mangler函数$\hat{f}_i$ 和子密钥$k_i$ 来确定; -
$S$ 盒是 4 到1 函数,将6位映射为4位;
-
DES算法概览
- 略
-
DES的Mangler函数
- 略
-
DES中S盒例子
- 略
-
密钥编排
- 略
-
弱密钥
- 弱密钥:DES的密钥编排会产生相同的子密钥
- 半弱密钥:产生两个不同的子密钥
- 这些情况发生时,应该更换密钥
-
DES编年史
-
DES经历了一个从成为加密标准到安全性不足、到安全性增强、到被彻底破解的历程;
-
[1973] NBS (NIST) 发布标准召集公告;
-
[1974] DES 在联邦政府公告发布;
-
[1977] DES 被发布为 FIPS PUB 46;
-
[1990]
$2^{47}$ 个明文的CPA下差分分析; -
[1997] DESCHALL 项目公开破解DES;
-
[1998] EFF(电子前沿基金会)的Deep Crack在56小时内花费$250,000破解DES;
-
[1999] 三重 DES
-
[2001] AES 在 FIPS PUB 197 发布;
-
[2004] DES标准 FIPS PUB 46-3 被撤销;
-
[2006] COPACOBANA 在9天内花费1万美元破解DES;
-
[2008] RIVYERA 在1天内破解 DES;
-
-
双重加密
- 为了弥补DES密钥长度不足的缺点,增强加密安全性有两种思路:从内部修改 vs. 黑盒构造;
- 从内部修改不可行,因为即使以最小的方式修改DES,也将失去我们已经从DES获得的信心;
- 双重加密:$y = F'{k_1,k_2}(x) \overset{\text{def}}{=} F{k_2}(F_{k_1}(x))$;
- 密钥长度乘2会更安全吗?
-
中间相遇攻击(The Meet-In-the-Middle Attack)
-
双重加密在**中间相遇攻击(MITM)**下并不比原本的DES更安全;
-
在已知明文攻击(KPA)下,从输入方向输入一个明文,通过一次DES加密,猜测不同密钥来得到一组中间值,保存这些密钥和中间值对;从输出方向反向输入一个密文,通过一个DES解密,猜测不同密钥来得到另一组中间值,也保存这些密钥和中间值对;这两组中间值中相同的为$z_0$,相应的两个密钥$k_1$和$k_2$就可能是实际密钥。
-
$z_0 = F_{k_1}(x) = F^{-1}{k_2}(y) \iff y = F'{k_1,k_2}(x)$.
-
密钥对
$(k_1,k_2)$ 满足上面等式的概率为$2^{-n}$ ;因为中间值有$2^n$中可能; -
这样的密钥对数量为
$2^{2n}/2^n = 2^n$ ;这是密钥对数量乘以满足等式的概率; -
用另两个明文/密文对,密钥对的期望数量为
$2^{n}/2^{2n}=2^{-n}$ . 足够小,因此剩下的就是密钥! -
$\mathcal{O}(2^n)$ 时间复杂性并且$\mathcal{O}(2^n)$ 空间复杂性,这是一种典型的空间换时间的设计; -
可见,双重DES在时间复杂性上与DES没有区别。
-
-
DESX(XEX模式)
- 为了增强DES并对抗中间相遇攻击,DESX通过密钥白化来增加有效密钥长度;
- 白化(whitening):一个**xor-enc-xor(XEX)**模式,用部分密钥来与输入和输出进行异或;
- DESX:$k = (k_1,k_2,k_3), |k_1|=|k_3|=64, |k_2|=56$;
- 加密
$y = k_3\oplus F_{k_2}(x \oplus k_1)$ ; - 解密
$x = k_1\oplus F^{-1}_{k_2}(y \oplus k_3)$ ; - 安全性:$|k|=184$,在MITM攻击下,破解所需时间
$2^{64+56}$ ;原因在于,为了获得中间值需要从输入或输出中一个方向猜测2个密钥;
-
三重加密(Triple Encryption)
- 三重DES Triple-DES (3DES):以连续的加密,解密,加密三个DES来加密明文,根据密钥选择分三种情况:
-
$k_1 = k_2 = k_3$ : 相当于一次DES,向后兼容,即采用该方案的通信方可以与采用普通DES的通信方互相通信; -
$k_1 \neq k_2 \neq k_3$ : 在MITM攻击下,破解时间为$2^{2n}$ ;这与DESX类似,某个方向需要猜测两个密钥; -
$k_1 = k_3 \neq k_2$ : 只有两个不同密钥,用一个I/O对的破解时间为$2^{2n}$ ; 用$2^{n}$个I/O对的破解时间为$2^n$ ;
-
- 安全性更强,但块长度仍然不变并且更慢;
- 三重DES Triple-DES (3DES):以连续的加密,解密,加密三个DES来加密明文,根据密钥选择分三种情况:
-
高级加密标准 AES(The Advanced Encryption Standard)
- 1997年,NIST召集高级加密标准 AES提案;
- 2001年,J. Daemen 和 V. Rijmen设计的Rijndael成为AES;
- AES是第一个用于绝密信息的公开可用密码;
- 设计目标不仅包括安全,还包括有效性和灵活性等;
- 128位块长度,128,192,或256位密钥;
- 并非一个Feistel结构,而是一个SPN;
- 对于减少轮次的变体只有非简单的攻击:
- 对于 6/10轮的128位密钥,$2^{27}$ 时间;
- 对于 8/12轮的192位密钥,$2^{188}$ 时间;
- 对于 8/14轮的 256位密钥,$2^{204}$ 时间;
-
AES概览
- 动画
-
线性密码分析(Linear Cryptanalysis)
-
下面内容来自于“A Tutorial on Linear and Differential Cryptanalysis”
-
针对DES的密码学分析的重点是分析S盒,因为S盒是DES中唯一的非线形部分,输入和输出之间关系被有意地设计成难以简单描述;线性分析就是要通过分析来寻找输入和输出之间的线性关系,从而破解加密方案;
-
在输入和输出之间的线性分析:对于随机选择的输入$x$和密钥$k$,有
$y=F_k(x)$ ,在比特位置$i_1, ... ,i_\ell$ 与$i_1', ... , i_\ell'$ 之间存在偏差(bias)$p$ , 之所以称为“偏差”,是与“正常”概率$\frac{1}{2}$相比而言;$ \Pr [x_{i_1} \oplus \cdots \oplus x_{i_\ell} \oplus y_{i_1'} \oplus \cdots \oplus y_{i_\ell'} = 0] = p+\frac{1}{2}. $
线性关系就是指这些比特的异或值的统计结果与随机值之间存在偏差,无论异或结果为0还是为1,重点在于这些位置比特之间存在线形关系。
-
当偏差较大时,如极端情况$p=\frac{1}{2}$,可以认为输入中若干位置异或值等于输出中若干位置异或值;
-
采用KPA(无需CPA)进行线性分析攻击的步骤:
- 构造S盒的线性近似表(linear approximation table),从而穿透S盒;
- 构造带有较大偏差的$r$轮SPN的前$r-1$轮的线性近似关系,从而建立了明文和最后一轮输入的线性关系;
- 根据已知的最后一轮输入和输出提取最后一轮的子密钥中若干比特,这部分密钥满足上一步建立的线性近似关系;
-
-
一个对S盒进行线性分析的例子
- 以一个4位到4位的S盒为例,图中表格按列分为三个部分:$X$各比特值,$Y$各比特值,线性关系($X$中若干比特异或值,$Y$中若干比特异或值,本例子中列出了3组);按行共16行,每行对应一个$X$值,内容包括(由S盒决定的)相应的$Y$值和线性关系;
- 以第一行为例,$X=0000$,根据S盒构造可知$Y = 1110$;第一组线性关系,$X_2 \oplus X_3 = 0 \oplus 0 = 0$,$Y_1 \oplus Y_3 \oplus Y_4 = 1 \oplus 1 \oplus 0 = 0$;
- 统计$X_2 \oplus X_3 $等于$Y_1 \oplus Y_3 \oplus Y_4 $的情况,一共12个;偏差为$12 - 16/2 = 4$;
-
一个线性分布表的例子
- 将$X$/$Y$中选择的比特位置表示为一个16进制整数来作为行号/列号,其中选中的位置为1,未选中的为0;例如,$X_2 \oplus X_3 $中选择了第2、3比特,表示为0110 = 6;$Y_1 \oplus Y_3 \oplus Y_4 $中选择了第1、3、4位,表示为1011 = B;
- 根据此前对S盒的线性分析结果在表格中填入偏差;例如,$(6, B)=4$;
- 至此,我们可以认为S盒被“穿透了”:找到了S盒上输入与输出的线性关系;
-
一个线性密码分析的例子
-
从上向下,第一轮S盒线性分析结果为$S_{1,2}$:
$x_1 \oplus x_3 \oplus x_4 = y_2$ ;其中,S盒输入$x_1, x_3, x_4$为明文和第一轮子密钥中$p_5, p_7, p_8$和$k_{1,5}, k_{1,7}, k_{1,8}$的异或值; -
第2轮S盒线性分析结果为$S_{2,2}$:
$x_2 = y_2 \oplus y_4$ ,输出的2个比特影响最后一轮的2个S盒输入$u_{3,6}, u_{3,14}$。 -
将输入、密钥和最后一轮S盒输入间关系表达出来:$ p_5 \oplus p_7 \oplus p_8 \oplus k_{1,5} \oplus k_{1,7} \oplus k_{1,8} \oplus k_{2,6} \oplus k_{3,6} \oplus k_{3,14} = u_{3,6} \oplus u_{3,14} $,
其中,密钥比特异或部分$\Sigma{k} = k_{1,5} \oplus k_{1,7} \oplus k_{1,8} \oplus k_{2,6} \oplus k_{3,6} \oplus k_{3,14}$ 是由密钥决定的一个固定的值。根据前面线性关系的含义,无论$\Sigma{k}$是0还是1,都有一个线性关系$ p_5 \oplus p_7 \oplus p_8 = u_{3,6} \oplus u_{3,14} $;
-
从SPN的输出反向分析,$u_{3,6} \oplus u_{3,14} $ 由密文和第4个子密钥的所有偶数位异或值决定;
-
猜测第4个子密钥的所有偶数位,满足上面线性关系的就可能是真的密钥;需要$2^8$时间;
-
重复上面的过程,逐渐获得所有密钥;
-
-
差分密码分析(Differential Cryptanalysis)
-
与线性分析类似,但分析的是特定输入差异
$\Delta_X$ 产生特定输出差异$\Delta_Y$ 的概率$p \gg 2^{-n}$ ,$x_1\oplus x_2=\Delta_X$ ,$F_k(x_1) \oplus F_k(x_2)=\Delta_Y$ 的概率$p$ . -
当$p$远大于随机概率$2^{-n}$时,可以认为输入差异与输出差异间存在关系;
-
这个攻击需要通过CPA进行,因为需要构造特定输入差异,攻击步骤:
- 构造S盒的差分分布表(difference distribution table)穿透S盒;
- 构造带有较大偏差的$r$轮SPN的前$r-1$轮的差分特征,从而建立了明文和最后一轮输入的差分特征关系;
- 根据已知的最后一轮输入和输出提取最后一轮的子密钥中若干比特,这部分密钥满足上一步建立的差分特征关系;
-
-
一个对S盒进行差分分析的例子
- 以一个4位到4位的S盒为例,图中表格按列分为三个部分:$X$各比特值,$Y$各比特值,差分结果($\Delta_X$下的$\Delta_Y$,本例子中列出了3组);按行共16行,每行对应一个$X$值,内容包括(由S盒决定的)相应的$Y$值和$\Delta_Y$值;
- 以第一行第一列为例,$X=0000$,根据S盒构造可知$Y = 1110$;根据$\Delta_X = 1011$,可知
$X' = \Delta_X \oplus X = 1011$ ,进而得到$Y' = 1100$ ,有$\Delta_Y = Y \oplus Y' = 0010$ ; - 统计不同$\Delta_X$时$\Delta_Y$各个值的频率,找出频率较高的情况,例如0010出现了8次;
-
一个差分分布表的例子
- 将$\Delta_X$和$\Delta_Y$用16进制整数来表示,作为行号/列号,其中填入出现频率;例如,$\Delta X = 1011 = B, \Delta Y = 0010 = 2$,出现了8次,于是
$(B, 2) = 8$ ; - 至此,我们可以认为S盒被“穿透了”:找到了S盒上差分特征;
- 将$\Delta_X$和$\Delta_Y$用16进制整数来表示,作为行号/列号,其中填入出现频率;例如,$\Delta X = 1011 = B, \Delta Y = 0010 = 2$,出现了8次,于是
-
一个差分密码分析的例子
- 与线性分析时类似,可以得到$\Delta_P$与$\Delta_U$间关系,而不需要关心中间子密钥;
- 同样从SPN的输出反向分析,猜测第4个子密钥的所有偶数位,满足上面差分特征的就可能是真的密钥;需要$2^8$时间;
- 重复上面的过程,逐渐获得所有密钥;
-
块密码注释
- 块长度应该足够大;
- 块密码不能抵御消息篡改;
- Padding:填充n个内容为n的字节,或哑块;
- 流密码 与 分组密码:流密码更快但安全性更低,应该采用块密码的“流密码模式”;
-
总结
略;