第四章 分组密码的模式
DES和AES都属于分组密码,它们只能加密固定长度的明文。如果需要加密任意长度的明文,就需要对分组密码进行迭代,而分组密码的迭代方法就称为分组密码的“模式”。
分组密码有很多模式,如果模式的选择不恰当,就无法充分保证机密性。分组密码的主要模式有ECB、CBC、CFB、OFB、CTR等。
4.2.1分组密码和流密码 (书中77页)
密码算法可以分为分组密码和流密码两种。
分组密码(block cipher)是每次只能处理特定长度的一块数据的一类密码算法,这里的“一块”就称为分组(block)。此外,一个分组的比特数就称为分组长度(block length)。
例如:DES和三重DES的分组长度都是64比特。这些密码算法一次只能加密64比特的明文,并生成64比特的密文。
AES的分组长度为128比特,因此AES一次可加密128比特的明文,并生成128比特的密文。
流密码(stream cipher)是对数据流进行连续处理的一类密码算法。流密码中一般以1比特、8比特或32比特等为单位进行加密和解密。
模式有很多种类,分组密码的主要模式有以下5种。
ECB模式:Electronic CodeBook mode(电子密码本模式)
CBC模式:Cipher Block Chaining mode(密码分组链接模式)
CFB模式:Cipher FeedBck mode(密文反馈模式)
OFB模式:Output FeedBack mode(输出反馈模式)
CTR模式:CounTeR mode(计数器模式)
4.3 ECB模式
将明文分组直接加密的方式就是ECB模式,这种模式非常简单,但由于存在弱点因此通常不会被使用。
4.4 CBC模式
CBC模式是将前一个密文分组与当前明文分组的内容混合起来进行加密的,这样就可以避免ECB模式的弱点。
CBC模式的全称是密文分组链接模式,之所以叫这个名字,是因为密文分组是像链条一样相互连接在一起的。
在CBC模式种,首先将明文分组与前一个密文分组进行XOR运算,然后再进行加密。
如果将一个分组的加密过程分离出来,我们就可以很容易地比较出ECB模式和CBC模式的区别。ECB模式之进行了加密,而CBC模式则在加密之前进行了一次XOR。
当加密第一个明文分组时,由于不存在“前一个密文分组”,因此需要事先准备一个长度为一个分组的比特序列来代替“前一个密文分组”,这个比特序列称为初始化向量(Initialization Vector),通常缩写为IV。一般来说,每次加密时都会随机产生一个不同的比特序列来作为初始化向量。
4.5 CFB模式
CFB模式的全称是密文反馈模式。在CFB模式中,前一个密文分组会被送回密码算法的输入端。所谓反馈,这里指的就是返回输入端的意思。
4.6 OFB模式
OFB模式的全称是输出反馈模式。在OFB模式中,密码算法的输出会反馈到密码算法的输出中。
PFB模式并不是通过密码算法对明文直接进行加密的,而是通过将“明文分组”和“密码算法的输出”进行XOR来产生“密文分组”的,在这一点上OFB模式和CFB模式非常相似。
和CBC模式、CFB模式一样,OFB模式中也需要使用初始化向量(IV)。一般来说,我们需要在每次加密时生成一个不同的随机比特序列用作初始化向量。
OFB模式和CFB模式的区别仅仅在于密码算法的输出。
4.7 CTR模式
CTR模式全称是计数器模式。CTR模式是一种通过将逐次累加的计数器进行加密来生成**流的流密码。
CTR模式中,每个分组对应一个逐次累加的计数器,并通过对计数器进行加密来生成**流。也就是说,最终的密文分组是通过将计数器加密得到的比特序列,与明文分组进行XOR而得到的。
CTR模式和OFB模式一样,都属于流密码。

