2023年7月31日发(作者:)

密码学概述为什么会有密码在现代社会中,很多信息都存储在计算机⾥,这让信息的增删改查变得⾮常⽅便,信息可以通过多种⽅式传递给任何⼈。因此,保护好⾃⼰的秘密信息变得⾮常困难。为了解决这些问题,⼈们开发出形形⾊⾊的“密码技术”。从密码、认证、应⽤技术三⽅⾯介绍。⼀、密码⾸先看⼀下历史上著名的密码,第⼀个是恺撒密码,恺撒密码是将明⽂中所使⽤的字母表按照⼀定位数平移得到密⽂。在我们得到⼀串密⽂之后,可通过穷举的⽅式进⾏暴⼒破解,因为恺撒密码的密钥空间为 26,很容易被破解出来。Enjoy it while it lasts 平移三位得到密⽂e->H n->Q j->M o->R y->B i->L w->Z h->K l->O t->W a->D s->VHQMRB LW ZKLOH LW ODVWV还有简单替换密码,是将明⽂中所使⽤的字母表替换为另⼀套字母表。Enjoy it while it lasts -> XNVBK JQ CTJGX JQ GWLQL对应关系是不定的,所以如果⽤暴⼒破解的话,密钥空间为 26*25*.. 即使每秒遍历 10 亿个密钥,也要遍历 120 亿年,所以极难破解。但是使⽤频率分析法破解就⾮常容易,统计密⽂中字符出现的频率,从其他样⽂中寻找规律,⽐如⼀篇⽂章出现最多的字符是e,就可把密⽂中出现最多的字符替换为e。⽂中经常会出现 is the this 这样的字眼,根据这些规律进⾏替换尝试。密⽂越长的话越容易被破解。以上可知加密算法应要保证密钥空间强度,密⽂及密钥也不应有⼀定规律。1、对称密码对称密码⼜称共享密码,加密和解密密钥相同。1.1、⼀次性密码本⼀次性密码本是将明⽂与⼀串随机的⽐特序列进⾏异或运算得到密⽂。明⽂的⽐特序列与⼀串随机的⽐特序列进⾏异或运算得到密⽂,密⽂再与密钥进⾏异或运算得到明⽂。⼀次性密码⼀次性密码本为什么没有被使⽤,主要有以下⼏点:1. 密钥如何发送给对⽅?在⼀次性密码本中,密钥和原⽂是⼀样长度的,试想如果有办法能把密⽂安全的送达到对⽅,那么是否可以⽤这种⽅法把明⽂送达到对⽅呢?所以这是⼀个⽭盾的问题。2. 密钥保存是⼀个问题⼀次性密码本的密钥长度和原⽂⼀样长,密钥不能删除也不能丢弃。丢弃了密钥相当于丢弃了明⽂。所以“加密保护明⽂”的问题被转换成了“如何安全的保护和明⽂⼀样长度的密钥”的问题,实际上问题还是没有解决。3. 密钥⽆法重⽤如果加密的原⽂很长,那么密钥也要相同长度,并且密钥每次还要不同,因为如果是相同的,密钥⼀旦泄露以后,过去所有⽤这个密钥进⾏加密的原⽂全部都会被破译。4. 密钥同步难如果密钥每次都变化,那么密钥如何同步也是⼀个问题。密钥在传递过程中不能有任何错位,如果错位,从错位的那⼀位开始之后的每⼀位都⽆法解密。5. 密钥⽣成难⼀次性密码本想要真正的永远⽆法破解,就需要⽣成⼤量的真正的随机数,不能是计算机⽣成的伪随机数。1.2、DESDES (Data Encryption Standard) 是 1977 年美国联邦信息处理标准(FIPS)中所采⽤的⼀种对称密码(FIPS 46-3)。DES ⼀直以来被美国以及其他国家的政府和银⾏所使⽤。1997 年 DES Challenge I ⽐赛中⽤了 96 天破解了 DES 密钥,1998 年的 DES Challenge II-1 ⽐赛中⽤了 41 天就破解了密钥。1998 年的 DES Challenge II-2 ⽐赛中⽤了 56 个⼩时,1999 年的 DES Challenge III ⽐赛中只⽤了 22 ⼩时 15 分钟。⽬前来说,DES 已经不再安全了。除了⽤来解密以前⽼的 DES 密⽂以外,不再使⽤ DES 进⾏加密了。DES 是⼀种把 64 位明⽂加密成 64 位密⽂的对称加密算法。它的密钥长度为 64 ⽐特,但是除去每 7 个⼆进制位会设置⼀个⽤于错误检测的位以外,实际上密钥为 56 ⽐特。DES 会以 64 个⼆进制为⼀个分组进⾏加密。以分组为单位进⾏处理的密码算法成为分组密码。DES 加密的基本结构是 Feistel ⽹络、Feistel 结构、Feistel 密码,这个结构不仅仅⽤在 DES 中,还⽤在其他的加密算法中。在 Feistel ⽹络中,加密的各个步骤称为轮(round),整个加密过程就是若⼲次轮的循环。DES 是⼀种 16 轮循环的 Feistel ⽹络。64 位的输⼊被分为左右两侧的输⼊,右侧的 32 位直接向下得到右侧的数据,右侧数据和⼦密钥通过轮函数⽣成⼀串随机的⽐特序列,此串⽐特序列和左侧32位输⼊进⾏异或运算得到左侧密⽂。Feistel结构⼀轮加密之后可以看到,左侧数据被加密了,右侧并没有,所以第⼆轮时左右两侧交换数据再次执⾏上图的步骤。⼀个 3 轮的 Feistel ⽹络。3 轮⽹络有 3 个⼦密钥和 3 个轮函数,中间有 2 次左右对调的过程。注意:n 轮 Feistel ⽹络只交换 n-1 次,最后⼀次不⽤交换。Feistel ⽹络的特点加密的时候⽆论使⽤任何函数作为轮函数都可以正确的解密,⽆须担⼼⽆法解密。就算轮函数输出的结果⽆法逆向计算出输⼊的值也⽆须担⼼。Feistel ⽹络把加密算法中核⼼的加密本质封装成了这个轮函数,设计算法的⼈把所有的⼼思放在把轮函数设计的尽量负责即可。加密和解密可以⽤完全相同的结构来实现。虽然每⼀轮只加密了⼀半的明⽂,放弃了加密效率,但是获得了可以⽤相同结构来实现,对于加密硬件设备设计也变得更加容易。加解密由于 Feistel ⽹络的这些优点,所以很多分组密码选择了它。⽐如 AES 候选算法中的 MARS、RC6、Twofish。不过最终 AES 定下的Rijndael 算法并没有选择它,⽽是选择的 SPN ⽹络。1.3、三重DES三重 DES (triple-DES) 是为了增加 DES 强度,所以将 DES 重复 3 次得到的⼀种算法。也称为 TDEA (Triple Data EncryptionAlgorithm),通常缩写为 3DES。使⽤加密、解密、加密的步骤是为了兼容 DES,当三个密钥相同时就是普通的 DES 加密。3DES3DES 由于处理速度不⾼,除了兼容之前的 DES 以外,⽬前基本不再使⽤它了。1.4、AESAES (Advanced Encrytion Standard) 是取代前任标准 DES ⽽成为新标准的⼀种对称密码算法。在全世界的范围内征集 AES 加密算法,最终于 2000 年从候选中选出了 Rijndael 算法,确定它为新的 AES。1997 年开始征集 AES,1998 年满⾜条件并最终进⼊评审的有 15 个算法:CAST-256、Crypton、DEAL、DFC、E2、Frog、HPC、LOK197、Magenta、MARS、RC6、Rijndael、SAFER+、Serpent、Twofish。2000 年 10 ⽉ 2 ⽇,Rijndael 并定位 AES 标准。AES 可以免费的使⽤。Rijndael 的分组长度和密钥长度可以分别以 32 位⽐特为单位在 128 ⽐特到 256 ⽐特的范围内进⾏选择。不过在 AES 的规范中,分组长度被固定在 128 ⽐特,密钥长度只有 128、192 和 256 ⽐特三种。AES 的加密也是由多个轮组成的,分为 4 轮,SubBytes、ShiftRows、MixColumns、AddRoundKey 这 4 步,即 SPN ⽹络。⼀般要进⾏10-14轮运算。以 128 位分组长度为例,第⼀步字节替换,将 16 个字节依次和 s-box ⾥⾯的字节按照索引进⾏替换得到新的矩阵,第⼆步是⾏移位,除了第⼀⾏,其他⾏依次左移不同位数,第三部是列的矩阵相乘,最后⼀步是每⼀个字节和轮密钥进⾏异或运算,这是整个⼀轮的步骤。1.5、分组模式由于 DES 和 AES ⼀次加密都只能加密固定长度的明⽂,如果需要加密任意长度的明⽂,就需要对分组密码进⾏迭代,⽽分组密码的迭代⽅式就称为分组密码的“模式”。分组密码有很多模式,如果模式选择的不恰当就⽆法充分保障机密性。分组密码(block cipher) 是每次只能处理特定长度的⼀块数据的⼀类密码算法,这⾥的“⼀块”被称为分组。⼀个分组的⽐特数称为分组长度。例如 DES 和 3DES 的分组长度都是 64 位。AES 分组长度为 128 位。分组密码处理完⼀个分组以后就结束,不需要记录额外的状态。分组模式:ECB CBC CFB OFB CTR XTSECB 模式是分组模式⾥⾯最简单的,也是最没有安全性的。所以使⽤的⼈很少。ECB 模式全称“Electronic CodeBook”模式,在 ECB 模式中,将明⽂分组加密之后的结果直接就是密⽂分组,中间不做任何的变换。攻击者可以很容易的分析密⽂中的规律进⾏破解,即使不知道密钥,攻击者也可将密⽂分组进⾏顺序交换,从⽽使接收者获取不到正确的数据。CBC 模式的全称是 Cipher Block Chaining 模式,密⽂分组链接模式。名字中也展⽰它的实质,像链条⼀样相互链接在⼀起。有⼀个随机的初始化向量 IV ,初始化向量⾸先和明⽂分组1进⾏异或运算,在进⾏加密,得到密⽂分组1,密⽂分组1和明⽂分组2进⾏异或,再进⾏加密得到密⽂分组2,依次执⾏。2、⾮对称加密(公钥加密)为了防⽌中间⼈截获密钥,安全的把密钥传递给通信对⽅。有以下 4 种⽅式:1. 事先共享密钥这种⽅法虽然有效,但是具有局限性。在⼀次性密码本中,我们说过,⼤国之间的热线是⽤这种⽅式加密的,但是密钥是靠特⼯押送过去的。如果通讯对⽅在附近,提前共享密钥还⽐较⽅便。如果通讯对⽅在世界各地,这种⽅式也就存在局限性了。另外通讯量增⼤以后,密钥个数也会陡增。n 个⼈两两通讯,需要 n * (n-1) /2 个密钥。这点来看,也不现实。2. 密钥分配中⼼为了解决事先共享密钥的密钥增多的问题。于是有⼈想出了密钥分配中⼼(Key Distribution Center, KDC)的办法。每次加密的密钥由密钥中⼼进⾏分配,每个⼈只要和密钥中⼼事先共享密钥就可以了。虽然这个⽅法解决了密钥增多的问题,但是⼜带来了新的问题。密钥中⼼存储和记录了所有的密钥,⼀旦它出现故障或者被攻击破坏,那么所有的加密都会瘫痪。这也是集中式管理的缺点。3. Diffie-Hellman 密钥交换为了解决集中式管理的缺点,那么应该密钥的配送还是不能⽤集中式。于是有⼈想出了 Diffie-Hellman 密钥交换的⽅法。在 Diffie-Hellman 密钥交换中,加密通信双⽅需要交换⼀些信息,⽽这些信息即便被窃听者窃听,也不会有任何问题。根据交换的信息,双⽅各⾃⽣成相同的密钥。⽽窃听者⽆法⽣成相同的密钥。这种⽅式可⾏。不过这种⽅式不算是⾮对称加密,在本⽂中不详细讨论。4. 公钥密码⾮对称加密有⼀个公钥和⼀个私钥。公钥可以在⽹上传播,被窃听者拿到也没有关系,由于没有私钥,他也⽆法解开密⽂。私钥只要掌握在接收者⼿上就不会导致密⽂被窃听。⾮对称加密:⾮对称加密⼀般指的是具有公钥密钥(public-key cryptography)的加密算法。密钥分为加密密钥和解密密钥两种。发送者⽤加密密钥对信息进⾏加密,接收者⽤解密密钥对密⽂进⾏解密。可以公开出去的叫公钥(public key),保存在⾃⼰⼿上不公开的叫私钥(private key)。公钥和私钥是⼀⼀对应的。⼀对公钥和私钥统称为密钥对(key pair)。在数学的关系上,这两者不能单独⽣成。2.1、RSARSA 是⼀种公钥密码算法,它的名字是由它的三位开发者,即 Ron Rivest、Adi Shamir 和 Leonard Adleman 的姓⽒的⾸字母组成的(Rivest-Shamir-Adleman)。1983 年,RSA 公司为 RSA 算法在美国取得了权利。RSA 可以被⽤于公钥密码和数字签名。在 RSA 中,明⽂、密钥和密⽂都是数字。加密过程公式:密⽂ = 明⽂^E mod N解密过程公式:明⽂ = 密⽂^D mod N暴⼒破解的可能性:512 ⽐特能够容纳质数的数量⼤约为 10 的 150 次⽅。假设世界上有 100 亿⼈,每⼈每秒⽣产 100 亿个密钥对,那么经过 100 亿年⽣成的密钥对数量⼤概是 10 的 39 次⽅,远远⼩于 10 的 150 次⽅。在 2009 年,公开记录的被成功分解的最长 RSA 数为 768 位。在密钥长度⾜够的情况下,极难被破解。但是会有中间⼈攻击。例如 Charles 的抓包原理。其他公钥密码:ElGamal⽅式、Rabin⽅式、椭圆曲线密码。2.2、混合密码系统公钥密码解决了配送问题,还有两个很⼤的问题:1、公钥密码的处理速度远远低于对称密码;2、公钥密码难以抵御中间⼈攻击;所以就出现了混合密码系统,如图所⽰,基本原理是⽤对称密钥加密消息,⽤公钥加密对称密钥。结合对称密码和公钥密码的优势。三、认证密码保证了消息的机密性,但是⽆法保证消息的完整性、认证、不可否认性。所以有了“消息指纹”。3.1、单向散列函数常见的单向散列函数:MD4、MD5、SHA、SHA-1、SHA-2、SHA-3等单向散列函数具备的特性:根据任意长度的消息计算出固定长度的散列值能够快速计算出散列值消息不同,散列值也不同单向性应⽤:检测软件是否被篡改、基于⼝令的加密、消息认证码、数字签名、伪随机数⽣成器、⼀次性⼝令。单向散列函数⽆法解决的问题:单向散列函数能够辨别出“篡改”,但是⽆法辨别出“伪装”。对于⼀条消息不仅需要确认消息的完整性,还需要确认这个消息发⾃于谁。这仅仅靠完整性检查是不够的,还需要进⾏消息认证。认证的技术包括消息验证码和数字签名。3.2、消息认证码为什么需要消息认证码?A 向 B 汇钱 100 万元。如果攻击者从中攻击,篡改这条消息,就可能变成 A 向攻击者汇钱 1000 万元。这⾥针对汇款消息,需要注意两个问题:消息的 “完整性” 和 “认证” 。消息认证码(Message Authentication Code) 是⼀种确认完整性并进⾏认证的技术,简称 MAC。使⽤消息认证码可以确认⾃⼰收到的消息是否就是发送者的本意,也就是说可以判断消息是否被篡改,是否有⼈伪装成发送者发送了这条消息。使⽤现状:SWIFT(Society for Worldwide Interbank Financial Telecommunications---环球同业银⾏⾦融电讯协会) 是⼀个⽬的为国际银⾏间的交易保驾护航的协会。银⾏和银⾏间通过 SWIFT 来传递交易消息,SWIFT 会利⽤消息认证码校验消息的完整性和对消息的验证。消息认证码的共享密钥是由⼈进⾏配送的。IPsec 是对 IP 协议增加安全性的⼀种⽅式,在 IPsec 中,对消息的认证和完整性校验也是⽤消息认证码的⽅式。SSL/TLS 对通信内容的认证和完整性校验也⽤了消息认证码。消息认证码⽆法解决的问题:消息认证码虽然可以证明双⽅发送的消息是⼀致的,没有篡改,也不存在中间⼈伪装。但是它⽆法 “对第三⽅证明” 和 “防⽌抵赖”。⽆法 “对第三⽅证明” 原因是因为消息认证码中⽤到的密钥是共享密钥,通信双⽅都有这个密钥,所以对第三⽅⽆法证明消息到底出⾃双⽅中的哪⼀⽅。解决 “第三⽅证明” 的问题需要⽤到数字签名。⽆法 “防⽌抵赖” 原因是也是因为消息认证码的共享密钥双⽅都有,⽆法判断消息是发⾃于哪⼀⽅。所以消息认证码⽆法防⽌否认(nonrepudiation)。解决 “防⽌抵赖” 的问题需要⽤到数字签名。3.3、数字签名消息认证码的缺陷就在于它的共享密钥上⾯。由于共享密钥的原因,导致⽆法防⽌抵赖。数字签名就是为了解决抵赖的问题的。解决的⽅法就是让通信双⽅的共享密钥不同,从密钥上能区分出谁是谁。公钥密码与数字签名应⽤实例:1、安全信息公告2、软件下载3、公钥证书4、SSL/TLS数字签名⽆法解决的问题:数字签名所⽤到的公钥密码中的公钥需要另外认证,防⽌中间⼈攻击。认证⽤于验证签名的公钥必须属于真正的发送者。似乎陷⼊了⼀个死循环。数字签名⽤来识别消息篡改,伪装以及防⽌抵赖。但是我们⼜必须从没有被伪装的发送者得到没有被篡改的公钥才⾏。为了验证得到的公钥是否合法,必须使⽤证书。证书是将公钥当做⼀条消息,由⼀个可信的第三⽅对其签名后所得到的公钥。3.4、公钥证书公钥证书(Public-Key Certificate,PKC)记录着个⼈信息(姓名、组织、邮箱地址等个⼈信息)和个⼈公钥,并由认证机构(CertificationAuthority、Certifying Authority,CA)施加数字签名。公钥证书也简称为证书(certificate)。三、应⽤技术对称密码、公钥密码、单向散列函数、消息认证码、数字签名、伪随机数⽣成器称为密码学家的⼯具箱。单向散列函数保证了消息的完整性;消息认证码保证了消息的完整性、认证;数字签名保证了消息的完整性、认证、不可否认性;对称密码、公钥密码、混合密码系统保证了消息的机密性;应⽤实例:PGP、SSL/TLS、虚拟货币SSL/TLS 是世界上应⽤最⼴泛的密码通信⽅法。综合运⽤了对称密码、消息认证码、公钥密码、数字签名、伪随机数⽣成器等密码技术。⽤ SSL/TLS 承接 HTTP客户端⽣成随机数Client random, 声明⽀持的加密⽅式, 发送给服务端. (ClientHello)服务端确认加密⽅式, ⽣成随机数Server random, 给出服务端证书, 发送给客户端. (SeverHello, SeverHello Done)如果服务端要求双向认证,则客户端需要提供客户端证书给服务端(Client Key Exchange); 接着客户端验证服务端证书是否合法, ⽣成随机数Pre-Master, 并使⽤服务端证书中的公钥进⾏加密, 发送给服务端. (Certificate Verify)服务端使⽤⾃⼰的证书私钥, 解密客户端发送来的加密信⼼, 得到Per-Master客户端和服务端此时拥有三个相同的随机数, 按照相同算法⽣成对话私钥, 彼此互相使⽤对话私钥加密Finish信息互相确认私钥正确性, 握⼿完成.SSL/TLS总结不要使⽤保密的密码算法;使⽤低强度的密码⽐不进⾏任何加密更危险;任何密码总有⼀天都会被破解;密码只是信息安全的⼀部分。参考⽂章:《图解密码技术》

2023年7月31日发(作者:)

密码学概述为什么会有密码在现代社会中,很多信息都存储在计算机⾥,这让信息的增删改查变得⾮常⽅便,信息可以通过多种⽅式传递给任何⼈。因此,保护好⾃⼰的秘密信息变得⾮常困难。为了解决这些问题,⼈们开发出形形⾊⾊的“密码技术”。从密码、认证、应⽤技术三⽅⾯介绍。⼀、密码⾸先看⼀下历史上著名的密码,第⼀个是恺撒密码,恺撒密码是将明⽂中所使⽤的字母表按照⼀定位数平移得到密⽂。在我们得到⼀串密⽂之后,可通过穷举的⽅式进⾏暴⼒破解,因为恺撒密码的密钥空间为 26,很容易被破解出来。Enjoy it while it lasts 平移三位得到密⽂e->H n->Q j->M o->R y->B i->L w->Z h->K l->O t->W a->D s->VHQMRB LW ZKLOH LW ODVWV还有简单替换密码,是将明⽂中所使⽤的字母表替换为另⼀套字母表。Enjoy it while it lasts -> XNVBK JQ CTJGX JQ GWLQL对应关系是不定的,所以如果⽤暴⼒破解的话,密钥空间为 26*25*.. 即使每秒遍历 10 亿个密钥,也要遍历 120 亿年,所以极难破解。但是使⽤频率分析法破解就⾮常容易,统计密⽂中字符出现的频率,从其他样⽂中寻找规律,⽐如⼀篇⽂章出现最多的字符是e,就可把密⽂中出现最多的字符替换为e。⽂中经常会出现 is the this 这样的字眼,根据这些规律进⾏替换尝试。密⽂越长的话越容易被破解。以上可知加密算法应要保证密钥空间强度,密⽂及密钥也不应有⼀定规律。1、对称密码对称密码⼜称共享密码,加密和解密密钥相同。1.1、⼀次性密码本⼀次性密码本是将明⽂与⼀串随机的⽐特序列进⾏异或运算得到密⽂。明⽂的⽐特序列与⼀串随机的⽐特序列进⾏异或运算得到密⽂,密⽂再与密钥进⾏异或运算得到明⽂。⼀次性密码⼀次性密码本为什么没有被使⽤,主要有以下⼏点:1. 密钥如何发送给对⽅?在⼀次性密码本中,密钥和原⽂是⼀样长度的,试想如果有办法能把密⽂安全的送达到对⽅,那么是否可以⽤这种⽅法把明⽂送达到对⽅呢?所以这是⼀个⽭盾的问题。2. 密钥保存是⼀个问题⼀次性密码本的密钥长度和原⽂⼀样长,密钥不能删除也不能丢弃。丢弃了密钥相当于丢弃了明⽂。所以“加密保护明⽂”的问题被转换成了“如何安全的保护和明⽂⼀样长度的密钥”的问题,实际上问题还是没有解决。3. 密钥⽆法重⽤如果加密的原⽂很长,那么密钥也要相同长度,并且密钥每次还要不同,因为如果是相同的,密钥⼀旦泄露以后,过去所有⽤这个密钥进⾏加密的原⽂全部都会被破译。4. 密钥同步难如果密钥每次都变化,那么密钥如何同步也是⼀个问题。密钥在传递过程中不能有任何错位,如果错位,从错位的那⼀位开始之后的每⼀位都⽆法解密。5. 密钥⽣成难⼀次性密码本想要真正的永远⽆法破解,就需要⽣成⼤量的真正的随机数,不能是计算机⽣成的伪随机数。1.2、DESDES (Data Encryption Standard) 是 1977 年美国联邦信息处理标准(FIPS)中所采⽤的⼀种对称密码(FIPS 46-3)。DES ⼀直以来被美国以及其他国家的政府和银⾏所使⽤。1997 年 DES Challenge I ⽐赛中⽤了 96 天破解了 DES 密钥,1998 年的 DES Challenge II-1 ⽐赛中⽤了 41 天就破解了密钥。1998 年的 DES Challenge II-2 ⽐赛中⽤了 56 个⼩时,1999 年的 DES Challenge III ⽐赛中只⽤了 22 ⼩时 15 分钟。⽬前来说,DES 已经不再安全了。除了⽤来解密以前⽼的 DES 密⽂以外,不再使⽤ DES 进⾏加密了。DES 是⼀种把 64 位明⽂加密成 64 位密⽂的对称加密算法。它的密钥长度为 64 ⽐特,但是除去每 7 个⼆进制位会设置⼀个⽤于错误检测的位以外,实际上密钥为 56 ⽐特。DES 会以 64 个⼆进制为⼀个分组进⾏加密。以分组为单位进⾏处理的密码算法成为分组密码。DES 加密的基本结构是 Feistel ⽹络、Feistel 结构、Feistel 密码,这个结构不仅仅⽤在 DES 中,还⽤在其他的加密算法中。在 Feistel ⽹络中,加密的各个步骤称为轮(round),整个加密过程就是若⼲次轮的循环。DES 是⼀种 16 轮循环的 Feistel ⽹络。64 位的输⼊被分为左右两侧的输⼊,右侧的 32 位直接向下得到右侧的数据,右侧数据和⼦密钥通过轮函数⽣成⼀串随机的⽐特序列,此串⽐特序列和左侧32位输⼊进⾏异或运算得到左侧密⽂。Feistel结构⼀轮加密之后可以看到,左侧数据被加密了,右侧并没有,所以第⼆轮时左右两侧交换数据再次执⾏上图的步骤。⼀个 3 轮的 Feistel ⽹络。3 轮⽹络有 3 个⼦密钥和 3 个轮函数,中间有 2 次左右对调的过程。注意:n 轮 Feistel ⽹络只交换 n-1 次,最后⼀次不⽤交换。Feistel ⽹络的特点加密的时候⽆论使⽤任何函数作为轮函数都可以正确的解密,⽆须担⼼⽆法解密。就算轮函数输出的结果⽆法逆向计算出输⼊的值也⽆须担⼼。Feistel ⽹络把加密算法中核⼼的加密本质封装成了这个轮函数,设计算法的⼈把所有的⼼思放在把轮函数设计的尽量负责即可。加密和解密可以⽤完全相同的结构来实现。虽然每⼀轮只加密了⼀半的明⽂,放弃了加密效率,但是获得了可以⽤相同结构来实现,对于加密硬件设备设计也变得更加容易。加解密由于 Feistel ⽹络的这些优点,所以很多分组密码选择了它。⽐如 AES 候选算法中的 MARS、RC6、Twofish。不过最终 AES 定下的Rijndael 算法并没有选择它,⽽是选择的 SPN ⽹络。1.3、三重DES三重 DES (triple-DES) 是为了增加 DES 强度,所以将 DES 重复 3 次得到的⼀种算法。也称为 TDEA (Triple Data EncryptionAlgorithm),通常缩写为 3DES。使⽤加密、解密、加密的步骤是为了兼容 DES,当三个密钥相同时就是普通的 DES 加密。3DES3DES 由于处理速度不⾼,除了兼容之前的 DES 以外,⽬前基本不再使⽤它了。1.4、AESAES (Advanced Encrytion Standard) 是取代前任标准 DES ⽽成为新标准的⼀种对称密码算法。在全世界的范围内征集 AES 加密算法,最终于 2000 年从候选中选出了 Rijndael 算法,确定它为新的 AES。1997 年开始征集 AES,1998 年满⾜条件并最终进⼊评审的有 15 个算法:CAST-256、Crypton、DEAL、DFC、E2、Frog、HPC、LOK197、Magenta、MARS、RC6、Rijndael、SAFER+、Serpent、Twofish。2000 年 10 ⽉ 2 ⽇,Rijndael 并定位 AES 标准。AES 可以免费的使⽤。Rijndael 的分组长度和密钥长度可以分别以 32 位⽐特为单位在 128 ⽐特到 256 ⽐特的范围内进⾏选择。不过在 AES 的规范中,分组长度被固定在 128 ⽐特,密钥长度只有 128、192 和 256 ⽐特三种。AES 的加密也是由多个轮组成的,分为 4 轮,SubBytes、ShiftRows、MixColumns、AddRoundKey 这 4 步,即 SPN ⽹络。⼀般要进⾏10-14轮运算。以 128 位分组长度为例,第⼀步字节替换,将 16 个字节依次和 s-box ⾥⾯的字节按照索引进⾏替换得到新的矩阵,第⼆步是⾏移位,除了第⼀⾏,其他⾏依次左移不同位数,第三部是列的矩阵相乘,最后⼀步是每⼀个字节和轮密钥进⾏异或运算,这是整个⼀轮的步骤。1.5、分组模式由于 DES 和 AES ⼀次加密都只能加密固定长度的明⽂,如果需要加密任意长度的明⽂,就需要对分组密码进⾏迭代,⽽分组密码的迭代⽅式就称为分组密码的“模式”。分组密码有很多模式,如果模式选择的不恰当就⽆法充分保障机密性。分组密码(block cipher) 是每次只能处理特定长度的⼀块数据的⼀类密码算法,这⾥的“⼀块”被称为分组。⼀个分组的⽐特数称为分组长度。例如 DES 和 3DES 的分组长度都是 64 位。AES 分组长度为 128 位。分组密码处理完⼀个分组以后就结束,不需要记录额外的状态。分组模式:ECB CBC CFB OFB CTR XTSECB 模式是分组模式⾥⾯最简单的,也是最没有安全性的。所以使⽤的⼈很少。ECB 模式全称“Electronic CodeBook”模式,在 ECB 模式中,将明⽂分组加密之后的结果直接就是密⽂分组,中间不做任何的变换。攻击者可以很容易的分析密⽂中的规律进⾏破解,即使不知道密钥,攻击者也可将密⽂分组进⾏顺序交换,从⽽使接收者获取不到正确的数据。CBC 模式的全称是 Cipher Block Chaining 模式,密⽂分组链接模式。名字中也展⽰它的实质,像链条⼀样相互链接在⼀起。有⼀个随机的初始化向量 IV ,初始化向量⾸先和明⽂分组1进⾏异或运算,在进⾏加密,得到密⽂分组1,密⽂分组1和明⽂分组2进⾏异或,再进⾏加密得到密⽂分组2,依次执⾏。2、⾮对称加密(公钥加密)为了防⽌中间⼈截获密钥,安全的把密钥传递给通信对⽅。有以下 4 种⽅式:1. 事先共享密钥这种⽅法虽然有效,但是具有局限性。在⼀次性密码本中,我们说过,⼤国之间的热线是⽤这种⽅式加密的,但是密钥是靠特⼯押送过去的。如果通讯对⽅在附近,提前共享密钥还⽐较⽅便。如果通讯对⽅在世界各地,这种⽅式也就存在局限性了。另外通讯量增⼤以后,密钥个数也会陡增。n 个⼈两两通讯,需要 n * (n-1) /2 个密钥。这点来看,也不现实。2. 密钥分配中⼼为了解决事先共享密钥的密钥增多的问题。于是有⼈想出了密钥分配中⼼(Key Distribution Center, KDC)的办法。每次加密的密钥由密钥中⼼进⾏分配,每个⼈只要和密钥中⼼事先共享密钥就可以了。虽然这个⽅法解决了密钥增多的问题,但是⼜带来了新的问题。密钥中⼼存储和记录了所有的密钥,⼀旦它出现故障或者被攻击破坏,那么所有的加密都会瘫痪。这也是集中式管理的缺点。3. Diffie-Hellman 密钥交换为了解决集中式管理的缺点,那么应该密钥的配送还是不能⽤集中式。于是有⼈想出了 Diffie-Hellman 密钥交换的⽅法。在 Diffie-Hellman 密钥交换中,加密通信双⽅需要交换⼀些信息,⽽这些信息即便被窃听者窃听,也不会有任何问题。根据交换的信息,双⽅各⾃⽣成相同的密钥。⽽窃听者⽆法⽣成相同的密钥。这种⽅式可⾏。不过这种⽅式不算是⾮对称加密,在本⽂中不详细讨论。4. 公钥密码⾮对称加密有⼀个公钥和⼀个私钥。公钥可以在⽹上传播,被窃听者拿到也没有关系,由于没有私钥,他也⽆法解开密⽂。私钥只要掌握在接收者⼿上就不会导致密⽂被窃听。⾮对称加密:⾮对称加密⼀般指的是具有公钥密钥(public-key cryptography)的加密算法。密钥分为加密密钥和解密密钥两种。发送者⽤加密密钥对信息进⾏加密,接收者⽤解密密钥对密⽂进⾏解密。可以公开出去的叫公钥(public key),保存在⾃⼰⼿上不公开的叫私钥(private key)。公钥和私钥是⼀⼀对应的。⼀对公钥和私钥统称为密钥对(key pair)。在数学的关系上,这两者不能单独⽣成。2.1、RSARSA 是⼀种公钥密码算法,它的名字是由它的三位开发者,即 Ron Rivest、Adi Shamir 和 Leonard Adleman 的姓⽒的⾸字母组成的(Rivest-Shamir-Adleman)。1983 年,RSA 公司为 RSA 算法在美国取得了权利。RSA 可以被⽤于公钥密码和数字签名。在 RSA 中,明⽂、密钥和密⽂都是数字。加密过程公式:密⽂ = 明⽂^E mod N解密过程公式:明⽂ = 密⽂^D mod N暴⼒破解的可能性:512 ⽐特能够容纳质数的数量⼤约为 10 的 150 次⽅。假设世界上有 100 亿⼈,每⼈每秒⽣产 100 亿个密钥对,那么经过 100 亿年⽣成的密钥对数量⼤概是 10 的 39 次⽅,远远⼩于 10 的 150 次⽅。在 2009 年,公开记录的被成功分解的最长 RSA 数为 768 位。在密钥长度⾜够的情况下,极难被破解。但是会有中间⼈攻击。例如 Charles 的抓包原理。其他公钥密码:ElGamal⽅式、Rabin⽅式、椭圆曲线密码。2.2、混合密码系统公钥密码解决了配送问题,还有两个很⼤的问题:1、公钥密码的处理速度远远低于对称密码;2、公钥密码难以抵御中间⼈攻击;所以就出现了混合密码系统,如图所⽰,基本原理是⽤对称密钥加密消息,⽤公钥加密对称密钥。结合对称密码和公钥密码的优势。三、认证密码保证了消息的机密性,但是⽆法保证消息的完整性、认证、不可否认性。所以有了“消息指纹”。3.1、单向散列函数常见的单向散列函数:MD4、MD5、SHA、SHA-1、SHA-2、SHA-3等单向散列函数具备的特性:根据任意长度的消息计算出固定长度的散列值能够快速计算出散列值消息不同,散列值也不同单向性应⽤:检测软件是否被篡改、基于⼝令的加密、消息认证码、数字签名、伪随机数⽣成器、⼀次性⼝令。单向散列函数⽆法解决的问题:单向散列函数能够辨别出“篡改”,但是⽆法辨别出“伪装”。对于⼀条消息不仅需要确认消息的完整性,还需要确认这个消息发⾃于谁。这仅仅靠完整性检查是不够的,还需要进⾏消息认证。认证的技术包括消息验证码和数字签名。3.2、消息认证码为什么需要消息认证码?A 向 B 汇钱 100 万元。如果攻击者从中攻击,篡改这条消息,就可能变成 A 向攻击者汇钱 1000 万元。这⾥针对汇款消息,需要注意两个问题:消息的 “完整性” 和 “认证” 。消息认证码(Message Authentication Code) 是⼀种确认完整性并进⾏认证的技术,简称 MAC。使⽤消息认证码可以确认⾃⼰收到的消息是否就是发送者的本意,也就是说可以判断消息是否被篡改,是否有⼈伪装成发送者发送了这条消息。使⽤现状:SWIFT(Society for Worldwide Interbank Financial Telecommunications---环球同业银⾏⾦融电讯协会) 是⼀个⽬的为国际银⾏间的交易保驾护航的协会。银⾏和银⾏间通过 SWIFT 来传递交易消息,SWIFT 会利⽤消息认证码校验消息的完整性和对消息的验证。消息认证码的共享密钥是由⼈进⾏配送的。IPsec 是对 IP 协议增加安全性的⼀种⽅式,在 IPsec 中,对消息的认证和完整性校验也是⽤消息认证码的⽅式。SSL/TLS 对通信内容的认证和完整性校验也⽤了消息认证码。消息认证码⽆法解决的问题:消息认证码虽然可以证明双⽅发送的消息是⼀致的,没有篡改,也不存在中间⼈伪装。但是它⽆法 “对第三⽅证明” 和 “防⽌抵赖”。⽆法 “对第三⽅证明” 原因是因为消息认证码中⽤到的密钥是共享密钥,通信双⽅都有这个密钥,所以对第三⽅⽆法证明消息到底出⾃双⽅中的哪⼀⽅。解决 “第三⽅证明” 的问题需要⽤到数字签名。⽆法 “防⽌抵赖” 原因是也是因为消息认证码的共享密钥双⽅都有,⽆法判断消息是发⾃于哪⼀⽅。所以消息认证码⽆法防⽌否认(nonrepudiation)。解决 “防⽌抵赖” 的问题需要⽤到数字签名。3.3、数字签名消息认证码的缺陷就在于它的共享密钥上⾯。由于共享密钥的原因,导致⽆法防⽌抵赖。数字签名就是为了解决抵赖的问题的。解决的⽅法就是让通信双⽅的共享密钥不同,从密钥上能区分出谁是谁。公钥密码与数字签名应⽤实例:1、安全信息公告2、软件下载3、公钥证书4、SSL/TLS数字签名⽆法解决的问题:数字签名所⽤到的公钥密码中的公钥需要另外认证,防⽌中间⼈攻击。认证⽤于验证签名的公钥必须属于真正的发送者。似乎陷⼊了⼀个死循环。数字签名⽤来识别消息篡改,伪装以及防⽌抵赖。但是我们⼜必须从没有被伪装的发送者得到没有被篡改的公钥才⾏。为了验证得到的公钥是否合法,必须使⽤证书。证书是将公钥当做⼀条消息,由⼀个可信的第三⽅对其签名后所得到的公钥。3.4、公钥证书公钥证书(Public-Key Certificate,PKC)记录着个⼈信息(姓名、组织、邮箱地址等个⼈信息)和个⼈公钥,并由认证机构(CertificationAuthority、Certifying Authority,CA)施加数字签名。公钥证书也简称为证书(certificate)。三、应⽤技术对称密码、公钥密码、单向散列函数、消息认证码、数字签名、伪随机数⽣成器称为密码学家的⼯具箱。单向散列函数保证了消息的完整性;消息认证码保证了消息的完整性、认证;数字签名保证了消息的完整性、认证、不可否认性;对称密码、公钥密码、混合密码系统保证了消息的机密性;应⽤实例:PGP、SSL/TLS、虚拟货币SSL/TLS 是世界上应⽤最⼴泛的密码通信⽅法。综合运⽤了对称密码、消息认证码、公钥密码、数字签名、伪随机数⽣成器等密码技术。⽤ SSL/TLS 承接 HTTP客户端⽣成随机数Client random, 声明⽀持的加密⽅式, 发送给服务端. (ClientHello)服务端确认加密⽅式, ⽣成随机数Server random, 给出服务端证书, 发送给客户端. (SeverHello, SeverHello Done)如果服务端要求双向认证,则客户端需要提供客户端证书给服务端(Client Key Exchange); 接着客户端验证服务端证书是否合法, ⽣成随机数Pre-Master, 并使⽤服务端证书中的公钥进⾏加密, 发送给服务端. (Certificate Verify)服务端使⽤⾃⼰的证书私钥, 解密客户端发送来的加密信⼼, 得到Per-Master客户端和服务端此时拥有三个相同的随机数, 按照相同算法⽣成对话私钥, 彼此互相使⽤对话私钥加密Finish信息互相确认私钥正确性, 握⼿完成.SSL/TLS总结不要使⽤保密的密码算法;使⽤低强度的密码⽐不进⾏任何加密更危险;任何密码总有⼀天都会被破解;密码只是信息安全的⼀部分。参考⽂章:《图解密码技术》