密码学概述
为什么会有密码
在现代社会中,很多信息都存储在计算机里,这让信息的增删改查变得非常方便,信息可以通过多种方式传递给任何人。因此,保护好自己的秘密信息变得非常困难。为了解决这些问题,人们开发出形形色色的“密码技术”。
从密码、认证、应用技术三方面介绍。
一、密码
首先看一下历史上著名的密码,第一个是恺撒密码,恺撒密码是将明文中所使用的字母表按照一定位数平移得到密文。在我们得到一串密文之后,可通过穷举的方式进行暴力破解,因为恺撒密码的密钥空间为 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->V
HQMRB 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、DES
DES (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 Encryption Algorithm),通常缩写为 3DES。使用加密、解密、加密的步骤是为了兼容 DES,当三个密钥相同时就是普通的 DES 加密。
3DES3DES 由于处理速度不高,除了兼容之前的 DES 以外,目前基本不再使用它了。
1.4、AES
AES (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 XTS
ECB 模式是分组模式里面最简单的,也是最没有安全性的。所以使用的人很少。
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、RSA
RSA 是一种公钥密码算法,它的名字是由它的三位开发者,即 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)记录着个人信息(姓名、组织、邮箱地址等个人信息)和个人公钥,并由认证机构(Certification Authority、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总结
不要使用保密的密码算法;
使用低强度的密码比不进行任何加密更危险;
任何密码总有一天都会被破解;
密码只是信息安全的一部分。
参考文章:
《图解密码技术》