
- Author :
- Email : vip_13031075266@163.com
- Date : 2021.1.17
- Copyright : 未经同意不得转载!!!
- Version :
- Reference:《图解密码技术》
目录
2.2.1 DES(Data Encryption Standard)
2.2.3 新一代对称加密标准AES(Advanced Encryption Standard)
一、 密码学家的工具箱
在安全领域,存在众多的密码技术,而其中的六种发挥着特别重要的作用:
- 对称密码
- 公钥密码
- 单向散列函数
- 消息认证码
- 数字签名
- 伪随机数生成器
在《图解密码技术》书中将这六种技术称之为密码学家的工具箱。现实生活中,虽然人们之间的通讯变得更加便捷,但是面临的安全形势却依然很严峻。就拿我们赖以依赖的互联网来说吧,它目前最主要的协议便是TCP/IP, 而此协议存在诸多问题,例如
- 两者之间的通讯可能被第三者监听,缺乏机密性保护
- TCP/IP协议无法识别出报文是否被修改,报文传输过程中完全可以被恶意攻击者修改然后再次发给接收者,缺少防篡改的检测机制
- 收到的数据报来源无法明确,可能来源于未知用户,无法得知报文是否真的来自发送方,缺乏认证机制
- … …
互联网中为了解决TCP/IP的上述问题,标准化机构指定了IPsec协议(IP Security,即IP层安全),它为IP报文提供了机密性、完整性、源认证、抗重放等服务,它便是利用了我们现在提到的多种技术。
我们将信息安全领域所面临的威胁和应对威胁所采用的密码技术绘制成下图:
而这六种技术之间又有什么关系呢?
我先使用一张图来做一个概括说明,然后再慢慢介绍每一种技术。
二、 对称密码系统
对称密码是一种用相同的密钥进行加密和解密的技术,用来确保消息的机密性。
2.1 密钥配送问题
在对称密码中,由于加密和解密使用相同的密钥,因此发送者必须把密钥发送给接收者。密钥必须发送但是又不能发送,为什么呢?因为发送的密钥无论采取什么方式(如打电话、发邮件、邮寄、发微信等),完全有可能被第三方窃听。回想下当年斯诺登的棱镜门就知道了,而你日常发带密码的压缩包,微信发密码之所以没有出问题,那是你价值不够,人家懒得理你;但是如果是国家机密信息,那性质完全不同,帝国主义亡我之心不死,在国家安全、国防等方面绝对马虎不得。
密码必须发送,但是又不能发送,这便是密钥配送问题。
解决密钥配送问题,经常有如下几种方式:
- 通过事先共享密钥来确定
- 通过Diffie-Hellan密钥交换来解决
- 通过密钥密码来解决
2.1.1 事先约定共享密钥
这个比较好理解,遥想当年李德胜爷爷星星之火到燎原之势的年代,各军队之间通过电台进行通讯,通讯用的密码本便是由中央统一制定,然后下发到各部队、部门;此外为了防止被破解,定期更换新的密码本。这里说的密码本就是双方约定好的共享密钥。
那么事先约定共享密钥安全吗?
这个我们可以从电视剧《伪装者》的“死间计划”中知道,送密码本的人完全有可能被敌人抓获、叛变、泄露密码,这样敌人就可以通过密码本解读我方的军情报文,因此定期更换密码本以此来尽量避免密码泄露、破解。至于是否安全,应该比每次直接发送密码安全。
2.1.2 Diffie-Hellman密钥交换
Diffie-Hellman密钥交换算法是在1976年由这两个人发明的算法。它可以在不安全的网络中,通过交换一些可以公开的信息协商出共享密钥,使用此共享密钥建立安全通讯。它实际上并没有直接交换密钥,而是通过数学计算,得出共享密钥。
2.1.2.1 DH交换的步骤:
注意:上图中的公钥、私钥使用有误,他们属于专有名词,用于公钥密码系统。我这里的意思只是为了表达:需要公开的钥匙和不需要公开的钥匙。
**①Alice选择两个质数:**p, g
p必须是一个非常大的质数,而g则是一个与p相关的数,成为生成元(Generator, 或数论中叫做本原根),g可以是一个比较小的数。关于生成元,我后面在做介绍
p, g是不需要保密的,即使被窃听也无关痛痒。
②Alice生成一个随机数****a
a是一个位于1 ~ p-2之间的整数。这个数只能自己知道,不需要告诉Bob, 也不能让其他人知道。
③Alice计算出****A
④Alice将p, g, A全部发送给****Bob
这三个数可以让其他人知道,没有关系
⑤Bob生成一个随机数****b
b是一个位于1 ~ p-2之间的整数。这个数只能自己知道,不需要告诉Alice, 也不能让其他人知道。
⑥Bob计算出****B
Bob已经接收到Alice发来的g,p,因此可以计算出B。
B的计算公式为:
⑦Bob将只需要将B发送给****Alice
B也可以让其他人知道,没有关系
⑧Alice利用Bob发来的B计算共享密钥****K
⑨Bob利用Alice发来的A计算共享密钥****K
最后Alice和Bob计算出的共享密钥可以通过数学公式证明是相等的。因此通过DH密钥协商,最终双方协商出了只有两个人知道的共享密钥。
如果对于mod运算规则不清楚,可以将mod运算转换为基本加减乘除运算,然后利用二项式展开来证明双方计算的共享密钥相等。可以参考:DH算法图解+数学证明
2.1.2.2监听者能计算出密钥吗?
从上面DH交换中可以知道,监听者可以获取的公开信息有A, B, g, p。
最终的共享密钥为:
如果没有modpA= ga 、B= gb 能够很容易求出非公开值a,b,因为这只是一个简单的对数问题,但是加上mod运算,在有限域内没有任何规律可言
(
最起码现在还没有发现
)
。
我们在有意义的时间内,没有办法来求出a,这便是离散对数问题。
也许有人像我一样,我构建一张表,例如g=2, p选用DH1组定义的质数(DH算法有几个提前约定的大质数,最小的DH1的质数768bit), 将(a,A)一一遍历出来不可以吗?
768bit什么概念? A的范围为0, 2768,这是个多大的数呀?一个原子上存10条目,用上整个宇宙中的原子都放不下呀,送暴力穷举简直是不可能。
有限域的离散对数问题的复杂度正是支撑DH密钥交换算法的基础。
2.1.3 公钥密码
公钥密码可以解决共享密钥配送问题,关于它的原理这里先不讲解,后面详细对其进行说明。
2.2 对称密码算法
2.2.1 DES(Data Encryption Standard)
DES算法是1977年美国机构采用的对称加密标准,后被世界各国广泛使用。但是随着计算机计算能力的提供,在1999年DES算法在24小时内便可以被破译,因此目前为了安全起见,DES算法已经不再被用于新的用途。
DES算法是一种将64bit的明文加密成64bit密文的对称加密算法。它的密钥长度是64比特,实际上由于每个7比特都设置1位校验比特,因此64比特长的密钥中实际只有56比特。
DES以64字节明文为单位,作为一组进行加密,我们将此单位成为分组。一般说来:以分组为单位进行处理的密码算法称之为分组密码。DES算法只是分组密码中的一种。
2.2.2 3DES(triple DES)
由于DES算法已经可以在极短的时间内被暴力破解,为了替代DES算法,3DES算法被开发出来。3DES是为了增加DES算法的强度,将DES重复3次所得到的一种密码算法。
DES算法的实质密钥长度是56比特,因此3DES的密钥长度就是56x3=168比特,分组长度保持不变,依然位64比特。3DES的处理流程并不是进行3次DES加密,而是按照:加密**->解密->****加密**的过程进行处理的。之所以采用这种方式,是为了将3DES兼容DES算法。因为当3DES的三把密钥完全相同时,经过加密--解密--加密流程,实际上相当于经过一次加密,与DES的效果是相同的。也就是说3DES向下兼容DES算法。
尽管3DES算法还被银行等机构使用,但是其处理速度比较低,除了特别注重向下兼容性外,已经很少用于新的用途。
2.2.3 新一代对称加密标准AES(Advanced Encryption Standard)
AES是由美国标准化机构于1997年在全球范围内,公开选拔的对称加密算法标准,经过全世界密码学家的严格挑选,最终于2000年将Rijndael标准作为AES算法标准。像这种通过竞争来实现标准化的方式,正是密码选择算法的标准(SHA3算法也是如此),不像我们的部分国密算法,算法实现都不公开,安全乎? 非安全也,乃不自信也。
在招募到的算法中,有5个算法入围了AES的最终候选名单,虽然最终选择了Rijndael算法作为AES标准算法,但是其他候选算法也相当优秀,通常作为AES的候补算法使用。AES****最终候选算法名单如下:
名称
提交者
MARS
IBM公司
RC6
RSA公司
Rijndael
Daemen, Rijmen
Serpent
Anderson, Biham, Knudsen
Twofish
Counterpane公司
AES算法分组长度和密钥长度可以分别以32比特为单位在128比特至256比特的范围内进行选择。不过经常使用的规格是:分组长度位128比特;密钥长度有128比特、192比特、256比特三种。
2.2.4 应该选择使用哪种算法?
前面简单介绍了DES, 3DES, AES三种对称密码算法,那么我们在使用时应该使用哪种算法呢?
算法名称
说明
DES
除了考虑到与原有软件的兼容性,DES不应该再用于任何新的用途。因为随着计算机计算能力的提升,已经可以短时间内破译DES算法。
3DES
3DES目前还没有被破译,但是也不应该被用于新的用途。
AES
推荐使用。AES毕竟经过全世界密码学家的严格测试,安全、快速,在新的部署环境中应该优先考虑。
AES****最终候选算法
也是相当优秀的算法,可以作为AES算法的备份使用。
三、 公钥密码系统
在****对称密码中,由于加密和解密的密钥必须是相同的,因此必须向接收者配送密钥。但是这样会产生密钥配送问题,在密钥配送问题解决方案中,我提到了公钥密钥的方式,那么它又是如何实现的呢?
下面便来介绍密码学中最伟大的发明:公钥密码。
在对称密码中,加密和解密使用相同的密钥。在公钥密码中,加密和解密使用不同的密钥。只要拥有加密密钥,任何人都可以加密,但是只有拥有解密密钥的人才能解密。
两个人在通讯之前,接收者事先将加密密钥发送给发送者,此加密密钥即使被Eve窃取也无所谓;然后发送者使用接收者的加密密钥对报文进行加密,然后将加密后的密文发送给接收者,此密文即使也被Eve窃取,但是由于此人没有解密密钥,因此仍然无法进行解密。接收者在收到加密报文后,使用解密密钥对报文进行解密。因此我们可以通过公钥密码来解决对称密码中的密钥配送问题。
3.1 什么时公钥密码?
公钥密码中,密钥分为加密密钥和解密密钥两种。发送者使用加密密钥对报文进行加密,接收者使用解密密钥对报文进行解密,这两把密钥时理解公钥密码的关键。
加密密钥和解密密钥的区别如下:
- 发送者只需要加密密钥
- 接收者只需要解密密钥
- 解密密钥不可以被窃听者窃取
- 加密密钥可以被窃听者窃取
在公钥密码中,加密密钥是可以公开的,因此又被称为公钥**(public key)。加密密钥不能公开,只能有自己保管,因此被称为私钥(private key)****。一对公钥和私钥是一一对应的,在数学上关系密切,公钥和私钥统称为密钥对。**
公钥密码由于加解密使用不同的密钥,因此又被称为非对称密钥。
3.2 公钥通讯流程
3.3 公钥密码原理(以RSA为例)
我下面以使用最为广泛的RSA算法(三位发明者名字的缩写)为例来介绍公钥密码的原理,并通过数学公式做一个简要的证明。当然这个需要的数学定理和公式有点多,我也不太擅长高等数学┭┮﹏┭┮,哦,高等数学中也没有讲mod运算呀,它是数论的概念,也是数论里的最重要的工具。
3.3.1 RSA的加密
RSA的加密过程可以通过一个公式来表示:
加密过程中用到了两个数:E, N。他们是什么呢?
从上面的加密公式可以看出,加密报文只需要知道E,N便可以完成,因此只需要知道这两个数字,任何人都可以完成加密操作,因此我们将(E,N)称之为加密密钥。
不同于对称加密中的复杂操作,将数据加、减、乘、除、异或,拆来拆去,挪来挪去,揉来揉去等等,复杂的简直不要不要滴。而RSA只是将明文做了E个乘方运算,然后再取余,简洁而不失优美。
3.3.2 RSA的解密
RSA解密流程同加密流程一样简洁,可以使用下面的公式表达:
也就是说我们求出密文的D次方,然后对N求余便可以实现报文的解密。而这里的(D,N)就是解密密钥。
从上面可以看出:
RSA加解密的数学形式完全相同,加密是“求E次方,然后mod N”, 解密是“求D次方,然后mod N”,可以说是相当的美妙。
这里的D,E在数学上必须满足一定关系才行,否则无法对报文进行解密。
3.3.3 RSA求解E、D、N流程
通过上文已经知道:RSA加密是求“E次方的mod N”, 解密则是求“D次方的mod N”,这里用到了三个数:E,D,N, 他们是如何得到的呢?
RSA密钥对的生成步骤如下:
(1)求N
(2)求Φ(Φ仅仅密钥对的生成过程中使用)
(3)求E
(4)求D
下面对每一个步骤做一个详细的讲解说明:
(1)求****N
首先准备两个很大的质数p,q。
p, q 太小的话,容易被暴力破解,太大的话计算量也会相应的增大,一般p,q选取512比特,N是1024比特。p,q一般都是借助于伪随机数生成器,然后判断生成的数是否为质数,如果不是则重新使用伪随机数生成器生成另外一个测试,如此往复,直到找到质数为止。(注:这里判断一个数是否为质数,不是将其进行因式分解,数学上有较为简单的判断方法)。
将准备好的两个大质数相乘,其结果就是N。即:
(2)求Φ
Φ在RSA加解密的过程中都不会用到,它只出现在生成密钥对的过程中。
在数论中Φ(v)用来表示变量v的欧拉函数,它表示[1, v-1]范围内那些与v互质(最大公约数为1)的正整数的个数。
下面说两个定理:
定理①
定理②
(3)求****E
用公式表示就是:
要找出一个满足gcd(E, ΦN=1) 的数,依然需要借助随机数生成器。我们可以利用辗转相除法来计算两个数的最大公约数。
为了保证在解密报文时,一定存在一个与E对应的D。(数论中的一个定理)
(4)求****D
D要求与E具有一一对应关系,那么具体D,E,Φ之间有什么关系呢?
至此,D,E,N已经全部计算得出,重新整理下他们之间的关系:
(1)求N
随机数生成两个大质数p,q,则N=p ×q
(2) Φ(N)
N的欧拉函数:Φ(N)=(p−1)(q−1)
(3)求E
(4)求D
图解RSA如下:
3.3.4 RSA数学证明
符号约定:明文m; 密文c。
已知条件:
其中:
涉及到的数学定理:
定理一:Euler定理
定理二:乘法逆元存在定理(定理专业名字忘了,且表达式做了等价转换)
有了以上的基础,便可以证明RSA加解密流程了:
下面分情况讨论:
(一般情况下,明文m是远远小于 N的,如果明文m大于N,解密时会出错)
那么,明文m应该为p或者q的倍数,但不能同时是p,q的倍数,因为m<N。
不妨假设m=tp,则m与q应该互质,则有:
等式两边同时取kΦ(p)的幂次方,则等式依然成立,即:
所以有:
将m=t∗𝑝同时乘以等式两边,则有
然后等式两边对N取模
证明完毕。
3.3 公钥密码攻击
RSA算法的关键在于两个大质数p,q不能对外公开。对RSA算法破解的关键在于大数N的质因数分解。如果能够找到大整数质因数分解的高效算法,那么可以对p,q进行暴力穷举来解密报文。但由于目前并没有高效算法,因此RSA目前还是安全的。但是RSA公钥密码系统无法抵御中间人攻击,因为无法确定自己收到的公钥是否真的是自己想要通讯对象的公钥,为了抵御中间攻击,需要对收到的公钥进行认证。关于认证,后面进行详细介绍
四、 混合密码系统
我们已经介绍了对称密码系统和非对称密码系统(公钥密码系统),他们各有优缺点:
对称密码系统:
- 计算速度快
- 需要解决密钥配送问题
- 多点通讯时密钥存储维护成本高
- 无法抵御中间人攻击
非对称密码系统:
- 计算速度慢
- 可以解决密钥配送问题
- 密钥维护成本较低
- 无法抵御中间人攻击
无论是对称密码系统还是非对称密码系统都无法解决中间人攻击的问题,解决此问题需要使用认证技术,这里暂时不介绍,后续再详细说明。
混合密码系统便是将对称密码系统和非对称密码系统的优势相结合的方法。混合密码系统中使用对称密码加密消息,使用公钥密码来加密对称密钥(专有名词是会话秘钥)
混合密码系统解决了公钥密码速度慢的问题,并通过公钥密码解决了对称密码的秘钥配送问题。
我们也成这种混合密码系统的通讯方式为数字信封。
会话密钥:是指为本次通讯生成的临时密钥,它是对称密码算法的密钥,同样也是公钥密码的明文。
4.1 混合密码系统加密流程
4.2 混合密码系统解密流程