总结:
分组密码算法的选择固然很重要,但模式的选择也很重要。对模式完全不了解的用户在使用分组密码算法时,最常见的做法就是将明文分组按顺序分别加密,而这样做的结果就相当于使用了安全性最差的ECB模式。
1字节等于8比特。128比特等于16字节。
第5章 公钥密码
-用公钥加密,用私钥解密
投币寄物柜的例子。
首先,将物品放入寄物柜中。然后,投入硬币并拔出钥匙,就可以将寄物柜关闭了,关闭后的寄物柜,没有钥匙时无法打开的。
只要有硬币,任何人都可以关闭寄物柜,但寄物柜一旦被关闭,再怎么投币也无法打开。打开寄物柜需要使用钥匙,而不是硬币。
因此我们可以说,硬币是关闭寄物柜的**,而钥匙则是打开寄物柜的**。
在对称密码中,由于加密和解密的**是相同的,因此必须像接收者配送**。用于解密的**必须被配送给接收者,这一问题称为**配送问题。如果使用公钥密码,则无需向接收者配送用于解密的**,这样就解决了**配送问题。
解决**配送问题的方法有以下几种。
通过事先共享**来解决
通过**分配中心来解决
通过Diffie-Hellman**交换来解决
通过公钥密码来解决
加***和解***的区别:
发送着只需要加***
接收者只需要解***
解***不可以被窃听者获取
加***被窃听者获取也没问题
加***被称为公钥,解***被称为私钥。
公钥和私钥匙一一对应的,一对公钥和私钥统称为**对(key pair)。
5.4.5公钥密码无法解决的问题
1、需要判断所得到的公钥是否正确合法,这个问题被称为公钥认证问题。
2、公钥密码有一个问题就是,它的处理速度只有对称密码的几百分之一。
5.5 时钟运算
此章节为了让大家更好的理解RSA的算法,做的一些运算讲解章节。
5.6 RSA (书中120页)
5.6.1 什么是RSA
公钥密码的代码,RSA是一种公钥密码算法,可以被用于公钥密码和数字签名。
5.6.2 RSA加密
在RSA中,明文、**和密文都是数字。RSA的加密过程可以用下列公式来表达,这个公式很重要。
mod为获取余数
RSA的密文是对代表明文的数字的E次方求mod N的结果。换句话说,就是将明文和自己做E次乘法,然后将其结果除以N求余数,这个余数就是明文。
对明文进行乘方运算并求mod即可,这就是整个加密的过程。
E和N是RSA加密的**,也就是说,E和N的组合就是公钥。
5.6.3 RSA解密
对表示密文的数字的D次方求mod N就可以得到明文。换句话说,将密文和自己做D次乘法,再对其结果除以N求余数,就可以得到明文。
这里所使用的数字N和加密时使用的数字N是相同的。数D和数N组合起来就是RSA的解***,因此D和N的组合就是私钥。只有知道D和N两个数的人才能够完成解密的运算。
5.6.4 生成**对
RSA的机密是求“E次方的mod N”
RSA的解密是求“D次方的mod N”
由于E和N是公钥,D和N是私钥,因此求E、D和N这三个数就是生成**对。
5.6.5 具体实践一下吧
具体的一个RSA**生成、加密已经解密的过程例子。
一些问题和解答:
公钥密码比对称密码的机密性更高吗?
这个问题无法回答,因为机密性的高低是根据**长度而变化的。
之后的用法:
对称密码提高处理速度,用公钥密码即决**配送问题,这样的方式称为混合密码系统。
第六章 混合密码系统
-用对称密码提高速度,用公钥密码保护会话**
混合密码系统用对称密码来加密明文,用公钥密码来加密对称密码中所使用的**。通过使用混合密码系统,就能够在通信中将对称密码和公钥密码的优势结合起来。
混合密码系统的组成机制:
用对称密码加密消息
通过伪随机数生成器生成对称密码加密中使用的会话**
用公钥密码加密会话**
从混合密码系统外部赋予公钥密码时使用的**
著名的密码软件PGP、以及网络上的密码通信所使用的SSL/TLS都运用了混合密码系统。
怎样才算是高强度的混合密码系统呢?混合密码系统运用了伪随机数生成器、对称密码和公钥密码,因此其中每一种技术要素的强度都必须提高。然而实际上还不尽如此,这些技术要素之间的强度平衡也非常重要。