研一上学期上了信息安全这门专业课,因为本科的读的专业是计算机科学与技术,所以对密码学这方面接触的其实并不多,不过对这方面还是比较感兴趣的,所以在学习完之后根据课本以及自己的理解以博客的方式整理下学习的内容,课本使用的是《Cryptography and Network Security》,作者是Behrouz A. Forouzan<美>。本文主要梳理密码学的知识体系,大概的内容框架,让大家对密码学有个简单的了解,不涉及具体的算法等。
随着计算机的发展,信息已经成为了一种资产,和其他人任何一种资产一样具有价值。因此,如何保护信息避免攻击也是当今人们一直在研究的问题。
根据危害上述三种安全目标可以将攻击分为三类:危害机密性的攻击、危害完整性的攻击、危害可用性的攻击。
攻击类型还可以分为主动攻击与被动攻击,其中危害机密性的攻击为被动攻击,危害完整性以及可用性的攻击为主动攻击。被动攻击仅是获取信息但并不修改信息,因此被动攻击可以防止但是很难检测,而主动攻击对数据进行修改或者伪造数据,与被动攻击相反,主动攻击难以绝对预防但易于检测。
在介绍相关加密知识之前,先简单介绍下密码学中用到的一些术语。
密码分析攻击可分为唯密文攻击、已知明文攻击、选择明文攻击、选择密文攻击。
对称加密,在加解密过程中使用的密钥相同,是20世纪70年代公钥密码产生之前唯一的加密类型,即便在今天,它的使用也十分广泛。对称密钥加密的最大优势是加/解密速度很快,适合于对大数据量进行加密,但是他的缺点是密钥的管理与分配,也就是说,如何把安全可靠的把密钥发送到正确的人的手里而不被拦截是个问题。
传统的对称密钥密码可根据加密方式分为两类:代换密码、换位密码。在代换密码中,我们在加密的过程中将一个需要加密的符号用其他符号来替换,而在换位密码加密过程中,我们则是将加密信息进行重新排序。在实际加密过程中,我们通常是采用两种方法结合使用以提高密码的安全性。
代换密码又可分为单码代换和多码代换,在单码代换中,同一个符号总是被另外相同的符号代换,而在多码代换中,不同位置的同一个符号可以被不同符号代换。
传统的单码代换密码有加法密码、乘法密码、仿射密码等。下面以仿射密码进行举例:
加密过程:C = (P * k1 + k2) mod 26
解密过程:P = ((C -k2) * k1-1) mod 26
其中各个符号意义如下(之后的表示也均按照如下):
C:密文
P:明文
k:密钥(其中k1表示第一个密钥,k2表示第二个密钥)
k-1:k的乘法逆元,k在模p下的乘法逆元表示为 k * k-1 ≡ 1(mod p),并且k是大于0小于p的整数
仿射密码相当于加法密码和乘法密码的结合,在加密过程中一共用到一个密钥,一个用于加法加密,一个用于乘法加密。下面是仿射密码一个具体的例子:
用仿射密码对消息“hello”进行加解密,密钥对(k1,k1)为(7,2):
首先按照字母表的顺序对字母进行赋值,从00到25,即a对应的值为00,z对应的值为25。
加密过程:
P:h➡07 加密:(07*7+2)mod26=25 C:25➡Z
P:e➡04 加密:(04*7+2)mod26=04 C:04➡E
P:l ➡11 加密:(11*7+2)mod26=01 C:01➡B
P:l ➡11 加密:(11*7+2)mod26=01 C:01➡B
P:o➡14 加密:(14*7+2)mod26=22 C:22➡W
解密过程:
根据乘法逆元的定义,7在模26下的乘法逆元为15,因为 7 * 15≡ 1(mod26)
C:Z➡25 解密:((25-2) * 15)mod26=07 P:07➡h
C:E➡04 解密:((04-2) * 15)mod26=04 C:04➡e
C:B➡01 解密:((01-2) * 15)mod26=11 C:11➡l
C:B ➡01 解密:((01-2) * 15)mod26=11 C:11➡l
C:W➡22 解密:((22-2) * 15)mod26=14 C:14➡o
多码代换在加密过程中不同位置的同一符号加密得到的结果不一定相同,这是因为和单码代换加密过程中密钥不改变不一样,在多码代换加密过程中,往往密钥是在不断改变的,比如提前设定好一个密钥流或者前一位将前一位的明文作为后一位加密时使用的密钥。具体有Autokey Cipher、Playfair Cipher、Vigenere Cipher等加密方案。下面以Autokey Cipher为例:
P=P1P2P3… C=C1C2C3… k=(k1,P1,P2…)
加密:Ci = (Pi + ki) mod 26 解密:Pi = (Ci - ki) mod 26
下面对消息“attack is today”进行加密,初始密钥:k1 = 12
明文 | a | t | t | a | c | k | i | s | t | o | d | a | y |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|
明文值 | 00 | 19 | 19 | 00 | 02 | 10 | 08 | 18 | 19 | 14 | 03 | 00 | 24 |
密钥 | 12 | 00 | 19 | 19 | 00 | 02 | 10 | 08 | 18 | 19 | 14 | 03 | 00 |
密文值 | 12 | 19 | 12 | 19 | 02 | 12 | 18 | 00 | 11 | 07 | 17 | 03 | 24 |
密文 | M | T | M | T | C | M | S | A | L | H | R | D | Y |
换位密码得到的密文就是被打乱顺序的明文,比如可以将明文按照固定的宽度水平的写在纸上,然后按垂直方向读出得到密文,解密时则将密文按相同宽度垂直的写在纸上,按水平方向读出。比如我们将"meet me at the park"这句话以水平宽度为4写出按垂直方向读出得到的密文则为"mmtaeehreaekttp".
还可以根据每次加密信息的大小将密码分为流密码与分组密码。流密码又称序列密码,明文称为明文流,密钥称为密钥流,在加密过程中,每次对明文流中单个比特位进行加密变换。分组密码又称块密码,加密之前先将明文分成大小相同的n个组,每组大小为m ( m > 1),若有不足位则进行补全,在加密过程中逐次依组进行加密。前面介绍到的一些算法都是以前所使用的一些基础简单的算法,在现在的环境下很容易就被破解,十分不安全。目前主流的对称加密方案主要时DES和AES,两者都属于分组密码。
非对称密钥加密,又称公钥加密,这个概念最早在1976年被人提出。和对称加密不一样的是公钥加密有两个密钥,公钥和私钥,公钥即为公开的密钥,私钥则不公开。当人们需要加密发送信息时,发送方使用接收方的公钥对数据进行加密,接收方收到加密信息之后用自己的私钥进行解密即可得到信息。与对称加密相比,由于公钥加密加解密过程中使用的密钥不一样,所以相对而言安全性更高,但算法更加复杂因此加解密速度更慢,不适用与对大量数据进行加密,因此,在实际应用中,我们需要对大量数据进行加密时,往往采用对称加密的方法,再用公钥加密对对称加密的密钥进行加密。接收方收到信息之后首先用自己的私钥进行解密得到对称加密的密钥,然后再对消息进行解密。这样既保证了加解密的速度同时又提高了安全性,一举两得。
RSA算法是目前使用最为广泛的公钥加密算法,由Ron Rivest、Adi Shamir以及Leonard Adleman三人在1977年提出,下面简单介绍该算法及其证明。
密钥生成过程:
加密: C = Pe mod n
解密 :P = Cd mod n
证明:
证明过程使用到了欧拉定理:如果n = pq,a
假设接收方用私钥解密出的明文为P1,证明P1 = P
P1 = Cd mod n = (Pe mod n)d mod n = ped mod n
ed = kφ(n) + 1,所以 P1 = ped mod n = P kφ(n)+ 1 mod n = P mod n = P
哈希函数H可将任意长度的信息M作为输入,同时产生固定长度的哈希值h=H(M)。常见的哈希函数有MD5、SHA1等。当哈希函数应用于密码学中,它需要满足以下三个标准:
数字签名,又称公钥数字签名,是公钥密码的一种应用,该过程使用的密钥分为公钥和私钥,和公钥加密不一样的是,公钥加密过程中使用的是接收方的公钥进行加密,接收方的私钥进行解密。而在数字签名过程中则是使用发送方的私钥进行加密得到数字签名,之后再使用发送方的公钥进行解密得到哈希摘要。数字签名是保证消息来源和完整性的重要方法。
数字签名过程如下图所示:
通过前面的介绍我们便能明白密钥对信息安全起着多么重要的作用,因此,如何高效安全的对密钥进行管理一直是人们研究的重点。
由于公钥加密效率不高,因此在对大量数据进行加密时我们往往都是使用对称加密,然而,对称加密要求双方都享有密钥,也就是说,对于N个人的团体,如果他们使用公钥加密进行通信的话,则一共需要的密钥数量为N(N-1)/2。而且双方交换彼此的密钥风险很大,因此我们需要一个可信任的第三方帮助我们对密钥进行管理,也就是我们的密钥分配中心(Key-Distribution Center)。
在这种模式下,每个用户和KDC都有进行交流的密钥,比如Alice和KDC的共享密钥为KAlice,Bob的则为KBob。当Alice想要和Bob进行交流时,过程如下:
Kerberos是目前比较流行的一种网络认证协议,同时也是一个KDC。它可分为以下及部分:
若用公钥加密时,我们需要将自己的公钥发布出去,让其他人都知道,但这很容易被别人伪造我们的公钥以及被中间人攻击。因此我们同样需要一个可信的第三方。