第1章    环游密码世界

加密和解密

    加密之前的消息称为明文(plaintest),加密之后的消息称为密文(ciphertext)

    正当的接收者将密文还原为明文称为“解密”,但接收者以外的其他人试图将密文还原为明文,则称为密码破译(cryptanalysis),简称为破译,有时也称为密码分析。进行密码破译的人称为破译者(cryptanalyst)


对称密码与公钥密码

    用于解决复杂问题的步骤,通常称为算法(algorithm)。从明文生成密文的步骤,也就是加密的步骤,称为“加密算法”,而解密的步骤则称为“解密算法”。加密、解密的算法合在一起统称为密码算法

    密码算法中需要密钥(key)

    根据密钥的使用方法,可以密码分为对称密码和公钥密码两种。

    对称密码(symmetric cryptography)是指在加密和解密时使用同一密钥的方式。而公钥密码(public-key cryptography)则是指在加密和解密时使用不同密钥的方式。因此公钥密码又称为非对称密码(asymmetric cryptography)

    PS:对称密码有多种别名,如公共密钥密码(common-key cryptography)、传统密码(conventional cryptography)、私钥密码(secret-key cryptography)、共享密钥密码(shared-keycryptography)等。

    将对称密码和公钥密码结合起来的密码方式称为混合密码系统(hybrid cryptosystem)


其他密码技术

单向散列函数

    为了防止软件被篡改,有安全意识的软件发布者会在发布软件的同时发布该软件的散列值。散列值就是单向散列函数(one-way hash function)计算出来的数值。下载该软件的人可以自行计算所下载文件的散列值,然后与软件发布者公布的散列值进行对比。如果两个散列值一致,就说明下载的文件与发布者所发布的文件是相同的。

    PS:散列值(hash)又称为哈希值、密码校验和(cryptographic checksum)、指纹(fingerprint)、消息摘要(message digest)。

    单向散列函数所保证的并不是机密性,而是完整性(integrity)。完整性指的是“数据是正牌的而不是伪造的”这一性质。使用单向散列函数,就可以检测出数据是否被篡改过。

消息认证码

    为了确认消息是否来自所期望的通信对象,可以使用消息认证码(message authentication code)技术。通过消息认证码,不但能够确认消息是否被篡改,而且能够确认消息是否来自所期待的通信对象。也就是说,消息认证码不仅能够保证完整性,还能够提供认证(authentication)机制。

数字签名

    能够防止伪装(spoofing)、篡改、否认(requdiation)等威胁的技术,就是数字签名(digital signature)。数字签名是一种能够确保完整性、提供认证并防止否则的密码技术。

伪随机数生成器

    伪随机数生成器(Pseudo Random Number Generator,PRNG)是一种能够模拟产生随机数列的算法。随机数和密码技术有关,实际上随机数确实承担着密钥生成的重要职责。


wKiom1hNeWzh0Zi4AADpKGu9yAs955.png


隐写术与数字水印

    不是让消息内容变得无法解读,而是能够隐藏消息本身,这种技术称为隐写术(steganography)。隐写术的目的是隐藏消息本身,但如果搞清楚了嵌入消息的方法,也就可以搞清楚消息的内容。因此,隐写术并不能代替密码。密码隐藏的是内容,隐写术隐藏的是消息本身。通过将密码与隐写术相结合,就可以产生两者所各自具备的效果。


密码与信息安全常识

    ·不要使用保密的密码算法

    ·使用低强度的密码比不进行任何加密更危险

    ·任何密码总有一天都会被破解

    ·密码只是信息安全的一部分


第2章    历史上的密码——写一篇别人看不懂的文章

凯撒密码

    凯撒密码(Caesar cipher)是通过将明文中所使用的字母表按照一定的字数“平移”来进行加密。凯撒密码中,将字母表中的字母平移这个操作就是密码的算法,而平移的字母数量则相当于密钥。

    凯撒密码的解密过程是使用与加密时相同的密钥进行反向的平移操作

    将所有可能的密钥全部尝试一遍,这种方法称为暴力破解(brute-force attack)。由于这种方法的本质是从所有的密钥中找出正确的密钥,因此又称为穷举搜索(exhaustive search)



简单替换密码

    将明文中所使用的字母表替换为另一套字母表的密码称为简单替换密码(simple substitution cipher)。凯撒密码也可以说是简单替换密码的一种。

    简单替换密码的加密过程是依次将明文中的每一个字母按照替换表替换成另一个字母。只要使用加密时所使用的替换表进行反向替换,及可以对简单替换密码进行解密了。由于在简单替换密码的解密中,需要用到加密时所使用的替换表,因此发送者和接收者必须事先同时拥有该替换表,而这份替换表也就相当于替换密码的密钥。

    一种密码能够使用的“所有密钥的集合”称为密钥空间(keyspace)。所有可用密钥的总数就是密钥空间的大小。密钥空间越大,暴力破解就越困难。

    使用被称为频率分析的密码破译方法,就能够破译简单替换密码。频率分析利用了明文中的字母的出现频率与密文中的字母的出现频率一致这个特性。


Enigma


为什么要将密码算法和密钥分开

    ·凯撒密码

    密码算法:将明文中的各个字母按照指定的字母数平移

    密钥:平移的字母数量

    ·简单替换密码

    密码算法:按照替换表对字母表进行替换

    密钥:替换表

    ·Enigma(通信密码的加密)

    密码算法:使用Enigma密码机,通过接线板的接线方式、三个转子的顺序、每个转子的选装位置对字母进行替换

    密钥(每日密码):接线板的接线方式、三个转子的顺序、每个转子的旋转位置

    ·Enigma(通信电文的加密)

    密码算法:使用接线板的接线方式和三个转子的顺序固定的Enigma密码机,按照每个转子的旋转位置对字母进行替换

    密钥(通信密码):每个转子的旋转位置


对称密码(共享密钥密码)——用相同的密钥进行加密和解密


    将现实世界中的东西映射为比特序列的操作称为编码(encoding)

    

    一次性密码本(One-time pad),又称维纳密码(Vernam cipher):即便用暴力破解法遍历整个密钥空间,一次性密码本也绝对无法破译。它的原理是“将明文与一串随机的比特序列进行XOR运算”

    一次性密码本是无法破译的。这里所说的无法破译,并不是指现实的时间内难以破译,而是即便拥有一种运算能力无穷大的计算机,可以在一瞬间遍历任意大小的密钥空间,也依然无法破译。最重要的是,即便我们能够解密出明文的字符串,我们也无法判断它是正确的明文。由于明文中所有可能的排列组合都会出现,因此我们无法判断其中哪一个才是正确的明文(也就是用哪个密钥才能够正确解密)。一次性密码本无法破译这一特性由香农于1949年通过数学方法加以证明的。一次性密码本是无条件安全的(unconditionally secure),在理论上是无法破译的(theoretically unbreakable)。

    一次性密码本为什么没有被使用?因为它是一种非常不实用的密码,原因如下。

    密钥的配送:如果能够有一种方法将密钥安全地发送出去,那么岂不是也可以用同样的方法来安全地发送明文吗?

    密钥的保存:在一次性密码本中,密钥的长度必须和明文的长度相等,而且由于密钥保护着明文的机密性,因此必须妥善保存,不能被窃听者窃取。不过,如果能够有办法安全保存与明文一样长的密钥,那不也就有办法保存明文本身了吗?也就是说,从一开始我们根本不需要密码。

    密钥的重用:一次性密码本是绝对不能重用过去的随机比特序列的,一次性密码本中的“一次性”也正是由此而来。这是因为作为密钥的比特序列一旦泄漏,过去所有的机密通信内容将全部被解密。

    密码的同步:当明文很长时,一次性密码本的密钥也会跟着变长。   

    密钥的生成:在一次性密码本中,需要生成大量的随机数。这里的随机数并不是通过计算机程序生成的伪随机数,而必须是无重视性的真正随机数。

    出于上述原因,能够使用一次性密码本的,只有那些机密重过一切,且可以花费大量财力和人力来生成并配送密钥的场合。


DES

    什么是DES

    DES(Data Encryption Standard)是1977年美国联邦信息处理标准(FIPS)中采用的一种对称密码(FIPS 46-3)。

    然而,随着计算机的进步,现在DES已经能够暴力破解,强度大不如前。由于DES的密文可以在短时间内被破译,因此除了用它来解密以前的密文以外,现在我们在较高安全场景下不应该再使用DES。

    加密和解密

    DES是一种将64比特的明文加密成64比特的密文的对称密码算法,它的密钥长度是56比特。尽管从规格上来说,DES的密钥长度是64比特,但由于每隔7比特会设置一个用于错误校验的比特,因此实质上其密钥长度是56比特。

    DES是以64比特的明文(比特序列)为一个单位来进行加密的,这个64比特的单位称为分组。一般来说,以分组为单位进行处理的密码算法称为分组密码(blocck cipher),DES就是分组密码的一种。

    DES每次只能加密64比特的数据,如果要加密的明文比较长,就需要对DES加密进行迭代(反复),而迭代的具体方式就是模式(mode)。

wKioL1hSsU3gZsc9AACr0znrkmg878.png

    DES的结构(Feistel网络)

    DES的基本结构是由Horst Feistel设计的,因此也称为Feistel网络(Feistel network)、Feistel结构(Feistel structure)或者Feistel密码(Feistel cipher)。

    在Feistel网络中,加密的各个步骤称为轮(round),整个加密过程就是进行若干次轮的循环。下图展现的是Feistel网络中一轮的计算流程。DES是一种16轮循环的Feistel网络。

wKiom1hSs_rDp9g5AACGIj_N6ec530.png



三重DES

    什么是三重DES

    三重DES(triple-DES)是为了增加DES的强度,将DES重复3次所得到的一种密码算法,通常缩写为3DES。

    三重DES的加密

wKiom1hStybR6nRgAABzM1_8bWA892.png

    明文经过三次DES处理才能变成最后的密文,由于DES密钥的长度实质上是56比特,因此三重DES的密钥长度就是56*3=168比特。

    三重DES并不是进行三次加密,而是加密-解密-加密的过程。实际上这个方法是IBM公司设计出来的,目的是为了让三重DES能够兼容普通的DES。

    当三重DES中所有的密钥都是相同时,三重DES也就等同于普通的DES了。这是因为在前两步加密-解密之后,得到的就是最初的明文。因此,以前用DES加密的密文,就可以通过这种方式用三重DES来进行解密。也就是说,三重DES对DES具备向下兼容性。

wKioL1hSuLuzBiwxAABmdkc6xv8038.png

    DES的加密和解密过程只是改变了子密钥的顺序,而实际进行的处理是相同的。

    如果所有密钥都使用相同的比特序列,则其结果与普通的DES是等价的。

    如果密钥1和密钥3使用相同的密钥,而密钥2使用不同的密钥(也就是只使用两个DES密钥),这种三重DES就称为DES-EDE2。EDE表示的是加密(Encryption)-解密(Decrypiton)-加密(Encrypiton)这个流程。

    密钥1、密钥2、密钥3全部使用不同的比特序列的三重DES称为DES-EDE3。

wKiom1hSuirwxxYXAABy6fR-ahw455.png

    三重DES的解密

    三重DES的解密过程和加密正好相反,是以密钥3、密钥2、密钥1的顺序执行解密-加密-解密的操作。

wKioL1hSupqweE1JAACDK9OtHAc865.png

 

AES的选定过程

    什么是AES

    AES(Advanced Encryption Standard)是取代其前任标准(DES)而成为新标准的一种对称密码算法。2000年从候选算法中选出了一种名为Rijndael的对称密码算法,并将其确定为了AES。

    通过竞争来实现标准化(standardization by competition)的方式,正是密码算法选定的正确方式。由世界最高水平的密码学家共同尝试破译,依然未能找到弱点,只有这样的事实才能才能够证明一种密码算法的强度。


Rijndael

    Rijndael的分组长度为128比特,密钥长度可以以32比特为单位在128比特到256比特的范围内进行选择(不过在AES的规格中,密钥长度只有128、192和256比特三种)。

    Rijndael的加密和解密

    和DES一样,Rijndael算法也是由多个轮所构成的,图3-11展示了每一轮的大致计算步骤。Rijndael没有使用Feistel网络,而是使用了SPN结构

    Rijndael的输入分组为128比特,也就是16字节。首先,需要逐个地对16字节的输入进行Subbyte处理。所谓SubBytes,就是以每个字节的值(0-255中的任意值)为索引,从一张拥有256个值的替换表(S-Box)中查找出对应值的处理,也就是说,将一个1字节的值替换成另一个1字节的值。

    SubBytes之后需要进行ShitRows处理,即将SubBytes的输出以字节为单位进行打乱处理。

    ShiftRows之后需要进行MixColumns处理,即对一个4字节的值进行比特运算,将其变为另一个4字节值。

    最后,需要将MixColumns的输出与轮密钥进行XOR,即进行AddRoundKey处理。到这里,Rijndael的一轮就结束了。实际上,在Rijndael中需要重复进行10-14轮计算。

wKiom1hUEnfhQmtBAAGbstlZhT8469.png

wKioL1hUEqjAOdloAAGfTs-rFkY687.png


应该使用那种对称加密呢

    今后最好不要将DES用于新的较高的安全用途,因为随着计算机技术的进步,现在用暴力破解法已经能够在现实的时间内完成对DES的破译。但是,在某些情况下也需要保持与旧版本软件的兼容性。

    出于兼容性的因素三重DES在今后还会使用一段时间,但会逐步被AES所取代。

    今后大家应该使用的算法是AES(Rijndael),因为它安全、快速,而且能够在各种平台上工作。


分组密码的模式——分组密码是如何迭代的

    DES和AES都属于分组密码,它们只能加密固定长度的明文。如果需要加密任意长度的明文,就需要对分组密码进行迭代,而分组密码的迭代方法就称为分组密码的“模式”。


分组密码和流密码

    分组密码(block cipher)是每次只能处理特定长度的一块数据的一类密码算法,这里“一块”就称为分组(block)。此外,一个分组的比特数就称为分组长度(block length)

    流密码(stream cipher)是对数据流进行连续处理的一类密码算法。流密码中一般以1比特、8比特或32比特等为单位进行加密和解密。

    分组密码处理完一个分组就结束了,因此不需要通过内部状态来记录加密的进度;相对地,流密码是对一串数据流进行连续处理,因此需要保持内部状态。


什么是模式

    分组密码算法只能加密固定长度的分组,但是我们需要加密的明文长度可能会超过分组密码的分组长度,这时就需要对分组密码算法进行迭代,以便将一段很长的明文全部加密。而迭代的方法就称为分组密码的模式(mode)。

    模式有很多种,分组密码的主要模式有以下5种:

    ·ECB模式:Electronic CodeBook mode(电子密码本模式)

    ·CBC模式:Cipher Block Chaining mode(密码分组链接模式)

    ·CFB模式:Cipher FeedBack mode(密文反馈模式)

    ·OFB模式:Output FeedBack mode(输出反馈模式)

    ·CTR模式:CounTeR mode(计数器模式)


    明文分组与密文分组

    明文分组是指分组密码算法中作为加密对象的明文。明文分组的长度与分组密码算法的分组长度是相等的。

    密文分组是指使用分组密码算法将明文分组加密之后所生成的密文。

wKiom1hWnubg5ZpwAABzFbVHkfk382.png

    主动***者Mallory

    窃听者只能被动地进行窃听,而主动***者则可以主动介入发送者和接受者之间的通信过程,进行阻碍或者是篡改密文等活动。这样的***者一般称为Maollroy,这个名字可能来自于“恶意的”(malicious)一词。


ECB模式

     什么是ECB

    EBC模式的全称是Electronic CodeBook模式。在ECB模式中,将明文分组加密之后的结果直接成为密文分组。

wKiom1hWoxLzFmWBAAE0Eqn09FU260.png

