一、What is a block cipher?
![image-20210801160941922](https://i-blog.csdnimg.cn/blog_migrate/ae33f77074b3dc904eae5f403bbcaace.png)
1. PRPs 和 PRFs
伪随机函数和伪随机置换
![image-20210801162905429](https://i-blog.csdnimg.cn/blog_migrate/a544cfde2979005102269490402e802f.png)
2. PRP和PRF安全定义
安全PRF
安全PRF的定义如下:
伪随机函数 S F S_F SF与 F u n s [ X , Y ] Funs[X,Y] Funs[X,Y](真随机函数)不可区分
如果不可区分,那么就可以享受真随机函数的巨大Size,使得破解困难(无法确定映射函数)
将单个的X映射到Y变成了由[k, *]映射到Y,通过固定了部分输入即k降低了整个大小,同时还能保持不可区分性
直观的理解:
一个例子:
安全PRP
将 F u n s [ X , Y ] Funs[X,Y] Funs[X,Y]限制是一对一函数即 P e r m s [ X ] Perms[X] Perms[X]就可以表示安全PRP
应用案例:
通过伪随机函数生成伪随机发生器
![image-20210801195831517](https://i-blog.csdnimg.cn/blog_migrate/9d58d7ee1467a8feb73f727a268933fe.png)
二、DES数据加密标准
The data encryption standard(DES)
DES主要讨论的就是对于分组密码格式中的密钥拓展算法和回合函数
2.1 DES的历史
![image-20210802164024167](https://i-blog.csdnimg.cn/blog_migrate/e374b18f556ad94e8806c59c847fb279.png)
2.2 DES的构造
Feistel 网络
可逆性的证明:
![image-20210802170022767](https://i-blog.csdnimg.cn/blog_migrate/c603fb2a4dd8a045f9bf1c19d03b466a.png)
进而整体的逆运算就是解密算法:
![image-20210802170732659](https://i-blog.csdnimg.cn/blog_migrate/a9e9482901c76d57ecc61dc02e158341.png)
进而推出的定理:
![image-20210802171400378](https://i-blog.csdnimg.cn/blog_migrate/5789cdbc0860520e3531aea6eb2fc547.png)
Feistel网络是从PRF走向PRP的桥梁!
DES
overview
![image-20210802172111141](https://i-blog.csdnimg.cn/blog_migrate/54bb439e2847208060d122bd74f396f6.png)
回合函数
其中的回合函数:
![image-20210802200948000](https://i-blog.csdnimg.cn/blog_migrate/b52ee7ff92751fd162b2a4a35278ee45.png)
S盒
![image-20210802201101377](https://i-blog.csdnimg.cn/blog_migrate/864e37c5c28bafc87767c0f6a1607fa5.png)
S盒的设计规范:
![image-20210802203148583](https://i-blog.csdnimg.cn/blog_migrate/2d1971a7a2f7c13d36310aed3ebfd1e4.png)
![image-20210802203318899](https://i-blog.csdnimg.cn/blog_migrate/5b8ff11e7a85d148064a811bf73ec56d.png)
一句话总结: 选择的S盒的输出表现不可以是非常接近一个线性函数的输出
2.3 穷举攻击 - Exhaustive Search Attacks
目标:根据一对输入与输出找出其中的DES密钥
问题的前提是:一对明文/密文就确定一定是对应一个密钥吗?
Dan Boneh老师给出了证明:
并集上届在第一部分讲过:
![image-20210803165859668](https://i-blog.csdnimg.cn/blog_migrate/ffda63d5c3cbbe7d8322f0f53f388ca3.png)
并集上届直观上很好理解,但是对于 P r [ D E S ( k , m ) = D E S ( k ′ , m ) ] < = 1 / 2 64 Pr[DES(k, m)=DES(k',m)] <= 1/ 2^{64} Pr[DES(k,m)=DES(k′,m)]<=1/264是如何计算的呢?
下面一个例子希望能让你明白:
DES假设是理想的随机函数,我们认为是一个6面骰子,那么问题就转换为同时掷两个6面骰子,两个骰子数字相同概率的计算方法,我想应该很好计算:
两个骰子总工会出现6*6=36种结果,其中相同面的结果占6个,概率就是 1 6 \frac{1}{6} 61
同理,DES理想随机函数单个分组加密的输出是64位,两个相同的概率就是:
2 64 2 64 ∗ 2 64 = 1 2 64 \frac{2^{64}}{2^{64}*2^{64}} = \frac{1}{2^{64}} 264∗264264=2641
现在问题的前提是已经被证明是正确的了即:一对明文、密文对可以大概率的确定唯一对应一个密钥加密
事实上,如果有两对明文密文对用key作为密钥,则通过类似的推算这个key唯一的概率将会基本为1
顺带一提,这一点对AES也成立, 如果你看AES-128,给定两个明文密文对以很高的概率只有一个密钥
![image-20210803171832696](https://i-blog.csdnimg.cn/blog_migrate/c08a2d4063fb141b1b5d58de4681a989.png)
现在的问题是怎样得到这个密钥
最暴力的方法-穷举:
![image-20210803193313332](https://i-blog.csdnimg.cn/blog_migrate/aa796c69b8ce2f49ab996139ff57c217.png)
56位的DES已经不安全了,不可再使用
那么,安全性问题该如何解决呢?
简单直接的方式 => 增加DES的密钥长度
3DES
![image-20210803193900412](https://i-blog.csdnimg.cn/blog_migrate/aa2ec473a6c8d707d8b69c77a65af881.png)
需要注意的是,3DES并不是直接加密三次,中间的一次是解密. 并且三次都使用独立的密钥
为什么这样设计?
原因:这仅仅只是一个技巧,为了当k1=k2=k3时,先加密再解密3DES退化成DES而已
2的168次方的时间,就算地球上所有机器一起工作10年也是不能破解的
事实上,任何大于2的90次方的都可被认为是充分安全的
大家可能认为3DES的安全性是2的168次方的,但事实上,有一个简单的攻击,只需2的118次方(下面会说到)
2的118次方被认为是对穷举攻击充分安全的, 是个足够高的安全级别了
为什么不能直接加密两次?
中间相遇攻击
![image-20210803200108942](https://i-blog.csdnimg.cn/blog_migrate/46f2c46254a9985cb7287de3f302d1f9.png)
核心在于,可以将解密/加密算法用于两边制造碰撞(判断相等),然后建表查询
虽然3DES也可以用此方法实现 2 118 2^{118} 2118时间内查找,但是还是安全的
3DES实际上是NIST标准,所以3DES实际上应用广泛,而DES不应再被使用了,如果出于某些原因,你一定要用DES的某种变体,用3DES,别用DES
增强DES抵抗穷举攻击能力的方法
这个方法没有被NIST标准化,因为它不能抵抗针对DES更为复杂的攻击,不过如果只考虑穷举攻击, 又不想承担3DES的性能开销,这就是个有趣的想法:
![image-20210803202552025](https://i-blog.csdnimg.cn/blog_migrate/fffe6c2089fae263c370a0146fc0d3be.png)
2.4 更多对分组密码的攻击
侧道攻击和故障攻击
旁/侧道攻击: 通过统计测量加密时间或功耗的角度来破解密码
故障攻击:人为的让其计算错误,暴露密钥
侧信道攻击(Side-channel attacks, SCA)是一类攻击者尝试通过观察侧信道泄露来推测目标计算的信息。(例如,时间,功率消耗,电磁辐射,噪声等。)
故障攻击(Fault attacks, FA)是一类攻击,在这种攻击中,攻击者尝试利用错误计算的结果。错误可能导致程序或者设计错误(例如 Intel著名的FDIV错误),或者被攻击者诱导的错误(例如,能量故障,时钟故障,温度变化,离子束注入等)。
使用标准库中的密码而不是自己去编写实现或创造!
线性密码分析
发现了一条定理, 明文与密文对之间存在某种依赖:
根据这个定理对于有一点点线性关系的密码算法就可以进行攻击
例如DES,其第五个S盒设计时有点接近线性函数也就导致了被这种分析降低了攻击时间
DES的这一点点偏差在较大量的(具体数量关系见上图)明文/密文对的线性分析下就可以很轻松的得到其密钥和
在第五个S盒的输入输出上运用这个方法就可以将整个密钥的时间复杂度降下来
不要自己设计密码,按标准的来。因为一点点的线性关系都会导致严重的后果
这个定理的线性分析类似于机器学习/深度学习的过程,在大量的数据集的支持下就可以将数据之间的某种线性关系分析出来
量子攻击
量子计算机的由来:
20世纪七八十年代,Richard Feynman对于当前经典计算机无法完成量子实验的计算提出了自己的设想:
量子物理问题对于经典计算机来说就是无法计算的,需要特定的计算机来实现也即量子计算机
因为量子计算机有着与经典计算机不同强大的计算能力,所以可以作为对传统密码学算法的一种攻击
但是目前是否能够真正的制造出这样的计算机仍然是一个迷
量子计算对与密码学的影响是巨大的,因为整个社会、网络安全等各方面都基于密码学难题
量子计算机能否制造出来未知,但是理论上使用其进行计算已有了明确的算法,即Grover
三、AES
3.1 AES历史
因为DES或者3DES对于硬件来说都时间都太慢,所以NIST启动了一个新的分组加密标准叫做高级加密标准AES
3.2 Subs-Perm网络
AES不基于Feistel网络而是基于Subs-Perm(substitution permutation 代置换)网络
最大的区别在于位数的改变,在Feistel中每回合有一半的位是不变的,而Subs-Perm网络中每回合每一位都要改变
DES通过Feistel整体提供可逆性,对于DES其中的S盒是不可逆的,其输入6位,输出4位; 而AES则是每一个步骤都是可逆的,这样才保证了整体上的可逆
3.3 构造
对于上方的每个轮函数(蓝色区域), 其具体过程如下:
关于AES字节代换、行置换、列混淆的一些补充:
3.4 代码大小与时间的平衡
3.5 应用
网络上的应用:
先将AES计算库发送给客户端,客户端预先计算所有的表,随后每次交互只要将基本数据发送给客户端即可
3.6 攻击
尽管已有一些攻击,但是这些攻击的效果在如今看来依旧是安全的
四、用PRGs构建分组密码
构建分组密码,实际上就是构建一个PRP伪随机置换
我们的思路: P R G = > P R F = > P R P PRG => PRF => PRP PRG=>PRF=>PRP
从伪随机数发生器构建伪随机函数
从一位的安全PRG开始推导:
根据 G ( k ) [ . ] G(k)[.] G(k)[.]中的 . 选择左右
拓展到两位 G 1 ( k ) G_1(k) G1(k):
证明两位的 G 1 ( k ) G_1(k) G1(k)是安全的:
再次拓展:
拓展n次:
虽然构造过程很美,但是不实用!
可以从PRF到PRP吗?可以!通过Feistel网络的结构即可!
觉得不错的话,请点赞关注呦~~你的关注就是博主的动力
关注公众号,查看更多go开发、密码学和区块链科研内容: