概念
_1.对称密码与公钥密码
对称密码是指在加密和解密时使用同一密钥的方式。
公钥密码则是指在加密和解密时使用不同密钥的方式。因此,公钥密码又称为非对称密码。
_2.混合密码系统
对称密码和公钥密码结合起来的密码方式
_3.散列值
散列值就是用单向散列函数计算出来的数值。单向散列函数所保证是完整性。完整性指的是“数据是正牌的而不是伪造的”这一性质。使用单向散列函数,就可以检测出数据是否被篡改过。
_4.消息认证码
确认消息是否来自所期望的通信对象,可以使用消息认证码。使用消息认证码,不但能够确认消息是否被篡改,而且能够确认消息是否来自所期待的通信对象。也就是说,消息认证码不仅能够保证完整性,还能够提供认证机制。
_5.数字签名
发送者对消息加上数字签名后再发送,接收者可以对该数字签名进行验证。通过这样的方式,不但可以检测出篡改和伪装,还能够防止事后否认。数字签名是一种能够确保完整性、提供认证并防止否认的密码技术。
_6.伪随机数生成器
一种能够模拟产生随机数列的算法。随机数确实承担着密钥生成的重要职责。
对称密码
_1.DES
_1.1.加密和解密
DES 是一种将64比特的明文加密成64比特的密文的对称密码算法,它的密钥长度是56比特。尽管从规格上来说,DES 的密钥长度是64比特,但由于每隔7比特会设置一个用于错误检查的比特,因此实质上其密钥长度是56比特。
DES 是以64比特的明文(比特序列)为一个单位来进行加密的,这个64比特的单位称为分组。一般来说,以分组为单位进行处理的密码算法称为分组密码,DES就是分组密码的一种。
DES 每次只能加密64比特的数据,如果要加密的明文比较长,就需要对 DES加密进行迭代(反复),而迭代的具体方式就称为模式(mode)。
_1.2.加密过程
对每个分组,执行多轮操作,一轮流程:
总结一下, 一轮的具体计算步骤如下。
(1)将输入的数据等分为左右两部分。
(2)将输入的右侧直接发送到输出的右侧。
(3)将输入的右侧发送到轮函数。
(4)轮函数根据右侧数据和子密钥,计算出一串看上去是随机的比特序列。
(5)将上一步得到的比特序列与左侧数据进行 xoR 运算,并将结果作为加密后的左侧。
下一轮处理前,左右部分对调。每一轮产生一个新的子密钥。
_1.3.差分分析与线性分析
差分分析是一种针对分组密码的分析方法,其思路是 “改变一部分明文并分析密文如何随之改变”。通过分析密文改变中所产生的偏差,可以获得破译密码的线索。
线性分析的密码分析方法,其思路是将明文和密文的一些对应比特进行xOR 并计算其结果为零的概率。如果能够找到大幅偏离1/2的部分,则可以借此获得一些与密钥有关的信息。
_2.三重 DES
DES 重复3次
当三重DES 中所有的密钥都相同时,三重DES也就等同于普通的 DES了。以前用DES 加密的密文,就可以通过这种方式用三重 DES 来进行解密。也就是说,三重DES对DES具备向下兼容性。DES的加密和解密过程只是改变了子密钥的顺序,而实际进行的处理是相同的。
_3.AES
分组长度和密钥长度可以分别以32比特为单位在128 比特到256比特的范围内进行选择。不过在AES的规格中,分组长度固定为128比特,密钥长度只有128、192和256比特三种。
_3.1.加密和解密
多轮,每一轮分为SubBytes 、ShiftRows、MixColumns和AddRoundKey共4个步骤。
Rijndael 的输入分组为128比特,也就是16字节。首先,需要逐个字节地对16字节的输入数据进行 SubBytes 处理。所谓 SubBytes, 就是以每个字节的值(0~255的任意值)为索引,从一张拥有256个值的替换表中查找出对应值的处理。也就是说,要将一个1字节的值替换成另一个1字节的值。
SubBytes 之后需要进行 ShiftRows 处理。这一步是将以4字节为单位的行(row) 按照一定的规则向左平移,且每一行平移的字节数是不同的。图3-12所示为ShiftRows中对其中一行进行处理的情形。
ShiftRows 之后需要进行 MixColumns 处理。这一步是对一个4字节的值进行比特运算,将 其变为另外一个4字节值。图3-13所示为 MixColumns 中对其中一列(column)进行处理的情形。
最后,需要将 MixColumns 的输出与轮密钥进行xOR, 即进行 AddRoundKey 处理。图 3-14所示为AddRoundKey中对其中1个字节进行处理的情形。到这里,Rijndael 的一轮就结束 了。实际上,在Rijndael中需要重复进行10~14轮计算。
在Rijndael 的加密过程中,每一轮所进行的处理为:
SubBytes→ShiftRows→MixColumns→AddRoundKey
而在解密时,则是按照相反的顺序来进行的,即:
AddRoundKey→InvMixColumns→InvShiftRows→InvSubBytes
用对称密码进行通信时,还会出现密钥的配送问题,即如何将密钥安全地发送给接收者。为了解决密钥配送问题,我们需要公钥密码技术。
分组密码的模式
_1.分组密码与流密码
分组密码是每次只能处理特定长度的一块数据的一类密码算法,这里的 “一块”就称为分组。此外,一个分组的比特数就称为分组长度。
流密码是对数据流进行连续处理的一类密码算法。流密码中一般以1比特、 8比特或32比特等为单位进行加密和解密。
分组密码处理完一个分组就结束了,因此不需要通过内部状态来记录加密的进度;相对地, 流密码是对一串数据流进行连续处理,因此需要保持内部状态。
_2.什么是模式
分组密码算法只能加密固定长度的分组,但是我们需要加密的明文长度可能会超过分组密码的分组长度,这时就需要对分组密码算法进行迭代,以便将一段很长的明文全部加密。而迭代的方法就称为分组密码的模式。
_3.明文分组与密文分组
明文分组是指分组密码算法中作为加密对象的明文。明文分组的长度与分组密码算法的分组长度是相等的。
密文分组是指使用分组密码算法将明文分组加密之后所生成的密文。
_4.什么是 ECB 模式
ECB 模式中,将明文分组加密之后的结果将直接成为密文分组。
当最后一个明文分组的内容小于分组长度时,需要用一些特定的数据进行填充。
_4.1.弱点
ECB 模式的一大弱点,就是可以在不破译密文的情况下操纵明文。如转账中,对调两个分组改变收款和付款方。
_5.什么是CBC模式
密文分组是像链条一样相互连接在一起的。
在 CBC 模式中,首先将明文分组与前一个密文分组进行XOR 运算,然后再进行加密。
_5.1.初始化向量
一般来说,每次加密时都会随机产生一个不同的比特序列来作为初始化向量。
_5.2.攻击
_5.2.1.填充提示攻击
填充提示攻击是一种利用分组密码中的填充部分来进行攻击的方法。在分组密码中,当明文长度不为分组长度的整数倍时,需要在最后一个分组中填充一些数据使其凑满一个分组长度。在填充提示攻击中,攻击者会反复发送一段密文,每次发送时都对填充的数据进行少许改变。由于接收者(服务器)在无法正确解密时会返回一个错误消息,攻击者通过这一错误消息就可以获得一部分与明文相关的信息。这一攻击方式适用于所有需要进行分组填充的模式。
_5.2.2.对初始化向量(IV)进行攻击
初始化向量(IV)必须使用不可预测的随机数。
_5.3.应用实例
确保互联网安全的通信协议之一SSL/TLS,就是使用CBC模式来确保通信的机密性的,如使用CBC模式三重DES的3DES_EDE_CBC以及CBC模式256比特AES的AES_256_CBC等。
_5.4.一种填充分组尾部的方法
_6.什么是 CFB 模式
在 CFB模式中,前一个密文分组会被送回到密码算法的输入端。
_6.1.初始化向量
一般来说,我们需要在每次加密时生成一个不同的随机比特序列用作初始化向量。
_6.2.CFB 模式与流密码
在CFB 模式中,明文数据可以被逐比特加密,因此我们可以将CFB 模式看作是一种使用分组密码来实现流密码的方式。
_7.什么是OFB模式
在OFB模式中,密码算法的输出会反馈到密码算法的输入中。
_7.1.初始化向量
一般来说,我们 需要在每次加密时生成一个不同的随机比特序列用作初始化向量。
_8.CTR模式
CTR 模式中,每个分组对应一个逐次累加的计数器,并通过对计数器进行加密来生成密钥流 。
_8.1.计数器的生成方法
每次加密时都会生成一个不同的值来作为计数器的初始值。
_8.2.OFB模式与CTR模式的对比
CTR 模式和OFB 模式一样,都属于流密码。
非对称密码
1.对称密码中加密,解密需要相同的密钥,存在密钥配送问题。
_1.解决密钥配送问题的方法有以下几种
(1).通过事先共享密钥来解决
存在的问题:共享存在难度,所需密钥对数量多。
(2).通过密钥分配中心来解决
可以为每次会话生成临时密钥,传递给会话参与者。
存在问题:中心节点
(3).通过 Diffie-Hellman 密钥交换来解决密钥配送问题
(4).通过公钥密码来解决密钥配送问题
采用公钥密码,接收者事先将自身加密密钥发送给发送者,这个加密密钥即便被窃听者获取也没有问题。发送者使用加密密钥对通信内容进行加密并发送给接收者,而只有拥有解密密钥的人(即接收者本人)才能够进行解密。
2.公钥密码
_1.什么是公钥密码
公钥密码中,密钥分为加密密钥和解密密钥两种。发送者用加密密钥对消息进行加密,接收者用解密密钥对密文进行解密。公钥和私钥是一一对应的, 一对公钥和私钥统称为密钥对。由公钥进行加密的密文,必须使用与该公钥配对的私钥才能够解密。
_2.公钥密码无法解决的问题
公钥认证:
公钥密码解决了密钥配送问题,但对于接收者如何判断所收到的公钥就是来自发送者的公钥–公钥认证问题。
加密,解密速度慢:
它的处理速度只有对称密码的几百分之一。
_3.公钥原理
_3.1.互质的数
以12为例,12的最大公约数为1的数(5、7、11),在数学上称为“和12互质的数”。
_3.2.离散对数
时钟运算中的对数称为离散对数。例如:
7 ^ {?} mod 13 = 8
将每个可能性逐个代入尝试,可得9符合。当数字很大时,求离散对数非常困难,也非常耗时。能快速求出离散对数的算法到现在还
没有被发现。Diffie-Hellman密钥交换协议以及EIGamal公钥算法中就运用了离散对数。
_4.RSA
RSA是一种公钥密码算法,它的名字是由它的三位开发者,即Ron Rivest、Adi Shamir和Leonard Adleman的姓氏的首字母组成的。RSA 可以被用于公钥密码和数字签名。
_4.1.RSA 加密
在RSA中,明文、密钥和密文都是数字。RSA 的加密过程可以用下列公式来表达,这个公式很重要,因此我们把它框起来。
E和N是RSA加密的密钥,也就是说,E和N的组合就是公钥。要加密的明文必须是小于N的数。
_4.2.RSA解密
这里所使用的数字N和加密时使用的数字N是相同的。数D和数N组合起来就是RSA的解密密钥,因此D和N的组合就是私钥。
_4.3.生成密钥对
求E、D和N这三个数就是生成密钥对。RSA 密 钥对的生成步骤如下。
(1).求N
首先准备两个很大的质数。这两个很大的质数为p和q。一般为512比特。
要求出这样大的质数,需要通过伪随机数生成器生成一个512比特大小的数,再判断这个数是不是质数。如果伪随机数生成器生成的数不是质数,就需要用伪随机数生成器重新生成另外一个数。
准备好两个很大的质数之后,我们将这两个数相乘,其结果就是数N。
(2).求L
L是p-1和q-1的最小公倍数。
(3).求E
E是一个比1大、比L小的数。此外,E和L的最大公约数必须为1。
通过伪随机数生成器生成在1<E<L的范围内生成E的候选数,然后再判断其是否满足gcd(E,L)=1这个条件。求最大公约数可以使用欧几里得的辗转相除法。
之所以要加上E 和L的最大公约数为1这个条件,是为了保证一定存在解密时需要使用的数D。
(4).求D
数D是由数E计算得到的。D、E和L之间必须具备下列关系。
1 < D < L
E × D mod L = 1
只要数D满足上述条件,则通过E和N进行加密的密文,就可以通过D和N进行解密。
_4.4.对 RSA 的攻击
_4.4.1.通过密文来求得明文
非常困难,因为人类还没有发现求离散对数的高效算法。
_4.4.2.通过暴力破解来找出D
通过将D的尺寸控制较大,如1024比特以上,使得暴力破解变得不可行。
_4.4.3.通过E和N求出D
E × D mod L = 1
出现的数字是L,而 L 是lcm(p-1, q-1),但是密码破译者并不知道p和q,因此不可能通过和生成密钥对时相同的计算方法来求出D。
N=p×q,而且N是公开的,那么能不能由N求出p和q呢? p和q都是质数,因此由N求p和q只能通过将N进行质因数分解来完成。
现在我们还没有发现对大整数进行质因数分解的高效算法。
_4.4.4.通过推测p和q进行攻击
p 和q是通过伪随机数生成器产生的,如果伪随机数生成器的算法很差,密码破译者就有可能推测出来p和q。
_4.中间人攻击
主动攻击者Mallory混入发送者和接收者的中间,对发送者伪装成接收者,对接收者伪装成发送者的攻击方式,在这里,Mallory 就是“中间人。
比如:A向B发消息,C在中间,C可以窃听,篡改,拦截A与B的消息。
(1).A向B发明文请求B的公钥
(2).C感知到
(3).C拦截B的公钥回复
(4).C伪装成B用自己的公钥回复A
(5).A用公钥加密后发消息给B
(6).C拦截,因为A用的是C的公钥。故C加密消息。
(7).C用B的公钥加密想发送的消息,伪装成A发给B
(8).B收到消息解密。但消息是假的。
要应对上述情况,需要手段使得A可以确认收到的公钥确实是B的。这种手段就是认证。
_5.选择密文攻击
指的是攻击者发送密文,依据接收者的回复信息辅助进行密码破译。
通过在发送消息前,要求添加认证信息。接收者可以依据认证消息来判断消息来源合法性,进而阻止选择密文攻击。
混合密码系统
用对称密码提高速度,用公钥密码保护会话密钥。
和对称密码比,公钥密码加密速度慢,但解决了密钥配送问题。实际中,往往是用公钥加密对称密钥,再使用对称密钥加密消息。
实际应用中,一般是:
1.采用伪随机数生成器生成一次性会话密钥。
2.采用接收者公钥对会话密钥加密,发给接收者。这样接收者解密后便获得本次会话的会话密钥。
3.此后双方可以通过会话密钥加密消息发送,解密收取的消息。