wKiom1hWoxKAoMorAAGBgBrThDY944.png

    使用ECB模式加密时,相同的分组会被转换为相同的密文分组,也就是说,我们可以将其理解为是一个巨大的“明文分组-密文分组”的对应表,因此ECB模式也称为电子密码本模式

    ECB模式的特点

    只要观察一下密文,就可以知道明文中存在怎样的重复组合,并可以以此为线索来破译密码,因此ECB模式存在一定的风险。


    对ECB模式的***

    加入存在主动***者Mallory,他能够改变密文分组的顺序,但这其实是一个很大的弱点。由于密文分组的顺序被改变了,因此响应的明文分组的顺序也会被改变。也就是说,***者Mallory无需破译密码就能够操作明文



CBC模式

    CBC模式是将前一个密文分组与当前明文分组的内容混合起来进行加密的,这样就可以避免ECB模式的弱点。

    什么是CBC模式

    CBC模式全称是Cipher Block Chaining(密文分组链接模式),之所以叫这个名字,是因为密文分组是像链条一样相互连接在一起的。

    在CBC模式中,首先将明文分组与前一个密文分组进行XOR运算,然后再进行加密。

wKioL1hWtIrS8N80AAFwPPExW0E664.png

   初始化向量

    当加密第一个明文分组时,由于不存在“前一个密文分组”,因此需要事先准备一个长度为一个分组的比特序列来代替“前一个密文分组”,这个比特序列称为初始化向量(initializaiton vector),通常缩写为IV。一般来说,每次加密时都会随机产生一个不同的比特序列来作为初始化向量。

    CBC模式的特点

    假设CBC模式的密文分组中有一些比特缺失了,那么此时即便值缺失了1比特,也会导致密文分组的长度发生变化,此后的分组发生错位,这样一来,缺失比特的位置之后的密文分组也就全部无法解密了。


CFB模式

    什么是CFB模式

    CFB模式的全称是Cipher FeedBack模式(密文反馈模式)。在CFB模式中,前一个密文分组会被送回到密码算法的输入端。所谓反馈,这里指的就是返回输入端的意思。

wKiom1hX40zh5Y4OAADND_4IQ9c584.png

wKioL1hX403CntLOAAD4l1Gk2iw770.png

    在ECB和CBC模式中,明文分组都是通过密码算法进行加密的,然而,在CFB模式中,明文分组并没有通过密码来进行直接加密。

wKioL1hX5YmAzmH1AACUL8pDza0478.png


OFB模式

    OFB模式的全称是Output-Feedback模式(输出反馈模式)。在OFB模式中,密码算法的输出反馈到密码算法的输入中。

    OFB模式并不是通过密码算法对明文直接进行加密的,而是通过将“明文分组”和“密码算法的输出”进行XOR来产生“密文分组”的,这一点上OFB模式和CFB模式非常相似。

wKioL1hX5pjBv-FQAAEV8EaziXw327.png

CTR模式

    CTR模式的全称是CounTeR模式(计数器模式)。CTR模式是一种通过将逐次累加的计数器进行加密来生成密钥流的流密码。

    CTR模式中,每个分组对应一个逐次累加的计数器,并通过对计数器进行加密来生成密钥流。也就是说,最终的密文是通过将计数器加密得到的比特序列,与明文分组进行XOR而得到的。

wKiom1hX53Hwe-G8AADtc_bAjrE686.png

wKioL1hX53GzfsX1AAEeB2NJuuk558.png

应该使用那种模式?

wKioL1hX58zS9WOIAAHYrp0dqCI726.png

wKiom1hX582S9fKIAAIT3re_2vo030.png



第5章    公钥密码——用公钥加密,用私钥解密

密钥配送问题

    什么是密钥配送问题

    解决密钥配送问题的方法:

    ·通过事先共享密钥来解决

    ·通过密钥分配中心来解决

    ·通过Diffie-Hellman密钥交换来解决

    ·通过公钥密码来解决


    通过事先共享密钥的方法来解决

    就是事先用安全的方式将密钥交给对方,这称为密钥的事先共享。但在人数众多很多的情况下,通信所需要的密钥数量也会增大,这就产生了问题。

    通过密钥分配中心来解决

    我们可以通过密钥分配中心(Key Distribution Center,KDC)来解决密钥配送问题。密钥分配中心尽管有效,但也有局限。首先,每当员工进行加密通信时,密钥分配中心计算机都需要进行上述处理。随着员工数量的增加,密钥分配中心的负荷也会随之增加。如果密钥分配中心计算机发生故障,全公司的加密通信就会瘫痪。

    通过Diffie-Hellman密钥交换来解决密钥配送问题

    这里的交换指的是发送者和接受者之间相互传递信息的意思。提前交换一些信息。

    通过公钥密码来解决密钥配送的问题

    接收者事先将加密密钥发送给发送者,这个加密密钥即便窃听者获取也没有问题。发送者使用加密密钥对通信内容进行加密并发送给接收者,而只有拥有解密密钥的人(即接收者本人)才能够进行解密。这样一来,就用不着将解密密钥配送给接收者了,也就是说,对称密码的密钥配送问题,可以通过使用公钥密码来解决。


    什么是公钥密码

    公钥密码(public-key cryptography)中,密钥分为加密密钥和解密密钥两种。发送者用加密密钥对消息进行加密,接收者用解密密钥对密文进行解密。

    公钥密码中,加密密钥一般是公开的。正是由于加密密钥可以任意公开,因此该密钥被称为公钥(public key)。相对的,解密密钥是绝对不能公开的,这个密钥只能由你自己来使用,因此称为私钥(private key)。

    公钥和私钥是一一对应的,一对公钥和私钥统称为密钥对(key pair).由公钥进行加密的密文,必须使用与该公钥配对的私钥才能够解密。密钥对中的两个密钥之间具有非常密切的关系——数学上的关系——因此公钥和私钥是不能分别单独生成的。

    公钥密码无法解决的问题

    我们需要判断所得到的公钥是否正确合法,这个问题被称为公钥认证问题。此外,公钥密码还有一个问题就是,它的处理速度只有对称密码的几百分之一。


RSA

    什么是RSA

    RSA加密

    密文=明文 mod N    (RSA加密)

    也就是说,RSA的密文是对代表密文的数字的E次方求mod N的结果。换句话说,就是将明文和自己做E乘法,然后将其结果除以N求余数,这个余数就是密文。E和N是RSA加密的密钥,也就是说,E和N的组合就是公钥。

    RSA解密

    明文=密文 D mod N

    这里所使用的数字N和加密时使用的数字N是相同的。数D和数N组合起来就是RSA的解密密钥,因此D和N的组合就是私钥。只有知道D和N两个数的人才能够完成解密的运算。

wKioL1hemhCT2YyuAAB521Eadok617.png

wKioL1hemj-TfAzkAAB_c7gYvHI316.png


第6章    混合密码系统——用对称密码提高速度,用公钥密码保护会话密钥

混合密码系统

    混合密码系统(hybrid cryptosystem)是将对称密码和公钥密码的优势相结合的方法。一般情况下,将两种不同的方式组合的做法就称为混合(hybrid)。

    组成机制

    ·用对称密码加密消息。

    ·通过伪随机数生成器生成对称密码加密中使用的会话密钥。

    ·用公钥密码加密会话密钥。

    ·从混合密码系统外部赋予公钥密码加密时使用的密钥。

    怎样才是高强度的混合密码系统

    伪随机数生成器:采用算法较佳

    对称密码:使用高强度

    公钥密码:高强度

    密码长度的平衡:对称密码和公钥密码的密钥长度必须具备同等的强度。然而,考虑到长期运用的情况,公钥密码的强度应该要高于对称密码,因为对称密码的会话密钥被破译只会影响本次通信的内容,而公钥密码一旦被破译,从过去到未来的(用相同公钥加密的)所有通信内容就能够被破译了。


第2部分    认证

第7章    单向散列函数——获取消息的“指纹”

什么是单向散列函数

    单向散列函数(one-way hash function)有一个输入和输出,其中输入称为消息(message),输出称为散列值(hash vlaue)。单向散列函数可以根据消息的内容计算出散列值,而散列值就可以被用来检查消息的完整性。