|
发表于 2007-7-29 01:15:43
|
显示全部楼层
这是我给你找的资料,不知道能不能用上。
【加密原理】
加密也可提高终端和网络通讯的物理安全,有三种方法加密传输数据:
* 链接加密:在网络节点间加密,在节点间传输加密,传送到节点后解密,不同节点对间用不同密码.
* 节点加密:与链接加密类似,不同的只是当数据在节点间传送时,不用明码格式传送,而是用特殊的加密硬件进行解密和重加密,这种专用硬件通常旋转在安全保险箱中.
* 首尾加密:对进入网络的数据加密,然后待数据从网络传送出后再进行解密.网络本身并不会知道正在传送的数据是加密数据.这一方法的优点是,网络上的每个用户(通常是每个机器的一个用户)可有不同的加密关键词,并且网络本身不需增添任何专门的加密设备.缺点是每个系统必须有一个加密设备和相应的软件(管理加密关键词)或者每个系统必须自己完成加密工作(当数据传输率是按兆位/秒的单位计算时,加密任务的计算量是很大的)终端数据加密是一特殊情况,此时链接加密法和首尾加密法是一样的方法,终端和计算机都是既为节点又为终止端点.
通讯数据加密常常不同于文件加密,加密所用的方法不应降低数据的传送 速度.丢失或被歪曲了的数据不应当引起丢失更多的数位,即解密进程应当 能修复坏数据,而不能由于坏数据对整个文件或登录进行不正确地解密.对于登录会话,必须一次加密一个字节特别是在UNIX系统的情况下,系统要将字所 返回给用户,更应一次加密一个字节.在网络中,每一链可能需要不同的加密关 键字,这
就提出了对加密关键词的管理,分配和替换问题.
DES传送数据的一般形式是以代入法密码格式按块传送数据,不能达到上 述的许多要求.DES采用另一加密方法,一次加密一位或一个字节,形成密码流. 密码流具有自同步的特点,被传送的密码文本中发生的错误和数据丢失,将只 影响最终的明码文本的一小段(64位).这称为密码反馈.在这种方法中,DES被 用作虚拟随机数发生器,产生出一系列用于对明码文本的随机数.明码文本的每n位与一个DESn位的加密输出数进行异或,n的取值为1-64,DES加密处理的输 入是根据前边传送的密码文本形成的64位的数值.
发n为1时,加密方法是自同步方式:错一位或丢失1位后,64位的密码文本 将不能被正确地解密,因为不正确的加密值将移入DES输入的末端.但是一旦接 收到正确的64位密码,由于DES的加密和解密的输入是同步的,故解密将继续正确地进行.
DES的初始输入称为种子,是一个同时由传输器和接收器认可的随机数.通 常种子由一方选择,在加密前给另一方.而加密关键词不能以明码格式通过网 络传送,当加密系统加电时在两边都写入加密关键词,并且在许多阶段期间加 密关键词都保持不变,用户可以选择由主关键词加密的阶段关键词,发送到数 据传送的另一端,当该阶段结束后,阶段关键词就不再使用了.主关键词对用户 是不可
见的,由系统管理员定期改变,选择哪一种关键词管理方法,常由所用的 硬件来确定.如果加密硬件都有相应的设备,则用种子还是用主关键词阶段关 键词是无关紧要的。
用户身份鉴别
口令只是识别一个用户的一种方法,实际上有许多方法可以用来识别用户.
* CALL BACK MODEM:则维护系统有效用户表及其相应电话号码的设备.当用户拨号调用系统时,CALL BACK MODEM获得用户的登录户头,挂 起,再回头调用用户的终端.这种方法的优点是,限制只有电话号 码存于MODEM中的人才是系统的用户,从
而使非法侵入者不能从其 家里调用系统并登录,这一方法的缺点是限制了用户的灵活性,并
仍需要使用口令,因为MODEM不能仅从用户发出调用的地方,唯一地标识用户. . 标记识别:标记是口令的物理实现,许多标记识别系统使用某种形式的卡(如背面有磁条的信用卡),这种卡含有一个编码后的随机数.卡由连接到终端的阅卡机读入,不用再敲入口令.为了增加安全性, 有的系统要求读入卡和敲入口令.有些卡的编码方法使得编码难 于复制.标记识别的优点是,标识
可以是随机的并且必须长于口令. 不足之处是每个用户必须携带一个卡(卡也可与公司的徽记组合 使用).并且每个终端上必须连接一个阅读机.
* 一次性口令:即"询问-应答系统".一次性口令系统允许用户每次登录时 使用不同的口令.这种系统允许用户每次登录时使用不同的口令. 这种系统使用一种称做口令发生器的设备,设备是手携式的(大约 为一个袖珍计算器的大小),并有一个加密程序和独一的内部加密关键词.系统在用户登录时给用户提供一个随机数,用户将这个随机数送入口令发生器,口令发生器用用户的关键词对随机数加密, 然后用户再将口令发生器输出的加密口令(回答)送入系统,系统将用户输入的口令,与它用相同的加密程序,关键词和随机数产生的口令比较,如果二者相同,允许用户存取系统.这种方法的优点 是:用户可每次敲入不同的口令,因此不需要口令保密,唯有口令发生器需要安全保护.为了增加安全性,UNIX系统甚至不需联机保 存关键词,实际的关键词可保存在有线连接于系统的一个特殊加 密计算机中.在用户登录期间,加密计算机将为用户产生随机数和加密口令.这样一种系统的优点是,口令实际不由用户输入,系统中也不保存关键词,即使是加密格式的关键词也可保存于系统中. 其不足之处类似于标记识别方法,每个用户必须携带口令发生器, 如果要脱机保存关键词,还需要有一个特殊硬件.
* 个人特征:有些识别系统检测如指印,签名,声音,零售图案这倦的物理 特征.大多数这样的系统极是实验性的,昂贵的,并且不是百分之 百的可靠.任何一个送数据到远程系统去核实的系统有被搭线窃 听的危险,非法入侵者只须记录下送去系统校核的信息,以后再重显示这些信息,就能窃密.注意:这同样也是标记识别系统的一个问题.
【DES算法实现过程分析】
1. 处理密钥:
1.1 从用户处获得64位密钥.(每第8位为校验位,为使密
钥有正确的奇偶校验,每个密钥要有奇数个”1”位.(本文如未特指,均指二进制位)
1.2 具体过程:
1.2.1 对密钥实施变换,使得变换以后的密钥的各个
位与原密钥位对应关系如下表所示:
表一为忽略校验位以后情况
1 2 3 4 5 6 7 8
9 10 11 12 13 14 15 16 17
18 19 20 21 22 23 24 25
26 27 28
57 49 41 33 25 17 9 1
58 50 42 34 26 18 10 2
59 51 43 35 27 19 11 3
60 52 44 36
29 30 31 32 33 34 35 36
37 38 39 40 41 42 43 44
45 46 47 48 49 50 51 52
53 54 55 56
63 55 47 39 31 23 15 7
62 54 46 38 30 22 14 6
61 53 45 37 29 21 13 5
28 20 12 4
1.2.2 把变换后的密钥等分成两部分,前28位记为C[0],
后28位记为D[0].
1.2.3 计算子密钥(共16个), 从i=1开始。
1.2.3.1 分别对C[i-1],D[i-1]作循环左移来生成
C,D.(共16次)。每次循环左移位数
如下表所示:
循环次数 1 2 3 4 5 6 7 8
9 10 11 12 13 14 15 16
左移位数 1 1 2 2 2 2 2 2
1 2 2 2 2 2 2 1
1.2.3.2 串联C,D,得到一个56位数,然后对此数
作如下变换以产生48位子密钥K。
变换过程如下:
1 2 3 4 5 6 7 8
9 10 11 12 13 14 15 16 17
18 19 20 21 22 23 24
14 17 11 24 1 5 3 28
15 6 21 10 23 19 12 4
26 8 16 7 27 20 13 2
25 26 27 28 29 30 31 32
33 34 35 36 37 38 39 40
41 42 43 44 45 46 47 48
41 52 31 37 47 55 30 40
51 45 33 48 44 49 39 56
34 53 46 42 50 36 29 32
1.2.3.3 按以上方法计算出16个子密钥。
2.对64位数据块的处理:
2.1 把数据分成64位的数据块,不够64位的以适当的方
式填补。
2.2对数据块作变换。
bit goes to bit bit goes to bit
58 1 57 33
50 2 49 34
42 3 41 35
34 4 33 36
26 5 25 37
18 6 17 38
10 7 9 39
2 8 1 40
60 9 59 41
52 10 51 42
44 11 43 43
36 12 35 44
28 13 27 45
20 14 19 46
12 15 11 47
4 16 3 48
62 17 61 49
54 18 53 50
46 19 45 51
38 20 37 52
30 21 29 53
22 22 21 54
14 23 13 55
6 24 5 56
64 25 63 57
56 26 55 58
48 27 47 59
40 28 39 60
32 29 31 61
24 30 23 62
16 31 15 63
8 32 7 64
2.3 将变换后的数据块等分成前后两部分,前32位记为
L[0],后32位记为R[0]。
2.4 用16个子密钥对数据加密。
2.4.1 根据下面的扩冲函数E,扩展32位的成48位
bit goes to bit bit goes to bit bit
goes to bit bit goes to bit
32 1 8 13 16
25 24 37
1 2 9 14 17
26 25 38
2 3 10 15 18
27 26 39
3 4 11 16 19
28 27 40
4 5 12 17 20
29 28 41
5 6 13 18 21
30 29 42
4 7 12 19 20
31 28 43
5 8 13 20 21
32 29 44
6 9 14 21 22
33 30 45
7 10 15 22 23
34 31 46
8 11 16 23 24
35 32 47
9 12 17 24 25
36 1 48
2.4.2 用E{R[i-1]}与K作异或运算。
2.4.3 把所得的48位数分成8个6位数。1-6位为B[1],
7-12位为B[2],……43-48位为B[8]。
2.4.4 用S密箱里的值替换B[j]。从j=1开始。S密箱里
的值为4位数,共8个S密箱
2.4.4.1 取出B[j]的第1和第6位串联起来成一个2位
数,记为m.。m即是S密箱里用来替换
B[j]的数所在的列数。
2.4.4.2 取出B[j]的第2至第5位串联起来成一个4位
数,记为n。n即是S密箱里用来替换
B[j]的数所在的行数。
2.4.4.3 用S密箱里的值S[j][ m][ n]替换B[j]。8个
S密箱如下所示:
--------
S-BOXES1
Binary d1d6 => 00 01 10 11
// d2..d5 // Dec 0 1 2 3
0000 0 14 0 4 15
0001 1 4 15 1 12
0010 2 13 7 14 8
0011 3 1 4 8 2
0100 4 2 14 13 4
0101 5 15 2 6 9
0110 6 11 13 2 1
0111 7 8 1 11 7
1000 8 3 10 15 5
1001 9 10 6 12 11
1010 10 6 12 9 3
1011 11 12 11 7 14
1100 12 5 9 3 10
1101 13 9 5 10 0
1110 14 0 3 5 6
1111 15 7 8 0 13
--------
S-BOXES2
binary d1d6 => 00 01 10 11
// d2..d5 // dec 0 1 2 3
0000 0 15 3 0 13
0001 1 1 13 14 8
0010 2 8 4 7 10
0011 3 14 7 11 1
0100 4 6 15 10 3
0101 5 11 2 4 15
0110 6 3 8 13 4
0111 7 4 14 1 2
1000 8 9 12 5 11
1001 9 7 0 8 6
1010 10 2 1 12 7
1011 11 13 10 6 12
1100 12 12 6 9 0
1101 13 0 9 3 5
1110 14 5 11 2 14
1111 15 10 5 15 9
--------
S-BOXES3
binary d1d6 => 00 01 10 11
// d2..d5 // dec 0 1 2 3
0000 0 10 13 13 1
0001 1 0 7 6 10
0010 2 9 0 4 13
0011 3 14 9 9 0
0100 4 6 3 8 6
0101 5 3 4 15 9
0110 6 15 6 3 8
0111 7 5 10 0 7
1000 8 1 2 11 4
1001 9 13 8 1 15
1010 10 12 5 2 14
1011 11 7 14 12 3
1100 12 11 12 5 11
1101 13 4 11 10 5
1110 14 2 15 14 2
1111 15 8 1 7 12
--------
S-BOXES4
binary d1d6 => 00 01 10 11
// d2..d5 // dec 0 1 2 3
0000 0 7 13 10 3
0001 1 13 8 6 15
0010 2 14 11 9 0
0011 3 3 5 0 6
0100 4 0 6 12 10
0101 5 6 15 11 1
0110 6 9 0 7 13
0111 7 10 3 13 8
1000 8 1 4 15 9
1001 9 2 7 1 4
1010 10 8 2 3 5
1011 11 5 12 14 11
1100 12 11 1 5 12
1101 13 12 10 2 7
1110 14 4 14 8 2
1111 15 15 9 4 14
--------
S-BOXES5
binary d1d6 => 00 01 10 11
// d2..d5 // dec 0 1 2 3
0000 0 2 14 4 11
0001 1 12 11 2 8
0010 2 4 2 1 12
0011 3 1 12 11 7
0100 4 7 4 10 1
0101 5 10 7 13 14
0110 6 11 13 7 2
0111 7 6 1 8 13
1000 8 8 5 15 6
1001 9 5 0 9 15
1010 10 3 15 12 0
1011 11 15 10 5 9
1100 12 13 3 6 10
1101 13 0 9 3 4
1110 14 14 8 0 5
1111 15 9 6 14 3
--------
S-BOXES6
binary d1d6 => 00 01 10 11
// d2..d5 // dec 0 1 2 3
0000 0 12 10 9 4
0001 1 1 15 14 3
0010 2 10 4 15 2
0011 3 15 2 5 12
0100 4 9 7 2 9
0101 5 2 12 8 5
0110 6 6 9 12 15
0111 7 8 5 3 10
1000 8 0 6 7 11
1001 9 13 1 0 14
1010 10 3 13 4 1
1011 11 4 14 10 7
1100 12 14 0 1 6
1101 13 7 11 13 0
1110 14 5 3 11 8
1111 15 11 8 6 13
--------
S-BOXES7
binary d1d6 => 00 01 10 11
// d2..d5 // dec 0 1 2 3
0000 0 4 13 1 6
0001 1 11 0 4 11
0010 2 2 11 11 13
0011 3 14 7 13 8
0100 4 15 4 12 1
0101 5 0 9 3 4
0110 6 8 1 7 10
0111 7 13 10 14 7
1000 8 3 14 10 9
1001 9 12 3 15 5
1010 10 9 5 6 0
1011 11 7 12 8 15
1100 12 5 2 0 14
1101 13 10 15 5 2
1110 14 6 8 9 3
1111 15 1 6 2 12
--------
S-BOXES8
binary d1d6 => 00 01 10 11
// d2..d5 // dec 0 1 2 3
0000 0 13 1 7 2
0001 1 2 15 11 1
0010 2 8 13 4 14
0011 3 4 8 1 7
0100 4 6 10 9 4
0101 5 15 3 12 10
0110 6 11 7 14 8
0111 7 1 4 2 13
1000 8 10 12 0 15
1001 9 9 5 6 12
1010 10 3 6 10 9
1011 11 14 11 13 0
1100 12 5 0 15 3
1101 13 0 14 3 5
1110 14 12 9 5 6
1111 15 7 2 8 11
2.4.4.4 返回2.4.4.1直至8个数据块都被替换。
2.4.5 把B[1]至B[8] 顺序串联起来得到一个32位数。
对这个数做如下变换:
bit goes to bit bit goes to bit
16 1 2 17
7 2 8 18
20 3 24 19
21 4 14 20
29 5 32 21
12 6 27 22
28 7 3 23
17 8 9 24
1 9 19 25
15 10 13 26
23 11 30 27
26 12 6 28
5 13 22 29
18 14 11 30
31 15 4 31
10 16 25 32
2.4.6 把得到的结果与L[i-1]作异或运算。把计算结
果賦给R。
2.4.7 把R[i-1]的值賦给L。
2.4.8 从2.4.1循环执行,直到K[16]也被用到。
2.5 把R[16]和L[16] 顺序串联起来得到一个64位数。
对这个数实施2.2变换的逆变换。
以上就是DES算法如何加密一段64位数据块。解密时
用同样的过程,只需把16个子密钥的
顺续颠倒过来,应用的顺序为K[16],K[15],
K[14],。。。。K[1]。
【MD5算法说明】
1、MD5算法是对输入的数据进行补位,使得如果数据位
长度LEN对512求余的结果是448。
即数据扩展至K*512+448位。即K*64+56个字节,K为
整数。
具体补位操作:补一个1,然后补0至满足上述要求
2、补数据长度:
用一个64位的数字表示数据的原始长度B,把B用两个
32位数表示。这时,数据就被填
补成长度为512位的倍数。
3. 初始化MD5参数
四个32位整数 (A,B,C,D) 用来计算信息摘要,初始
化使用的是十六进制表示的数字
A=0X01234567
B=0X89abcdef
C=0Xfedcba98
D=0X76543210
4、处理位操作函数
X,Y,Z为32位整数。
F(X,Y,Z) = X&Y|NOT(X)&Z
G(X,Y,Z) = X&Z|Y&(Z)
H(X,Y,Z) = X xor Y xor Z
I(X,Y,Z) = Y xor (X|not(Z))
5、主要变换过程:
使用常数组T[1 ... 64], T为32位整数用16进制
表示,数据用16个32位的整
数数组M[]表示。
具体过程如下:
/* 处理数据原文 */
For i = 0 to N/16-1 do
/*每一次,把数据原文存放在16个元素的数组X中. */
For j = 0 to 15 do
Set X[j] to M[i*16+j].
end /结束对J的循环
/* Save A as AA, B as BB, C as CC, and D as DD.
*/
AA = A
BB = B
CC = C
DD = D
/* 第1轮*/
/* 以 [abcd k s i]表示如下操作
a = b + ((a + F(b,c,d) + X[k] + T) <<< s). */
/* Do the following 16 operations. */
[ABCD 0 7 1] [DABC 1 12 2] [CDAB 2 17 3] [BCDA 3
22 4]
[ABCD 4 7 5] [DABC 5 12 6] [CDAB 6 17 7] [BCDA 7
22 8]
[ABCD 8 7 9] [DABC 9 12 10] [CDAB 10 17 11] [BCDA
11 22 12]
[ABCD 12 7 13] [DABC 13 12 14] [CDAB 14 17 15]
[BCDA 15 22 16]
/* 第2轮* */
/* 以 [abcd k s i]表示如下操作
a = b + ((a + G(b,c,d) + X[k] + T) <<< s). */
/* Do the following 16 operations. */
[ABCD 1 5 17] [DABC 6 9 18] [CDAB 11 14 19] [BCDA
0 20 20]
[ABCD 5 5 21] [DABC 10 9 22] [CDAB 15 14 23]
[BCDA 4 20 24]
[ABCD 9 5 25] [DABC 14 9 26] [CDAB 3 14 27] [BCDA
8 20 28]
[ABCD 13 5 29] [DABC 2 9 30] [CDAB 7 14 31] [BCDA
12 20 32]
/* 第3轮*/
/* 以 [abcd k s i]表示如下操作
a = b + ((a + H(b,c,d) + X[k] + T) <<< s). */
/* Do the following 16 operations. */
[ABCD 5 4 33] [DABC 8 11 34] [CDAB 11 16 35]
[BCDA 14 23 36]
[ABCD 1 4 37] [DABC 4 11 38] [CDAB 7 16 39] [BCDA
10 23 40]
[ABCD 13 4 41] [DABC 0 11 42] [CDAB 3 16 43]
[BCDA 6 23 44]
[ABCD 9 4 45] [DABC 12 11 46] [CDAB 15 16 47]
[BCDA 2 23 48]
/* 第4轮*/
/* 以 [abcd k s i]表示如下操作
a = b + ((a + I(b,c,d) + X[k] + T) <<< s). */
/* Do the following 16 operations. */
[ABCD 0 6 49] [DABC 7 10 50] [CDAB 14 15 51]
[BCDA 5 21 52]
[ABCD 12 6 53] [DABC 3 10 54] [CDAB 10 15 55]
[BCDA 1 21 56]
[ABCD 8 6 57] [DABC 15 10 58] [CDAB 6 15 59]
[BCDA 13 21 60]
[ABCD 4 6 61] [DABC 11 10 62] [CDAB 2 15 63]
[BCDA 9 21 64]
/* 然后进行如下操作 */
A = A + AA
B = B + BB
C = C + CC
D = D + DD
end /* 结束对I的循环*/
6、输出结果。
【认证与加密】
为了区分合法用户和非法使用者,需要对用户进行认证。
标准的Unix认证用户的过程是,用户输入口令,口令传输到系统程序中,由系统程序对口令进行加密,并与系统中的口令密文进行比较来判断口令是否正确。在这种方法中,如果要通过网络认证,就要将口令以明文形式在网络中传输,因此就存在被窃听的危险。
此外,流行的认证方式还有S/key,Kerberos,Radius等方式,其中S/key是使用一次性的口令,这样即使口令被窃听也无关紧要,其然而使用起来却比较烦琐,使用S/key的用户可能需要打印出长长的口令来帮助输入正确的口令。Kerberos和Radius认证方式能保证口令不被窃听,但他们是在服务器和客户机都支持相应的认证方式的条件下才能使用,因而需要更复杂的设置。
当前Kerberos V认证方式比较流行,Windows 2000中采用了这种认证方式。但在FreeBSD 中提供的是Kerberos IV认证方式。需要注意的是,Kerberos V和Kerberos IV差异较大,是两个互不兼容的独立版本。
通常使用的加密算法为DES算法,经实践证明它是一种很有效加密算法,虽然Unix上使用的密钥长度为56位,还不足够安全。因为在Internet上,已经有人通过多台计算机合作计算,通过几个月时间破解了使用它加密的内容。但对于一般的安全性,加上选择得当的口令,56位的DES算法也足够用了。如果要提供更高的安全性,可以使用更长的密钥,或者使用另外的算法,如IDEA算法、三重DES算法等。
与安全有关的算法还包括一类单向散列算法,如MD2、MD4、MD5等,这些算法的目的是用于从已有数据中生成与其他数据不同的少量标识数据,从而区分不同的数据,这样就能通过这些标识数据分辨不同数据。由于不同的数据使用上面的算法生成的标识数据只有极少的可能相同,这些算法一般被用于数字签名,用于保证网络中的文件传输没有发生错误。这些算法也能用于口令认证,其中MD4用于认证时存在安全性不高的问题,因而用于认证时一般使用MD5算法。
FreeBSD缺省使用MD5算法用作口令认证,这并不影响系统的正常执行。
对于DES等算法来讲,加密和解密是使用同一个密钥,这个密钥必须秘密保存,一旦泄露就不能保证数据的安全,但要让其他使用者获得加密的信息,就必须告诉他这个密钥,这样就很容易泄露密钥。因此在加密传输中,密钥的传输是一个与数据安全非常相关的问题。另一种不同的思路是使用多个密钥,例如两个密钥,一个加密过的数据只能由另一个来解密,其中一个密钥由用户保存,为私有密钥,另一个向所有要进行加密传输信息的使用者公开,称为公开密钥。当他们要向这个用户发送信息时,能使用该用户的公开密钥加密信息,那么只有这个用户能使用自己的私有密钥能解开信息。同样这个用户用自己的私有密钥加密信息,那么其他用户只能使用他的公开密钥才能解开,这样就保证了信息是由这个用户发出的,而不是其他人的伪造信息。最著名的公开密钥加密算法为RSA算法。
使用公开密钥算法进行传输,就能避免数据被窃听的问题,常用的使用公开密钥算法的软件有ssh,pgp,以及其他使用SSL的应用程序。
加密算法的选择是一个非常关键的问题,由于加密算法涉及非常高深的数学问题,因此不是任何人都能发明一个加密算法。有的人以为使用一个不公开算法本身的专有加密算法会增加安全性,其实不然,未经验证的加密算法很可能存在漏洞,在专业密码学家那里有很多种方法可以进行破解,在密码学领域内有很多失败的例子,即使是非常专业的密码学专家,发明一种加密方法也不是一个简单的事情,未经验证的算法在其他专业密码学家的破解下,很容易面临失败的危险。因此,应该尽量选择已被证明是成熟的加密方法。
【数字签名】
手体签字长期以来被当成一种合法的凭证而被广泛的使用,这主要是手体签字满足以下五个原则:
1、签字是可以被确认的。即当文件上有你的签字时,别人确信这个文件是经你发出的。
2、签字是无法伪造的,即签字是签字者的凭证。
3、签字是无法被重复使用的,即任何人无法用你在别处的签字挪到该文件。
4、文件被签字后是无法被篡改的。
5、签字具有不可否认性,即签字者无法否认自己签字文件上的签字行为。
当然,事实上这几条都无法被100%满足。签字是可以被伪造的,可以从一个文件移到另一个文件上,签字后的文件也可以被篡改。但问题是这些作弊手段都是极困难的,而且易被发现。所以我们基本上可以说手体签字是符合以上五大要素的。
当我们要对计算机文件做同样的事时问题就变得十分复杂。首先在计算机上文件的拷贝十分的容易,同时剪切、粘贴也绝非难事。即使手体签字难以伪造,可以把手体签字以图形的方式扫入计算机上,然后在以剪切、粘贴的方式很方便的从一个文件移到另一个文件上。另外签字后,一个计算机文件是容易被修改而不留痕迹的。为了对计算机文件进行有效的签字,我们需要利用大量的加解密知识才能产生所谓的"数字签名",以确保计算机上文件的有效性。
下面我们首先介绍一些加解密的基本原理
其中Plaintext为原文件,记为P,Ciphertext为加密后的文件,记为C,Encryption为加密算法,记为E,则有 E(P)=C 即P经过加密后变成C
若我们将Decrytion,即解密算法记为D,则D(C)=P,即C经过解密变成P,整个过程可写成 D(E(P))=P
现代的加解密算法一般都是公开的,因此也就要有所谓的Key,记作K,即密钥的概念,即加解密一个文件是算法和Key的组合,算法可公开,但Key不公开,仍可满足保密性的要求。
即Ek(P)=C, Dk(C)=P,Dk(Ek(P))=P
上面的算法中加、解密所用的Key是相同的,这类算法被称为对称性算法,即Symmetric Algorithm,另一类算法则相反,即加、解密用不同的Key。
Ek1(P)=C , Dk2(C)=P , Dk2(Ek1(P))=P
这种算法被称为公钥算法,即Public Key Algorithm,其中(k1,k2)是成队出现的,用其中一个加密的文件只有用另一个才能解密。两个Key中有一个是保密的,称为私钥(Private Key),另一个是公开的称为公钥(Public Key)。
有了对加解密算法的理解,我们就可以进一步讨论"数字签名"的问题了,即如何给一个计算机文件进行签字。数字签字即可以用对称算法实现,也可以用公钥算法实现。但前者除了文件签字者和文件接受者双方,还需要第三方认证,较麻烦,本文仅介绍公钥算法的实现方法。
实现的基本原理很简单,假设A要发送一个电子文件给B,A、B双方只需经过下面三个步骤即可
1. A用其私钥加密文件,这便是签字过程
2. A将加密的文件送到B
3. B用A的公钥解开A送来的文件
以上方法是符合本文开始提到的五个签字可靠性原则的
1. 签字是可以被确认的,因为B是用A的公钥解开加密文件的,这说明原文件只能被A的私钥加密而只有A才知道自己的私钥。
2. 签字是无法被伪造的,因为只有A知道自己的私钥。因此只有A能用自己的私钥加密一个文件。
3. 签字是无法重复使用的,签字在这里就是一个加密过程,自己无法重复使用。
4. 文件被签字以后是无法被篡改的,因为加密后的文件被改动后是无法被A的公钥解开的。
5. 签字具有无可否认性,因为除A以外无人能用A的私钥加密一个文件。
以上数字签字的方法是相当简单和理想化的,具体应用中还是有一些问题需要解决的。
1.签字后的文件可能被B重复使用。如果签字后的文件是一张支票,B很容易多次用该电子支票兑换现金,为此A需要在文件中加上一些该支票的特有的凭证,如timestamp等,以防止上述情况发生。
2.公钥算法的效率是相当低的,不易用于长文件的加密,为此我们采用Hash函数,将原文件P通过一个单向(one-way)的Hash函数作用,生成相当短的(仅几十或几百bits)的输出H,即Hash(P)=H,这里由P可以很快生成H,但由于H几乎不可能生成P,然后再将公钥算法作用在H上生成"签字"S,记为Ek1(H)=S,k1为A的公钥,A将(P,S)传给B,B收到(P,S)后,需要验证S是A的签字。
若我们有H1=H2,即Dk2(S)=Hash(P),我们便认为S就是A的签字。
以上方法实际上就是把签字过程从对原文件转移到一个很短的hash值上,大大地提高了效率,这种方法在现代的电子商务中被广泛的使用。
【一次性口令技术简介】
常规口令
在现实生活中,我们个人的身份主要是通过各种证件来确认的,比如:身份证、户口本等。计算机世界与现实世界非常相似,各种计算资源(如:文件、数据库、应用系统)也需要认证机制的保护,确保这些资源被应该使用的人使用。在大多数情况下,认证机制与授权和记账也紧密结合在一起。
目前各类计算资源主要靠固定口令的方式来保护。比如你需要访问一个NT系统,首先必须在这个NT上设置一个账户,并设定密码。当通过网络访问NT资源时,系统会要求输入你的账户名和密码。在账户和密码被确认了以后,你就可以访问NT上的资源了。
这种以固定口令为基础的认证方式存在很多问题,最明显的是以下几种:
网络数据流窃听(Sniffer) 由于认证信息要通过网络传递,并且很多认证系统的口令是未经加密的明文,攻击者通过窃听网络数据,就很容易分辨出某种特定系统的认证数据,并提取出用户名和口令。
认证信息截取/重放(Record/Replay) 有的系统会将认证信息进行简单加密后进行传输,如果攻击者无法用第一种方式推算出密码,可以使用截取/重放方式。
字典攻击 由于多数用户习惯使用有意义的单词或数字作为密码,某些攻击者会使用字典中的单词来尝试用户的密码。所以大多数系统都建议用户在口令中加入特殊字符,以增加口令的安全性。
穷举尝试(Brute Force) 这是一种特殊的字典攻击,它使用字符串的全集作为字典。如果用户的密码较短,很容易被穷举出来,因而很多系统都建议用户使用长口令。
窥探 攻击者利用与被攻击系统接近的机会,安装监视器或亲自窥探合法用户输入口令的过程,以得到口令。
社交工程 攻击者冒充合法用户发送邮件或打电话给管理人员,以骗取用户口令。
垃圾搜索 攻击者通过搜索被攻击者的废弃物,得到与攻击系统有关的信息,如果用户将口令写在纸上又随便丢弃,则很容易成为垃圾搜索的攻击对象。
虽然用户可以通过经常更换密码和增加密码长度来保证安全,但这同时也用户带来了很大麻烦。
一次性口令
为了解决固定口令的诸多问题,安全专家提出了一次性口令(OTP:One Time Password)的密码体制,以保护关键的计算资源。
OTP的主要思路是:在登录过程中加入不确定因素,使每次登录过程中传送的信息都不相同,以提高登录过程安全性。例如:登录密码=MD5(用户名+密码 +时间),系统接收到登录口令后做一个验算即可验证用户的合法性。
不确定因子选择与口令生成
这些不确定因子选择方式大致有以下几种:
口令序列(S/KEY) 口令为一个单向的前后相关的序列,系统只用记录第 N个口令。用户用第N-1个口令登录时,系统用单向算法算出第N个口令与自己保存的第N个口令匹配,以判断用户的合法性。由于N是有限的,用户登录N次后必须重新初始化口令序列。
挑战/回答(CRYPTOCard) 用户要求登录时,系统产生一个随机数发送给用户。用户用某种单向算法将自己的秘密口令和随机数混合起来发送给系统,系统用同样的方法做验算即可验证用户身份。
时间同步(SecureID) 以用户登录时间作为随机因素。这种方式对双方的时间准确度要求较高,一般采取以分钟为时间单位的折中办法。在SecureID 产品中,对时间误差的容忍可达±1分钟。
事件同步(Safe Word) 这种方法以挑战/回答方式为基础,将单向的前后相关序列作为系统的挑战信息,以节省用户每次输入挑战信息的麻烦。但当用户的挑战序列与服务器产生偏差后,需要重新同步。
一次性口令的生成方式有以下几种:
Token Card(硬件卡) 用类似计算器的小卡片计算一次性口令。对于挑战/回答方式,该卡片配备有数字按键,便于输入挑战值;对于时间同步方式,该卡片每隔一段时间就会重新计算口令;有时还会将卡片作成钥匙链式的形状,某些卡片还带有PIN保护装置。
Soft Token(软件) 用软件代替硬件,某些软件还能够限定用户登录的地点。
IC卡 在IC卡上存储用户的秘密信息,这样用户在登录时就不用记忆自己的秘密口令了。
【一种具有认证功能的FTP代理服务器模型】
FTP基本原理
一个典型的FTP会话一般经过四个阶段:第一个阶段,FTP客户程序与FTP服务器连接;第二阶段,客户登录进入FTP服务器主机;第三阶段,FTP客户服务器交换命令和应答信息;第四阶段,FTP客户关闭它同FTP服务器之间的连接。对所有的通信,FTP使用TCP连接。
FTP代理的模型
接受FTP客户的连接请求的FTP代理服务器经过身份认证和访问控制策略之后,如果同意请求,则由代理服务器替用户对资源进行实际访问,结果由代理转发给用户。
具体过程如下:FTP代理服务器在端口执行被动打开,并等待客户连接;相应地,FTP客户在这一端口与FTP代理服务器联系,在程序协调下完成一个典型的TCP连接,控制连接在整个FTP处理过程中保护主动状态;代理协议中包含一系列的身份验证、访问控制,若同意该连接请求,FTP代理则接受连接,并向FTP服务器发出请求,与FTP Server 建立连接,FTP Server传送应答码给FTP Proxy,交换NVTASC Ⅱ命令串及应答码;FTP Server向FTP Proxy返回请求结果;FTP Proxy对结果进行缓存、改写、过滤,并将结果返回给客户。
此操作的核心环节是代理协议(PPI)、协议解释(PI)和数据传输过程(DTP)。客户、代理服务器和服务器有它们各自的协议解释和数据传输过程。数据传输过程建立和管理数据连接。协议解释部门解释命令,并通过PI和PPI在FTP会话开始时建立的控制连接进行通信。
PPI中的用户身份验证
在PPI中,我们采用公开密钥的数字签名技术可以较好地解决客户口令系统现存的问题。
(1) 基于数字签名的口令认证
采用公开密钥的数字签名技术可以较好地解决客户口令系统现存的问题。每个用户将 自己的公开的加密密钥K交给系统,作为验证口令的数据。系统为每个用户建立一个时间标志,如设置访问次数计数器为T。用户访问系统时要向系统提供的数据是自己签名的信息:[IDi D ((IDi Ti),Kdi)]。系统根据其中明文形式的标识符IDi查到Kci,并计算。
E(D((IDi,Ti),Kdi),Kci)=(ID *i,T *)
并且仅当IDi=ID *i 且T *=Ti +1时,系统才接收用户的访问。在这种口令验证机制中,真正的口令是用户的保密的解密密钥Kdi,它不存储在系统中,故任何人都不能得到。虽然K存储在系统中,但由Kci不能推出Kdi。由于在终端到系统的通道中传送的是签名数据而不是Kdi本身,故截取也不能获得Kdi。又由于系统为每个用户设置了时间标志T, 当且仅当T *=Ti +1时才接收访问,故截取重播也是无用的。
(2) 口令的认证过程
模型的口令认证过程需要修改客户程序。具体过程如下:
提示用户登录名称;
从代理服务器接收响应,获知如何提示用户;
用代理服务器显示规定的提示;
回收用户响应,输入签名数据信息,并把它发送到代理服务器;
联系代理服务器,并且告诉它试图登录的用户;
代理服务器查找相应的认证表,决定访问被接收还是拒绝;
从代理服务器接收到正确或者错误消息;
允许用户访问(如果正确)或者显示错误消息。
整个进程是由客户和代理服务器之间的单个TCP连接来执行,这样在整个认证过程中,代理服务器和客户都能确认在与相同的客户和服务器交谈。代理服务器根据其数据库来决定如何认证用户,并根据相应的认证机制给出用户提示。
代理服务器作为防火墙的一种重要技术得到了各方面的重视。代理服务器的研究课题还有很多,如如何对其进行危险评估,如何在代理服务与客户机之间更好地解决身份认证,代理服务器算法的设计,如何开发智能的代理服务器,如何制定更优的安全策略等。代理服务器作为保卫网络安全的重要手段必将得到进一步的发展。
【PGP 简介】
本文主要介绍一些关于PGP实现的原理和背景知识,
有关PGP的安装、使用等请参考与本文同时提供的
其他文档。
PGP—Pretty Good Privacy,是一个基于RSA公匙加
密体系的邮件加密软件。可以用它对你的邮件保密以防
止非授权者阅读,它还能对你的邮件加上数字签名从而
使收信人可以确信邮件是你发来的。它让你可以安全地
和你从未见过的人们通讯,事先并不需要任何保密的渠
道用来传递密匙。它采用了:审慎的密匙管理,一种RSA
和传统加密的杂合算法,用于数字签名的邮件文摘算
法,加密前压缩等,还有一个良好的人机工程设计。它
的功能强大,有很快的速度。而且它的源代码是免费
的。
实际上PGP的功能还不止上面说的: PGP可以用来加
密文件,还可以用PGP代替UUencode 生成 RADIX 64 格
式(就是MIME 的 BASE 64格式)的编码文件。
PGP 的创始人是美国的 Phil Zimmermann。他的创造
性在于他把RSA公匙体系的方便和传统加密体系的高速度
结合起来,并且在数字签名和密匙认证管理机制上有巧
妙的设计。因此PGP成为几乎最流行的公匙加密软件包。
PGP是一种供大众使用的加密软件。加密是为了安
全,私密权是一种基本人权。在现代社会里,电子邮件
和网络上的文件传输已经成为生活的一部分。邮件的安
全问题就日益突出了,大家都知道在Internet上传输的
数据是不加密的。如果你自己不保护自己的信息,第三
者就会轻易获得你的隐秘。还有一个问题就是信息认
证,如何让收信人确信邮件没有被第三者篡改,就需要
数字签名技术。RSA公匙体系的特点使它非常适合用来满
足上述两个要求:保密性(Privacy)和认证性
(Authentication)。
RSA(Rivest-Shamir-Adleman)算法是一种基于大
数不可能质因数分解假设的公匙体系。简单地说就是找
两个很大的质数,一个公开给世界,一个不告诉任何
人。一个称为“公匙”,另一个叫“私匙”(Public key
& Secret key or Private key)。这两个密匙是互补
的,就是说用公匙加密的密文可以用私匙解密,反过来
也一样。假设甲要寄信给乙,他们互相知道对方的公
匙。甲就用乙的公匙加密邮件寄出,乙收到后就可以用
自己的私匙解密出甲的原文。由于没别人知道乙的私匙
所以即使是甲本人也无法解密那封信,这就解决了信件
保密的问题。另一方面由于每个人都知道乙的公匙,他
们都可以给乙发信,那么乙就无法确信是不是甲的来
信。认证的问题就出现了,这时候数字签名就有用了。
在说明数字签名前先要解释一下什么是“邮件文
摘”(message digest),简单地讲就是对一封邮件用某
种算法算出一个最能体现这封邮件特征的数来,一旦邮
件有任何改变这个数都会变化,那么这个数加上作者的
名字(实际上在作者的密匙里)还有日期等等,就可以
作为一个签名了。确切地说PGP是用一个128位的二进制
数作为“邮件文摘”的,用来产生它的算法叫
MD5(message digest 5),MD5的提出者是Ron Rivest,
PGP中使用的代码是由Colin Plumb 编写的,MD5本身是
公用软件。所以PGP的法律条款中没有提到它。MD5是一
种单向散列算法,它不像CRC校验码,很难找到一份替代
的邮件与原件具有同样的MD5特征值。
回到数字签名上来,甲用自己的私匙将上述的128位
的特征值加密,附加在邮件后,再用乙的公匙将整个邮
件加密。(注意这里的次序,如果先加密再签名的话,
别人可以将签名去掉后签上自己的签名,从而篡改了签
名)。这样这份密文被乙收到以后,乙用自己的私匙将
邮件解密,得到甲的原文和签名,乙的PGP也从原文计算
出一个128位的特征值来和用甲的公匙解密签名所得到的
数比较,如果符合就说明这份邮件确实是甲寄来的。这
样两个安全性要求都得到了满足。
PGP还可以只签名而不加密,这适用于公开发表声明
时,声明人为了证实自己的身份(在网络上只能如此
了),可以用自己的私匙签名。这样就可以让收件人能
确认发信人的身份,也可以防止发信人抵赖自己的声
明。这一点在商业领域有很大的应用前途,它可以防止
发信人抵赖和信件被途中篡改。
那么为什么说PGP用的是RSA和传统加密的杂合算法
呢?因为RSA算法计算量极大在速度上不适合加密大量数
据,所以PGP实际上用来加密的不是RSA本身,而是采用
了一种叫IDEA的传统加密算法。我先解释一下什么叫传
统加密,简单地说就是用一个密匙加密明文,然后用同
样的密匙解密。这种方法的代表是DES(US Federal Data
Encryption Standard),也就是乘法加密,它的主要缺
点就是密匙的传递渠道解决不了安全性问题,不适合网
络环境邮件加密需要。IDEA是一个有专利的算法,专利
持有者是ETH和一个瑞士公司:Ascom-Tech AG。非商业
用途的IDEA实现不用向他们交纳费用。IDEA的加(解)
密速度比RSA快得多,所以实际上PGP是以一个随机生成
密匙(每次加密不同)用IDEA算法对明文加密,然后用
RSA算法对该密匙加密。这样收件人同样是用RSA解密出
这个随机密匙,再用IDEA解密邮件本身。这样的链式加
密就做到了既有RSA体系的保密性,又有IDEA算法的快捷
性。PGP的创意有一半就在这一点上了,为什么RSA体系
70年代就提出来,一直没有推广应用呢?速度太慢!那
么PGP创意的另一半在哪儿呢?下面我再谈PGP的密匙管
理。
一个成熟的加密体系必然要有一个成熟的密匙管理机制
配套。公匙体制的提出就是为了解决传统加密体系的密
匙分配过程难以保密的缺点。比如网络hacker们常用的
手段之一就是“监听”,如果密匙是通过网络传送就太
危险了。举个例子:
Novell Netware 的老版本中,用户的密码是以明文在
线路中传输的,这样监听者轻易就获得了他人的密码。
当然 Netware 4.1 中数据包头的用户密码现在是加密的
了。对PGP来说公匙本来就要公开,就没有防监听的问
题。但公匙的发布中仍然存在安全性问题,例如公匙的
被篡改(Public Key Tampering),这可能是公匙密码体
系中最大的漏洞,因为大多数新手不能很快发现这一
点。你必须确信你拿到的公匙属于它看上去属于的那个
人。为了把这个问题说清楚,我举个例子,然后再说如
何正确地用PGP堵住这个漏洞。
以你和Alice的通信为例,假设你想给Alice发封
信,那你必须有Alice的公匙,你从BBS上下载了Alice的
公匙,并用它加密了信件用BBS的Email功能发给了
Alice。不幸地,你和Alice都不知道,另一个用户叫
Charlie的用户潜入BBS,把他自己用Alice的名字生成的
密匙对中的公匙替换了Alice的公匙。那你用来发信的公
匙就不是Alice的而是Charlie的,一切看来都很正常,
因为你拿到的公匙的用户名是:
“Alice”。于是Charlie就可以用他手中的私匙来解密
你给Alice的信,甚至他还可以用Alice真正的公匙来转
发你给Alice的信,这样谁都不会起疑心,他如果想改动
你给Alice的信也没问题。更有甚者,他还可以伪造
Alice的签名给你或其他人发信,因为你们手中的公匙是
伪造的,你们会以为真是Alice的来信。
防止这种情况出现的最好办法是避免让任何其他人
有机会篡改公匙,比如直接从Alice手中得到她的公匙,
然而当她在千里之外或无法见到时,这是很困难的。PGP
发展了一种公匙介绍机制来解决这个问题。举例来说:
如果你和Alice有一个共同的朋友David,而David知道他
手中的Alice的公匙是正确的(关于如何认证公匙,PGP
还有一种方法,后面会谈到,这里假设David已经和
Alice认证过她的公匙)。这样David可以用他自己的私
匙在Alice的公匙上签名(就是用上面讲的签名方法),
表示他担保这个公匙属于Alice。当然你需要用David的
公匙来校验他给你的Alice的公匙,同样David
也可以向Alice认证你的公匙,这样David就成为你和
Alice之间的“介绍人”。这样Alice或David就可以放心
地把David签过字的Alice的公匙上载到BBS上让你去拿,
没人可能去篡改它而不被你发现,即使是BBS的管理员。
这就是从公共渠道传递公匙的安全手段。
有人会问:那你怎么安全地得到David的公匙呢,这
不是个先有鸡还是先有蛋的问题吗?确实有可能你拿到
的David的公匙也是假的,但这就要求这个捣蛋者参与这
整个过程,他必须对你们三人都很熟悉,还要策划很
久,这一般不可能。当然,PGP对这种可能也有预防的建
议,那就是由一个大家普遍信任的人或机构担当这个角
色。
他被称为“密匙侍者”或“认证权威”,每个由他签字
的公匙都被认为是真的,这样大家只要有一份他的公匙
就行了,认证这个人的公匙是方便的,因为他广泛提供
这个服务,假冒他的公匙是很极困难的,因为他的公匙
流传广泛。这样的“权威”适合由非个人控制组织或政
府机构充当,现在已经有等级认证制度的机构存在。
对于那些非常分散的人们,PGP更赞成使用私人方式
的密匙转介方式,因为这样有机的非官方途径更能反映
出人们自然的社会交往,而且人们也能自由地选择信任
的人来介绍。总之和不认识的人们之间的交往一样。每
个公匙有至少一个“用户名”(User ID),请尽量用自己
的全名,最好再加上本人的Email地址,以免混淆。
注意!你所必须遵循的一条规则是:在你使用任何
一个公匙之前,一定要首先认证它!!!无论你受到什
么诱惑,当然会有这种诱惑,你都不要,绝对不要,直
接信任一个从公共渠道(尤其是那些看起来保密的)得
来的公匙,记得要用熟人介绍的公匙,或者自己与对方
亲自认证。同样你也不要随便为别人签字认证他们的公
匙,就和你在现实生活中一样,家里的房门钥匙你是只
会交给十分信任的人的。
下面,我讲讲如何通过电话认证密匙。每个密匙有
它们自己的标识(keyID),keyID是一个八位十六进制
数,两个密匙具有相同keyID的可能性是几十亿分之一,
而且PGP还提供了一种更可靠的标识密匙的方法:“密匙
指纹”(key's fingerprint)。每个密匙对应一串数字
(十六个两位十六进制数),这个指纹重复的可能就更
微乎其微了。而且任何人无法指定生成一个具有某个指
纹的密匙,密匙是随机生成的,从指纹也无法反推出密
匙来。这样你拿到某人的公匙后就可以和他在电话上核
对这个指纹,从而认证他的公匙。如果你无法和Alice通
电话,你可以和David通电话认证David的公匙,从而通
过David认证了Alice的公匙,这就是直接认证和间接介
绍的结合。
这样又引出一种方法,就是把具不同人签名的自己
的公匙收集在一起,发送到公共场合,这样可以希望大
部分人至少认识其中一个人,从而间接认证了你的公
匙。同样你签了朋友的公匙后应该寄回给他,这样就可
以让他可以通过你被你的其他朋友所认证。有点意思吧
和现实社会中人们的交往一样。PGP会自动为你找出你
拿到的公匙中有哪些是你的朋友介绍来的,那些是你朋
友的朋友介绍来的,哪些则是朋友的朋友的朋友介绍
的……它会帮你把它们分为不同的信任级别,让你参考
决定对它
们的信任程度。你可以指定某人有几层转介公匙的能
力,这种能力是随着认证的传递而递减的。
转介认证机制具有传递性,这是个有趣的问题。PGP
的作者Phil Zimmermann说过一句话:
“ 信赖不具有传递性;我有个我相信决不撒谎的朋
友。可是他是个认定总统决不撒谎的傻瓜,可很显然我
并不认为总统决不撒谎。”
关于公匙的安全性问题是PGP安全的核心,我在这里
就不细说了。和传统单密匙体系一样,私匙的保密也是
决定性的。相对公匙而言,私匙不存在被篡改的问题,
但存在泄露的问题。RSA的私匙是很长的一个数字,用户
不可能将它记住,PGP的办法是让用户为随机生成的RSA
私匙指定一个口令(pass phase)。只有通过给出口令才
能将私匙释放出来使用,用口令加密私匙的方法保密程
度和PGP本身是一样的。所以私匙的安全性问题实际上首
先是对用户口令的保密。当然私匙文件本身失密也很危
险,因为破译者所需要的只是用穷举法试探出你的口令
了,虽说很困难但毕竟是损失了一层安全性。在这里只
用简单地记住一点,要像任何隐私一样保藏你的私匙,
不要让任何人有机会接触到它,最好只在大脑中保存
它,不要写在纸上。
PGP在安全性问题上的审慎考虑体现在PGP的各个环
节。比如每次加密的实际密匙是个随机数,大家都知道
计算机是无法产生真正的随机数的。PGP程序对随机数的
产生是很审慎的,关键的随机数像RSA密匙的产生是从用
户敲键盘的时间间隔上取得随机数种子的。对于磁盘上
的 randseed.bin 文件是采用和邮件同样强度的加密
的。这有效地防止了他人从你的randseed.bin文件中分
析出你的加密实际密匙的规律来。
在这里我提一下PGP的加密前预压缩处理,PGP内核
使用PKZIP算法来压缩加密前的明文。一方面对电子邮件
而言,压缩后加密再经过7bits编码密文有可能比明文更
短,这就节省了网络传输的时间。另一方面,明文经过
压缩,实际上相当于经过一次变换,信息更加杂乱无
章,对明文攻击的抵御能力更强。PGP中使用的PKZIP算
法是经过原作者同意的。PKZIP算法是一个公认的压缩率
和压缩速度都相当好的压缩算法。在PGP中使用的是
PKZIP 2.0版本兼容的算法。
好了,关于PGP安全性的问题我会在《PGP的安全
性》一文中专门介绍。我上面讲了这么多只是为了让大
家知道PGP会是非常安全的,只要你自己遵循正确的使用
方法。关于PGP的安装和使用请参考《PGP 2.6.3i的安装
与使用》一文。如果在看英文文档时有些不太明白的词
汇,请试试能不能从《PGP名词解释》一文中找到线索。
PGP 2.6.3i是我推荐大家使用的PGP版本,有关这个版本
的详细问题请参见《PGPi 问答集》一文。
在今天的Internet上随处可见用PGP签名的文章,
PGP的版本也在飞快地更新,据说PGP 3.0 再有几个月就
要推出了。世界上越来越多的人们在使用PGP,我们中国
人也应该重视保护自己合法的私密权。我翻译整理这几
篇文章就是为了在国内宣传推广PGP的使用。尽管它还是
个新生事物,可是我们要看到在网际空间
(CyberSpace)中它肯定能迅速成长起来,中国虽然起
步晚,但比美国也差不太多,我们应该迎头赶上。
××××××××××××××××××××××××
×××××××××××××××
这篇《PGP 简介》与《PGP 2.6.3i的安装与使
用》、《PGP 名词解释》、《PGPi问答集》还有《PGP的
安全性》,是我在参考PGP内附的文档和一些关于PGP安
全性的文章后写的。我只是一个一般计算机爱好者,拿
到PGP后觉得很不错,希望大家都能够利用上它,就利用
考试后回家前这段时间写了这些东西。由于我水平太
低,时间又很仓促,肯定有不少错误。只是觉得咱们大
陆也应该有这类数据安全的软件产品让大家使用,而英
文的东西又不利于推广,就硬着头皮翻译了,可是又没
时间全部翻译PGP的文档,只好就自己的理解写了一些,
太杂乱了,没什么头绪,大家先凑合看吧。我还想等有
时间再翻译PGP的全部文档,希望大家多多指教,好让我
少犯错误。
【PGP的安全性分析】
这可能是个最难写的题目了,PGP本身就是一个数据安全产品,它会
有什么安全性问题呢?PGP的作者 Phil Zimmermann 在PGP文档中说到:
“没有哪个数据安全系统是牢不可破的。”PGP也不例外。我们研究它的
安全漏洞就是为了让用户知道哪些事会降低PGP的安全性,以及如何避免
它们。下面是这些漏洞:
口令或私匙的泄密、公匙被篡改、你删除的文件被人恢复、病毒和
特洛伊木马、物理安全受到侵犯(物理安全指计算机等物理资源的安
全)、电磁泄露、暴露在多用户系统中、网络数据流分析,甚至会有可
能被直接从密码学分析的角度被解密(这当然是可能性最小的了)。
我们先分别看看PGP加密体系的四个关键部分的安全性问题。PGP是
个杂合算法,所谓“杂合”体现在它包含:一个对称加密算法
(IDEA)、一个非对称加密算法(RSA)、一个单向散列算法(MD5)以
及一个随机数产生器(从用户击键频率产生伪随机数序列的种子)。每
种算法都是PGP不可分割的组成部分,对它们各有不同的攻击方式。
◎ IDEA 的安全性问题
IDEA是PGP密文实际上的加密算法,对于采用直接攻击法的解密者来
说,IDEA是PGP密文的第一道防线。
关于IDEA的原理请参见《PGP简介》,在这里我主要谈谈与安全性有
关的部分。IDEA,一种由 Lai 和 Massey 在 1992 年完成的对64bit大
小的数据块的传统加密算法。
IDEA是 International Data Encryption Algorithm 的缩写。它基于
“相异代数群上的混合运算”设计思想,它比DES在软件实现上快得多,
和DES一样,它也支持“反馈加密(CFB)”和“链式加密(CBC)”两种
模式,在PGP中采用IDEA的64-bits CFB模式。
IDEA比同时代的算法象:FEAL, REDOC-II, LOKI, Snefru 和 Khafre都
要坚固,而且最近的证据表明即使是在DES上取得巨大成功的 Biham 和
Shamir 的微分密码分析法对IDEA也无能为力。Biham 和 Shamir 曾对
IDEA的弱点作过专门分析,但他们没有成功。直到目前没有任何关于
IDEA的密码学分析攻击法的成果发表,据目前我接触到的文档中谈到无
论是NSA还是hacker们都还没有办法对IDEA进行密码学分析,因此对IDEA
的攻击方法就只有“直接攻击”或者说是“密匙穷举”一种了。
那么对IDEA的直接攻击难度如何呢?我们知道IDEA的密匙空间(密
匙长度)是128位,用十进制表示所有可能的密匙个数将是一个天文数
字:
340,282,366,920,938,463,463,374,607,431,768,211,456.
为了试探出一个特定的密匙,平均要试探一半上面的可能性。即使
你用了十亿台每秒钟能够试探十亿个密匙的计算机,所需的时间也比目
前所知的宇宙的年龄要长,而即使是在当代制造每秒试探十亿个密匙的
计算机还是不可能的。因此对IDEA进行明文攻击也是不可能的,更何况
从PGP的原理看一个IDEA的密匙失密只会泄露一次加密的信息,对用户最
重要的密匙——RSA密匙对的保密性没有什么影响。
那么看来IDEA是没有什么问题了,因为你既不能从算法中找到漏洞
又没法明文攻击实际上呢?漏洞还是有的,大家知道 Netscape 的安全
性风波吧,就是因为忽视了密匙随机生成的问题,Netscape的随机密匙
生成算法生成的密匙很有“规律”,而且远远没有均布到整个密匙空间
去,所以尽管Netscape的美国版采用128bits的密匙,还是被用很小的机
时代价破掉了。那么PGP是不是也有这个毛病呢?我将在下面谈到随机数
生成时再详细说,这里提到它是为了说明PGP各个部分之间的依存关系。
当有人发现PGP实际上不是一种“纯粹的”RSA加密算法时,他们担
心由于加密链中IDEA的弱点而被攻破。实际上这是由于一种误解:他们
认为公匙加密生来就比传统加密安全得多。实际上密码分析专家计算
过,穷举128-bit IDEA密匙和分解3100-bitRSA密匙的工作量相当,而实
际上1024-bit的RSA密匙已被认为是机密级的,而且1024-bit的纯粹RSA
加密要比128-bit的IDEA加密要慢4000多倍。RSA的长处在于它的易用性
而不是它的坚固性,相反加密链的弱点不在IDEA上而是在RSA上。当然这
只是相对而言,我们马上会看到RSA对直接攻击的抵御也是足够强的。
随便提一句,在PGP的未来版本中将提供密匙长度为112-bit的
Triple DES加密算法作为用户选项。56-bit的标准DES密匙已经被证明是
可以攻破的。
◎ RSA 的安全性问题
先看看RSA的基本原理,我们知道RSA的保密性基于一个数学假设:
对一个很大的合数进行质因数分解是不可能的。RSA用到的是两个非常大
的质数的乘积,用目前的计算机水平是无法分解的。但是这说明不了什
么,没有“证明”RSA的安全性。这既不说明分解这个大数是攻击RSA唯
一的(或者说是最佳的)途径,也不能证明这种分解真的那么困难。
RSA有可能存在一些密码学方面的缺陷,随着数论的发展也许会找到一种
耗时以多项式方式增长的分解算法。不过目前这还只是展望,甚至连发
展的方向都还没有找到。有三种事物的发展会威胁到RSA的安全性:分解
技术、计算机能力的提高和计算机造价的降低。特别是第一条对RSA的威
胁最大,因为只要大数分解的问题不解决,做乘法总是比分解因数快得
多,计算机能力强大了尽可以加长密匙来防御,因为那时加密也会快得
多的。
RSA的密匙生成步骤可以分为七步:
- 找到两个大质数 p,q
- 做乘法 n=p*q
- 选择一个数 e,满足 e
取前四个质数的测试称为四阶费马测试,PGP采用的就是
它。一阶测试误判的概率是 10^-13 ,二阶后是 10^-26
,作完四阶测试后是 10^-52。而且它绝对不会漏掉一个
质数。当然将合数误判为质数的可能性是存在的,这种能
通过费马测试的合数被称为Carmichael 数,象
561,1105,1729 等等。它们很稀少,在 10^9 范围内只有
255 个。
下面是几种针对RSA有效的攻击方法,它们实际上对
PGP没有效力,因为它们攻击的是加密协议环节上的漏
洞,而不是RSA本身的。从这些例子可以看到PGP是如何在
实现上堵住这些漏洞的。
● 选择密文攻击
由于RSA密文是通过公开渠道传播的,攻击者可以获
取密文。我们假设攻击者为A,密文收件人为T,A得到了
发往T的一份密文c,他想不通过分解质因数的方法得到明
文。
换句话说,他需要 m = c^d 。
为了恢复 m,他找一个随机数 r , r < n,当然他
有T的公匙(e,n)。他计算:
x=r^e % n (用 T 的公匙加密 r)
y=x*c % n (将临时密文x与c相乘)
t=r^-1 % n
A 知道RSA具有下面的一个特性:
如果 x=r^e % n,那么 r=x^d % n
因此他想办法让T对 y 用T自己的私匙签名(实际上
就是把 y 解密了),然后将结果 u=y^d % n 寄回给A。A
只要简单地计算:
m = t*u % n
上面结论的推导是这样的:
t*u % n = (r^-1)*(y^d) & n
= (r^-1)*(x^d)(c^d) % n
= (c^d) % n
= m
要防止这种攻击的办法就是不要对外来的随机信息签
名,或者只对信息的MD5特征值签名。在这里就很容易明
白为什么要强调MD5的单向性了,因为MD5的结果是不能预
定的,就是说A难以凑出一份刚好能产生 y 这样的MD5特
征值的明文来让T签名。
● 过小的加密指数 e
看起来,e 是一个小数并不降低RSA的安全性。从计
算速度考虑,e 越小越好。可是,当明文也是一个很小的
数时就会出现问题。例如我们取 e=3 ,而且我们的明文
m 比 n 的三次方根要小,那么密文 c = m^e % n 就会等
于 m^3。这样只要对密文开三次方就可以得到明文。
PGP对这个漏洞的处理是在明文上加上一个随机数,
这样保证 m > n ,而且缺省的e 值为17,如果不行再用
19,23 等等。
● RSA的计时攻击法
这是一种另辟蹊径的方法。是由 Paul Kocher 发表
的。大家可以发现,RSA的基本运算是乘方取模,这种运
算的特点是耗费时间精确取决于乘方次数。这样如果 A
能够监视到RSA解密的过程,并对它计时,他就能算出d
来。细节我就不复述了。我想说的是如何抵御它。Rivest
说,最简单的方法就是使RSA在基本运算上花费均等的时
间,而与操作数无关。其次在加密前对数据做一个变换
(花费恒定时间),在解密端做逆变换,这样总时间就长了。
至于PGP根本不用担心计时攻击,因为PGP采用了中国
余数理论的方法加速了运算,同时也使耗时与操作数无
关。同时计时攻击对攻击者资源的要求太高,实时监视加
密过程不是任何人都可能做到的。在这里提出这种攻击是
因为:虽然它目前还不实用,但从理论上是一个崭新的思
路,值得注意。
● 其他对RSA的攻击法
还有一些对RSA的攻击,象公共模数攻击。它是指几
个用户公用一个模数 n ,各自有自己的 e 和 d,在几个
用户之间公用 n 会使攻击者能够不用分解 n 而恢复明
文。但是PGP是不会在用户之间公用模数的。
最后谈谈RSA密匙长度的问题,多长的密匙是安全
的。专家指出,任何预言都是不理智的,就目前的计算机
水平用1024-bits的密匙是安全的,2048-bits是绝对安全
的。但是他们并不指望这个局面延续到下世纪,他们只是
指出:如果RSA象有些人说的那样脆弱,就不可能从1977
年一直保持到现在还没有被攻破。
◎ MD5 的安全性问题
MD5是一种在PGP中被用来单向变换用户口令和对信
息签名的单向散列算法。
一种单向散列的强度体现在它能把任意的输入随机
化到什么程度并且能产生唯一的输出。对单向散列的直接
攻击可以分为普通直接攻击和“生日”攻击。
● 对MD5的普通直接攻击
所谓直接攻击又叫野蛮攻击。攻击者为了找到一份和
原始明文 m 散列结果相同的明文 m' ,就是 H(m)=H(m')
。普通直接攻击,顾名思义就是穷举可能的明文去产生一
个和 H(m) 相同的散列结果。对MD5来说散列结果为
128-bits,就是说如果攻击者有一台每秒尝试
1,000,000,000条明文的机器需要算约10^22年,同时兴许
会同时发现本身)。
● 对MD5的生日攻击
生日攻击实际上只是为了找到两条能产生同样散列结
果的明文。记得那个有名的概率生日问题吗?在 N 个人
中至少有两个人生日相同的概率是多少?所谓生日攻击实
际上只是用概率来指导散列冲突的发现,对于MD5来说如
果尝试2^64条明文,那么它们之间至少有一对发生冲突的
概率就是 50%。仅此而已,对当今的科技能力来说,它
也是不可能的。一台上面谈到的机器平均需要运行585年
才能找到一对,而且并不能马上变成实际的攻击成果。因
为码长和速度的关系,对crypt(3)的生日攻击就成功得
多。
● 其他对MD5的攻击
微分攻击被证明对MD5的一次循环是有效的,但对全
部4次循环无效。(微分攻击是通过比较分析有特定区别
的明文在通过加密后的变化传播情况来攻击加密体系
的。)
有一种成功的MD5攻击,不过它是对MD5代码本身做了
手脚,是一种crack而不是hack更算不上cryptanalysis
了。而且如果你做了PGP发行包的签名校验,是容易发现
代码被替换过了的。
● 口令长度和信息论
根据传统信息论,英语的每个8-bits字母的信息熵为
1.3bits。如果口令足够长,MD5的结果就会足够随机。对
128-bits 的MD5输出来说,一个长达98个字符的口令将给
出一个随机的密匙。
(8/1.3)*(128/ = 98.46 chars
可是谁会用一个象下面这样长的口令呢?
12345678901234567890123456789012345678901235678901234567890
1234567890123456789012345678
1.3 bits 的信息熵来自于英语语法的规律性这个事
实,字母出现概率的不等造成了熵的减小。如果26个拉丁
字母出现的概率均等,信息熵将会增至
log(26)/log(2) = 4.7 bits
这样一个随机密匙所需口令长度就减为 27.23 chars
了,如果再加上大小写和几个符号还可以减少。关于选择
口令的问题可以参考任何关于安全性的书籍,它们都适
用,上面是关于PGP本身特色的部分。
◎ 随机数的安全性问题
PGP使用两个伪随机数发生器(PRNG),一个是ANSI
X9.17发生器,另一个是从用户击键的时间和序列中计算
熵值从而引入随机性。ANSI X9.17 PRNG使用IDEA而不是
3DES 来产生随机数种子。Randseed.bin 文件最初是利用
用户击键信息产生的,每次加密前后都会引入新的随机
数,而且随机数种子本身也是加密存放的。
● ANSI X9.17 PRNG
官方发布的 ANSI X9.17 标准使用的是 Triple DES
作为内核,这个很容易改用IDEA实现。 X9.17 需要
randseed.bin中的 24 bytes 的随机数,PGP把其他384
bytes用来存放其他信息。X19.7 工作过程大致如下:
E() = IDEA 加密函数,使用一个可复用的密匙
(使用明文产生)。
T = 从 randseed.bin 文件中来的时间
V = 初始化向量
R = 生成的随机密匙(用来加密一次PGP明文)
R = E[E(T) XOR V]
下一次的初始化向量计算如下:
V = E[E(T) XOR R]
● 用户击键引入随机性
这是真正的随机数,没有什么好说的,只是尽量使击
键无规则就行。输入的熵越大输出的随机数的熵就越大。
● X9.17 用MD5进行预洗
所谓“洗”就是指象洗牌一样把数据打乱,加密前叫
预洗,加密后为下一次加密的准备叫后洗。PGP的日常随
机数产生器 X19.7 是用明文的MD5值来预洗的,它基于攻
击者不知道明文这样一个假设。如果攻击者知道明文他就
没有太大必要去攻击了,当然也有这种可能,不过这只是
会削弱一点PRNG的随机性罢了。下面我们将看到还有后洗
操作。
● randseed.bin 的后洗操作
后洗操作被认为是更安全的。更多的随机字节被用来
重新初始化 randseed.bin 文件,它们被用当前的随机临
时PGP密匙来加密。同样如果攻击者知道这个密匙,他就
不用攻击 randseed.bin 文件,相反他更关心
randseed.bin 文件当前的状态,因为可能从中获得下次
加密的部分信息。因此对 randseed.bin 文件的保护和公
匙环及私匙环文件同样重要。当然,如果不是密码专家这
些文件都给他也没事。
◎ PGP的密匙和口令的安全性问题
最简单的失密方式就是你让你的口令写在某处,又无
法保证除你之外没有其他人能看到。如果别人得到你的口
令和你的私匙文件,整个加密体系就无密可言了。
另一个古老的话题就是口令不要太简单,注意PGP用
的是“口令” passphase,而不是“密码”password 就
是说可以在口令中包含多个词和空格。一个老谋深算的攻
击者可能会用一本名言录来寻找你的口令。因此为了得到
好记又难猜的口令,你可以生造一些句子或者找些非常生
僻的文学篇章中的句子。我个人推荐的办法是采用一句话
中的首字母的序列,然后在其中加入几个符号,如
“.”,“-”,“;”等,长度最好大于等于8个字符,同
时也可夹杂大小写。由于有被人在旁边窥探你的击键动作
的可能,最好不用空格键,因为敲它的声音很特殊。同
样,需要手指伸得很远的数字键也可不用。例如:
从 “You can't get it without my passphase” 可以
得到“yCgi.wyp”这个口令,用穷举法试探出这个口令的
可能性微乎其微,因为它用到了大小写字母和符号。平均
要试探约 50^8 次才可能成功,以IDEA的速度,这在一般
大型计算机上也不是轻而易举的事。因此短的口令只要足
够随机,一样很安全,而且输入口令时间越短,被窥探的
可能也越小。
公匙的篡改和冒充可说是PGP的最大威胁,在《PGP简
介中》我已经讲得比较详细了,要点就是:当你用别人的
公匙时,确信它是直接从对方处得来或是由另一个可信的
人签名认证过的。确信没有人可以篡改你自己的公匙环文
件。保持你对自己密匙环文件的物理控制权,尽量存放在
自己的个人电脑里而不是一个远程的分时系统里。备份自
己的密匙环文件。
◎ 没有完全删除的文件
一般的操作系统在删除文件时都并没有彻底删除文件
的数据,当你加密明文后将明文删除,可是没有从物理上
把明文的数据清除。一些有经验的攻击者可能从你的磁盘
数据块中恢复明文。当然象碎纸机一样,也有从物理上销
毁文件的办法,它们是一些工具软件,如果没有,最简单
的办法是用无用的信息将明文文件覆盖。在PGP 后加上
-w 参数也可以达到这一目的。不过即使你覆盖了所有明
文曾占用的磁盘空间,仍然会有微小的剩磁留在磁盘上,
专用的设备可以恢复这些数据,只是一般人没有这个条
件。
对于你使用的密匙环文件同样存在这个问题,特别是
私匙环文件,直接关系到你的私匙的安全。因此除了你专
用的个人电脑,最好不要将密匙环拷入其他机器,让它们
留在软盘上或许是个安全的办法。
◎ 物理安全性
这是PGP所不能赋予你的。如果政府要调查你的话,
它蛮可以直接去物理侵犯你的隐私,就象在水门事件中一
样。而且这种攻击比密码学分析要便宜得多。PGP无法在
一个不保密的环境中保护你的未加密的明文。当然物理安
全性也包括对PGP数据的物理安全保护象防火、防水、防
雷等等,可是这都不如防人来得难办。
◎ 多用户系统下的泄密
PGP最初是为MS-DOS设计的,它假设本身在用户的直
接物理控制下。可是随着PGP的普及,多用户系统上也出
现了PGP,这样暴露明文和密匙或口令的可能就增大了。
例如:
如果你在Unix系统下在PGP的命令行中使用自己的口令,
其他用户将能用ps命令直接看到它。同样的问题在连上局
域网的MS-DOS机器上也有。我并不是说在Unix上就不能用
PGP,有人将Unix系统装在笔记本电脑上,你当然可以用
PGP而不用担心其他用户。多用户系统也有安全的,它们
禁得起所有入侵者所能获得的手段的攻击,或者是它的用
户都是可以信赖的,要不就是根本没有感兴趣的入侵者。
正如下面将要谈到的现实的PGP攻击中谈到的,在多用户
系统中泄密的风险要大得多。对此PGP作者的建议是:尽
量在一个孤立的单用户系统里使用PGP,而且保证系统处
于你的直接物理控制之下。
◎ PGP的时间标戳可靠性
PGP签名上的时间标戳是不可信的,因为任何想伪造
一个“错误”的时戳的人都可以通过修改系统时间达到目
的。而在商业上又有这种利用PGP签名的时间来确认责任
的需要,这样第三方的时间公证体系就被建立了。很明
显,只要公证方在邮件上签上标准的时间,就解决了这个
问题。实际上这个问题对于手写的签名也存在,签字时需
要一个公证人,用以证明签名的时间,数字签名也一样。
PGP作者设想的模式是让第三方提供公证服务,服务器对
每个送来的签名自动加上自己的签名后发回,同时留下一
份记录,这份记录是公开的,需要仲裁的人可以去查阅。
◎ 流量分析
虽然攻击者无法阅读密文的真实内容,但他至少可以
通过观察邮件从哪儿来、到哪儿去、邮件大小以及邮件发
送的时间等等而获得一些有用的信息,就象他可以查阅你
的长途电话费单,但是他不知道你谈话的内容一样。这就
叫流量分析。单独靠PGP是无法阻止流量分析的,借助一
些网络通讯协议可以防止这些信息的暴露,甚至可以采用
另一些加密通讯体系的协助。
◎ 现实的PGP攻击
上面所说的都是一些对一般攻击者不可能或者太费事
的攻击方法。实际上有一些“可行的”PGP攻击,它们不
是攻击PGP密码体系本身(刚才的论述证明它是牢固
的),而是PGP的实现系统。
先看被动攻击:
● 击键窥探
一种非常有效的被动攻击方法;简单地说就是记录用
户的击键从中获得口令。攻击者通过键盘记录器窥探用户
的击键序列,具体方法因不同系统而异。在DOS下的PGP实
现在这方面是最脆弱的,而且它拥有最多的键盘记录器程
序。而且攻击者甚至可以从网络上远程启动和停止记录
器,在DOS下有些引导区病毒也可以完成这一工作。目前
已经出现了至少一种Windows下的记录器,这就对基于
Windows的PGP外壳产生了威胁。对UNIX环境下的键盘记录
有点复杂,因为需要root权限,除非被攻击者是在
X-Windows环境下输入口令的,X-Windows下的记录器不用
root权限。
防止这种攻击,一句话,对工作环境要仔细检查,同
时作好私匙环文件的保存。
● 电磁泄露窥探
这很好懂,任何计算机设备尤其是显示器都有电磁泄
露,通过合适的设备可以收到目标显示器上的信息,那么
你的明文显示时就无密可言了。我这里有一个 FBI通过类
似装置监听到一个间谍的显示器和键盘信号的案例:他们
通过偷偷设置在嫌疑犯计算机里的发射器,远程接收信
号,然后通过NSA专用的FFT芯片去除噪音,完成了取证工
作。射频信号大约22MHz,在接收端加上 27KHz 的水平同
步信号和 59.94 Hz 的垂直同步信号就可以得到清晰的图
象。至于键盘用的是串行单片机通讯接口,信号更容易稳
定。
加装一个射频信号干扰器可以有效防止显示器信号泄
露。键盘信号传不远,只要没人在你计算机里安“耳朵”
就不怕泄露。
● 内存空间窥探
在UNIX这样的多用户系统中,只要有合适的权限谁都
可以检查机器的物理内存。和分解一个巨大的合数相比,
打开/dev/kmem这个系统虚存交换文件,找到用户的页
面,直接读出e,d来不是省心得多吗?
● 磁盘缓存窥探
在Windows这样的多任务操作系统中,系统有把内存
中的内容交换到磁盘的习惯,而且这些交换文件是对用户
透明的。更坏事的是,这些内容并不会很快被清除,有可
能在磁盘上保留很久。如果在网络环境中,可能连用户自
己都感觉不到,就被人偷走了这些信息。
● 报文嗅探
在网络环境下,信息是以报文的形式在线路中传输
的。如果你是通过网络远程使用PGP,那么就有可能被人
从报文传输途中监听到。如果信息是以明文的形式存放在
报文中你的口令也就被攻击者知道了。
使用一些加密联机的通讯程序,象 SSH,DESlogin
或者干脆使用有加密性能的网络协议栈(点到点或端到
端),可以防止网络嗅探的攻击。因为嗅探者要处理大量
的信息,如果不是明文,他们一般没有兴趣去研究。
再看看主动攻击:
● 特洛伊木马
木马是个古老的计谋,关于特洛伊木马应该所有人都
不陌生。我不想给它下个定义。
下面是一个虚拟的现代PGP木马:
一些精英程序员开发了一个崭新的PGP的Windows外
壳。所有新手都FTP到了一份拷贝。它工作得太棒了,有
各种按钮和滚动条,甚至它还提供了一堆WAV文件,还支
持 SoundBlaster AWE 32 的音效,因此你可以一边加密
文件一边欣赏着 16 位CD音质的音响。它占用很少的内
存,编程精练,功能强大,而且它还能截获操作系统的中
断,从而阻止它把重要信息交换到磁盘去而泄密。
了不起吧?可问题在于,这个程序里有那么几行恶
意布置的代码记录了你的口令,并且当它发现机器上装了
一个Modem,它会向Modem发出一条atm0命令(关闭Modem
的蜂鸣器),然后向天知道什么地方拨号并且传出了你的
口令.
【椭圆曲线密码算法介绍】
一种相对比较新的技术--椭圆曲线加密系统,已经逐渐被人们用做基本的数字签名系统。椭圆曲线作为数字签名的基本原理大致和RSA与DSA的功能相同,并且数字签名的产生与认证的速度要比RSA和DSA快。下面我们简单的介绍一下椭圆曲线和椭圆曲线上的密码算法。
1. 有限域上的椭圆曲线
设K表示一个有限域,E是域K上的椭圆曲线,则E是一个点的集合:
E/K = { ( x, y | y2+ a1xy + a3y = x3 + a2x2 + a4x + a6,
a1, a3, a2, a4, a6 x, y K } { O } 其中O表示无穷远点。
在E上定义‘+’运算,P + Q = R,R是过P、Q的直线与曲线的另一交点关于x轴的对称点,当P = Q时R是P点的切线与曲线的另一交点关于x轴的对称点。这样,( E, + 构成可换群( Abel群),O是加法单位元(零元)。
椭圆曲线离散对数问题(ECDLP)定义如下:给定定义在K上的椭圆曲线E,一个n阶的点P E/K,和点Q E/ K,如果存在l,确定整数l, 0 l n - 1, Q = lP。我们知道,RSA是基于因子分解,其算法的核心就是如何寻找大叔的因子分解,但ECDLP是比因子分解难得多的问题。
椭圆曲线上的加法: P + Q = R
椭圆曲线上一点的2倍: P + P = R.
2. 椭圆曲线上的密码算法
基于该难题,1985年N.Koblitz和Miller提出将椭圆曲线用于密码算法,分别利用有限域上椭圆曲线的点构成的群实现了离散对数密码算法。在《数字签名分析和实现》中详细地介绍过的DSA算法,被广泛应用在椭圆曲线上的变化,称为椭圆曲线数字签名算法ECDSA,由IEEE工作组和ANSI(Amercian National Standards Institute)X9组织开发。随即展开了椭圆曲线密码学研究,除椭圆曲线外,还有人提出在其它类型的曲线如超椭圆曲线上实现公钥密码算法。其根据是有限域上的椭圆曲线上的点群中的离散对数问题ECDLP。ECDLP是比因子分解问题更难的问题,许多密码专家认为它是指数级的难度。从目前已知的最好求解算法来看,160比特的椭圆曲线密码算法的安全性相当于1024比特的RSA算法。
此后,有人在椭圆曲线上实现了类似ElGamal的加密算法,以及可恢复明文的数字签名方案。除有限域上的椭圆曲线密码算法外,人们还探索了在椭圆曲线上实现RSA算法,如KMOV等。
3.椭圆曲线密码算法的发展
RSA算法是大家熟悉的公钥密码算法,用它可以实现数字签名,PGP软件用到的就是RSA算法。RSA算法是基于大数的因子分解难题,由于计算水平的提高,人们逐渐可以用计算机分解更大的数。因此RSA算法的密钥也就越来越长。在电子商务的SET协议中,规定用户使用1024比特的RSA密钥,认证中心CA使用2048比特的RSA密钥。长密钥带来两个问题,一是运算速度较慢,另一个是密钥存储和管理问题。如果用16位的IC卡实现电子钱包,使用1024比特的RSA算法速度就很慢,要以秒计算。而固化RSA算法的IC卡或32位的IC卡价格则较贵。
椭圆曲线加密系统由很多依赖于离散算法问题的加密系统组成,DSA就是一个很好的例子,DSA是以离散对数为基础的算法。椭圆曲线数字签名系统已经被研究了很多年并创造了很多商业价值。
由于其自身优点,椭圆曲线密码学一出现便受到关注。现在密码学界普遍认为它将替代RSA成为通用的公钥密码算法,SET( Secure Electronic Transactions 协议的制定者已把它作为下一代SET协议中缺省的公钥密码算法,目前已成为研究的热点,是很有前途的研究方向。
应用椭圆曲线的数字签名同时可以很容易地使用到小的有限资源的设备中例如:小卡(信用卡大小的包含有微小处理芯片的塑料卡片)。椭圆曲线上的密码算法速度很快,分别在32位的PC机上和16位微处理器上实现了快速的椭圆曲线密码算法,其中16位微处理器上的EDSA数字签名不足500ms。
【数字签名算法分析与Hash签名】
序:这篇文章我用了近一周的时间完成,其中涉及到的RSA算法已经在上一篇《公钥密码体系》中详细的介绍过,目前数字签名中人们使用很多的还是512位与1024位的RSA算法。
摘要: 数字签字和认证机构是电子商务的核心技术。数字签名作为目前Internet中电子商务重要的技术,不断地进行改进,标准化。本文从数字签名的意义出发,详细介绍了数字签名中涉及到的内容与算法,并自行结合进行改进。
关键词:Internet 公钥加密 Hash函数 电子商务 加密 数字签名
数字签名简介
我们对加解密算法已经有了一定理解,可以进一步讨论"数字签名"(注意不要与数字认证混淆)的问题了,即如何给一个计算机文件进行签字。数字签字可以用对称算法实现,也可以用公钥算法实现。但前者除了文件签字者和文件接受者双方,还需要第三方认证,较麻烦;通过公钥加密算法的实现方法,由于用秘密密钥加密的文件,需要靠公开密钥来解密,因此这可以作为数字签名,签名者用秘密密钥加密一个签名(可以包括姓名、证件号码、短信息等信息),接收人可以用公开的、自己的公开密钥来解密,如果成功,就能确保信息来自该公开密钥的所有人。
公钥密码体制实现数字签名的基本原理很简单,假设A要发送一个电子文件给B,A、B双方只需经过下面三个步骤即可:
1. A用其私钥加密文件,这便是签字过程
2. A将加密的文件送到B
3. B用A的公钥解开A送来的文件
这样的签名方法是符合可靠性原则的。即:
签字是可以被确认的,
签字是无法被伪造的,
签字是无法重复使用的,
文件被签字以后是无法被篡改的,
签字具有无可否认性,
数字签名就是通过一个单向函数对要传送的报文进行处理得到的用以认证报文来源并核实报文是否发生变化的一个字母数字串。用这几个字符串来代替书写签名或印章,起到与书写签名或印章同样的法律效用。国际社会已开始制定相应的法律、法规,把数字签名作为执法的依据。
数字签名的实现方法
实现数字签名有很多方法,目前数字签名采用较多的是公钥加密技术,如基于RSA Data Security公司的PKCS(Public Key Cryptography Standards)、DSA(Digital Signature Algorithm)、x.509、PGP(Pretty Good Privacy)。1994年美国标准与技术协会公布了数字签名标准(DSS)而使公钥加密技术广泛应用。同时应用散列算法(Hash)也是实现数字签名的一种方法。
非对称密钥密码算法进行数字签名
算法的含义:
非对称密钥密码算法使用两个密钥:公开密钥和私有密钥,分别用于对数据的加密和解密,即如果用公开密钥对数据进行加密,只有用对应的私有密钥才能进行解密;如果用私有密钥对数据进行加密,则只有用对应的公开密钥才能解密。
使用公钥密码算法进行数字签名通用的加密标准有: RSA,DSA,Diffie-Hellman等。
签名和验证过程:
发送方(甲)首先用公开的单向函数对报文进行一次变换,得到数字签名,然后利用私有密钥对数字签名进行加密后附在报文之后一同发出。
接收方(乙)用发送方的公开密钥对数字签名进行解密交换,得到一个数字签名的明文。发送方的公钥可以由一个可信赖的技术管理机构即认证中心(CA)发布的。
接收方将得到的明文通过单向函数进行计算,同样得到一个数字签名,再将两个数字签名进行对比,如果相同,则证明签名有效,否则无效。
这种方法使任何拥有发送方公开密钥的人都可以验证数字签名的正确性。由于发送方私有密钥的保密性,使得接受方既可以根据结果来拒收该报文,也能使其无法伪造报文签名及对报文进行修改,原因是数字签名是对整个报文进行的,是一组代表报文特征的定长代码,同一个人对不同的报文将产生不同的数字签名。这就解决了银行通过网络传送一张支票,而接收方可能对支票数额进行改动的问题,也避免了发送方逃避责任的可能性。
对称密钥密码算法进行数字签名
算法含义
对称密钥密码算法所用的加密密钥和解密密钥通常是相同的,即使不同也可以很容易地由其中的任意一个推导出另一个。在此算法中,加、解密双方所用的密钥都要保守秘密。由于计算机速度而广泛应用于大量数据如文件的加密过程中,如RD4和DES,用IDEA作数字签名是不提倡的。
使用分组密码算法数字签名通用的加密标准有:DES,Tripl-DES,RC2,RC4,CAST等。
签名和验证过程
Lamport发明了称为Lamport-Diffle的对称算法:利用一组长度是报文的比特数(n)两倍的密钥A,来产生对签名的验证信息,即随机选择2n个数B,由签名密钥对这2n个数B进行一次加密交换,得到另一组2n个数C。
发送方从报文分组M的第一位开始,依次检查M的第I位,若为0时,取密钥A的第i位,若为1则取密钥A的第i+1位;直至报文全部检查完毕。所选取的n个密钥位形成了最后的签名。
接受方对签名进行验证时,也是首先从第一位开始依次检查报文M,如果M的第i位为0时,它就认为签名中的第i组信息是密钥A的第i位,若为1则为密钥A的第i+1位;直至报文全部验证完毕后,就得到了n个密钥,由于接受方具有发送方的验证信息C,所以可以利用得到的n个密钥检验验证信息,从而确认报文是否是由发送方所发送。
这种方法由于它是逐位进行签名的,只有有一位被改动过,接受方就得不到正确的数字签名,因此其安全性较好,其缺点是:签名太长(对报文先进行压缩再签名,可以减少签名的长度);签名密钥及相应的验证信息不能重复使用,否则极不安全。
结合对称与非对称算法的改进
对称算法与非对称算法各有利弊,所以结合各自的优缺点进行改进,可以用下面的模块进行说明:
Hash算法进行数字签名
Hash算法也称作散列算法或报文摘要,Hash算法将在数字签名算法中详细说明。
Hash算法数字签字通用的加密标准有: SHA-1,MD5等。
数字签名算法
数字签名的算法很多,应用最为广泛的三种是: Hash签名、DSS签名、RSA签名。这三种算法可单独使用,也可综合在一起使用。数字签名是通过密码算法对数据进行加、解密变换实现的,常用的HASH算法有MD2、MD5、SHA-1,用DES算法、RSA算法都可实现数字签名。但或多或少都有缺陷,或者没有成熟的标准。
Hash签名
Hash签名是最主要的数字签名方法,也称之为数字摘要法(digital digest)、数字指纹法(digital finger print)。它与RSA数字签名是单独的签名不同,该数字签名方法是将数字签名与要发送的信息紧密联系在一起,它更适合于电子商务活动。将一个商务合同的个体内容与签名结合在一起,比合同和签名分开传递,更增加了可信度和安全性。下面我们将详细介绍Hash签名中的函数与算法。
单向函数
单向函数的概念是公开密钥密码的核心。尽管它本身并不是一个协议,但对大多数协议来说却是一个基本结构模块。
单向函数的概念是计算起来相对容易,但求逆却非常困难。也就是说,已知x,我们很容易计算f(x)。但已知f(x),却难于计算出x。在这里,"难"定义成:即使世界上所有的计算机都用来计算,从f(x)计算出x也要花费数百万年的时间。
打碎盘子就是一个很好的单向函数的例子。把盘子打碎成数千片碎片是很容易的事情,然而,要把所有这些碎片再拼成为一个完整的盘子,却是非常困难的事情。
这听起来很好,但事实上却不能证实它的真实性。如果严格地按数学定义,我们不能证明单向函数的存在性,同时也还没有实际的证据能够构造出单向函数。即使这样,还是有很多函数看起来和感觉像单向函数:我们能够有效地计算它们,且至今还不知道有什么办法能容易地求出它们的逆。例如,在有限域中x2是很容易计算的,但计算x1/2却难得多。所以我们假定也尽量构造单向函数存在。
陷门单向函数是有一个秘密陷门的一类特殊单向函数。它在一个方向上易于计算而反方向却难于计算。但是,如果你知道那个秘密,你也能很容易在另一个方向计算这个函数。也就是说, 已知x,易于计算f(x),而已知f(x),却难于计算x。然而,有一些秘密信息y,一旦给出f(x)和y,就很容易计算x。
拆开表是很好的单向陷门函数的例子。很容易把表拆成数百片小片,把这些小片组装成能够工作的表是非常困难的。然而,通过秘密信息(表的装配指令),就很容易把表还原。
单向Hash函数
单向Hash函数有很多名字:压缩函数、缩短函数、消息摘要、指纹、密码校验和、信息完整性检验(DIC)、操作检验码(MDC)。不管你怎么叫,它是现代密码学的中心。单向Hash函数是许多协议的另一个结构模块。
Hash函数长期以来一直在计算机科学中使用,无论从数学上或别的角度看,Hash函数就是把可变输入长度串(叫做预映射,Pre-image)转换成固定长度(经常更短)输出串(叫做hash值)的一种函数。简单的Hash函数就是对预映射的处理,并且返回由所有输入字节异或组成的一字节。
这儿的关键就是采集预映射的指纹:产生一个值,这个值能够指出候选预映射是否与真实的预映射有相同的值。因为Hash函数是典型的多到一的函数,我们不能用它们来确定两个串一定相同,但我们可用它来得到准确性的合理保证。
单向Hash函数是在一个方向上工作的Hash函数,从预映射的值很容易计算其Hash值,但要产生一个预映射的值使其Hash值等于一个特殊值却是很难的。好的hash函数也是无冲突的:难于产生两个预映射的值,使他们的hash值相同。
Hash函数是公开的,对处理过程不用保密。单向hash函数的安全性是它的单向性。无论怎么看,输出不依赖于输入。预映射单个比特的改变,平均而言,将引起hash值中一半的比特改变。已知一个hash值,要找到预映射的值,使它的hash值等于已知的hash值在计算上是不可行的。
哈希函数,即对于任意长度的信息m,经过哈希函数运算后,压缩后固定长度的数,比如64比特HASH函数的特殊要求是:
1. 已知哈希函数的输出,要求它的输入是困难的,即已知c=Hash(m),求m是困难的。这表现了函数的单向性。
2. 已知m,计算Hash(m)是容易的。这表现了函数的快速性。
3. 已知,构造m2使Hash(m2)=c1是困难的。这是函数的抗碰撞性。
4. c=Hash(m),c的每一比特都与m的每一比特有关,并有高度敏感性。即每改变m的一比特,都将对c产生明显影响。这就是函数的雪崩性。
5. 作为一种数字签名,还要求哈希函数除了信息m自身之外,应该基于发信方的秘密信息对信息m进行确认。
6. 接受的输入m数据没有长度限制;对输入任何长度的m数据能够生成该输入报文固定长度的输出;
曾有数家统计计算结果表明,如hash(m)的长度为128位(bit)时,则任意两个分别为M1.M2的输入报文具有完全相同的h(m)的概率为10-24,即近于零的重复概率。它较人类指纹的重复概率10-19还要小5个数量级。而当我们取hash(m)为384(bit)乃至1024(bit)时,则更是不大可能重复了。
另外,如输入报文M1与输入报文M2全等,则有h(m1)与h(m2)全等,如只将M2或M1中的某任意一位(bit)改变了,其结果将导致h(m1)与h(m2)中有一半左右对应的位(bit)的值都不相同了。这种发散特性使电子数字签名很容易发现(验证签名)输入报文的关键位的值被人篡改了。
数字摘要(digitaldigest)加密方法亦称安全Hash编码法(SHA:SecureHashAlgorithm)或MD5(MDstandardforMessageDigest),由RonRivest设计。该编码法采用单向Hash函数将需加密的明文"摘要"成一串128bit的密文,这一串密文亦称为数字指纹(FingerPrint),它有固定的长度,且不同的明文摘要必定一致。这样这串摘要使可成为验证明文是否是"真身"的"指纹"了。
Hash签名不属于强计算密集型算法,应用较广泛。很多少量现金付款系统,如DEC的Millicent和CyberCash的CyberCoin等都使用Hash签名。使用较快的算法,可以降低服务器资源的消耗,减轻中央服务器的负荷。Hash的主要局限是接收方必须持有用户密钥的副本以检验签名, 因为双方都知道生成签名的密钥,较容易攻破,存在伪造签名的可能。如果中央或用户计算机中有一个被攻破,那么其安全性就受到了威胁。
DSS和RSA签名
DSS和RSA采用了公钥算法。
Digital Signature Algorithm(DSA)是Schnorr和ElGamal签名算法的变种,被美国NIST作为DSS(Digital SignatureStandard)数字签名标准。DSS是由美国国家标准化研究院和国家安全局共同开发的。由于它是由美国政府颁布实施的,主要用于与美国政府做生意的公司,其他公司则较少使用,它只是一个签名系统,而且美国政府不提倡使用任何削弱政府窃听能力的加密软件,认为这才符合美国的国家利益。算法中应用了下述参数:
p:L bits长的素数。L是64的倍数,范围是512到1024;
q:是p - 1的160bits的素因子;
g:g = h^((p-1)/q) mod p,h满足h < p - 1, h^((p-1)/q) mod p > 1;
x:秘密密钥,正整数,x < q;
y:y = g^x mod p ,( p, q, g, y 为公钥;
k为随机数,0〈k〈q;
H( x :One-Way Hash函数。
DSS中选用SHA( Secure Hash Algorithm 。 p, q, g可由一组用户共享,但在实际应用中,使用公共模数可能会带来一定的威胁。 签名过程如下:
1. P产生随机数k,k < q;
2. P计算 r = ( g^k mod p mod q
s = ( k^(-1) (H(m) + xr)) mod q
验证过程: 签名结果是( m, r, s 。
3. 验证时计算 w = s^(-1)mod q
u1 = ( H( m * w mod q
u2 = ( r * w mod q
v = (( g^u1 * y^u2 mod p mod q
若v = r,则认为签名有效。
DSA位数仅为160位,没有太大的意义,也存在系统平台不兼容的问题,而且DSA是基于整数有限域离散对数难题的,安全强度和速度均低于RSA算法。DSA的一个重要特点是两个素数公开,这样,当使用别人的p和q时,即使不知道私钥,你也能确认它们是否是随机产生的,还是作了手脚。RSA算法却作不到。DSA算法的安全性也依赖于有限域上的离散对数问题,其优点是不涉及专利问题。
其中H(x)可选择美国推荐的标准算法SHA或MD5等安全散列算法。其中MD5算法在本论坛中已有介绍。
RSA是最流行的一种加密标准,许多产品的内核中都有RSA的软件和类库,早在Web飞速发展之前,RSA数据安全公司就负责数字签名软件与Macintosh操作系统的集成,在Apple的协作软件PowerTalk上还增加了签名拖放功能,用户只要把需要加密的数据拖到相应的图标上,就完成了电子形式的数字签名。RSA与Microsoft、IBM、Sun和Digital都签订了许可协议,使在其生产线上加入了类似的签名特性。与DSS不同,RSA既可以用来加密数据,也可以用于身份认证。和Hash签名相比,在公钥系统中,由于生成签名的密钥只存储于用户的计算机中,安全系数大一些。
用RSA或其它公开密匙密码算法进行数字签名的最大方便是没有密匙分配问题(网络越复杂、网络用户越多,其优点越明显)。因为公开密匙加密使用两个不同的密匙,其中有一个是公开的,另一个是保密的。公开密匙可以保存在系统目录内、未加密的电子邮件信息中、电话黄页(商业电话)上或公告牌里,网上的任何用户都可获得公开密匙。而保密密匙是用户专用的,由用户本身持有,它可以对由公开密匙加密信息进行解密。
RSA算法中数字签名技术实际上是通过一个哈希函数来实现的。数字签名的特点是它代表了文件的特征,文件如果发生改变,数字签名的值也将发生变化。不同的文件将得到不同的数字签名。一个最简单的哈希函数是把文件的二进制码相累加,取最后的若干位。哈希函数对发送数据的双方都是公开的。
下面用一个典型的应用公钥密码体制的模块流程图来说明数字签名的过程:
?
我们认为RSA算法是目前比较好的密码算法,它不仅可以作为加密算法使用,而且可以用作数字签名和密钥分配与管理,而DSA只适合作签名,且安全强度和速度都不如RSA,椭圆曲线上的公开密钥密码系统安全强度依赖于曲线的选择和体制,我们相信它会有更高的安全强度,目前200比特长的椭圆曲线密码体制已经有相当高的安全强度。
数字签名的保密性
数字签名的保密性很大程度上依赖于公开密钥。
数字签名的加密解密过程和秘密密钥的加密解密过程虽然都使用公开密钥体系,但实现的过程正好相反,使用的密钥对也不同。数字签名使用的是发送方的密钥对,发送方用自己的私有密钥进行加密,接收方用发送方的公开密钥进行解密。这是一个一对多的关系:任何拥有发送方公开窃钥的人都可以验证数字签名的正确性,而秘密密钥的加密解密则使用的是接收方的密切对,这是多对一的关系:任何知道接收方公开密钥的人都可以向接收方发送加密信息,只有唯一拥有接收方私有密钥的人才能对信息解密。这是一个复杂但又很有趣的过程。在实用过程中,通常一个用户拥有两个密钥对一一一个密钥对用来对数字签名进行加密解密,一个密钥对用来对秘密密钥进行加密解密。这种方式提供了更高的安全性。
又由于加密钥匙是公开的,密钥的分配和管理就很简单,而且能够很容易地实现数字签名。因此,最适合于电子商务应用需要。在实际应用中,公开密钥加密系统并没有完全取代秘密钥匙加密系统,这是因为公开密钥加密系统是基于尖端的数学难题,计算非常复杂,它的速度远赶不秘密钥匙加密系统。因此,在实际应用中可利用二者的各自优点,采用秘密钥匙加密系统加密文件,采用公开密钥加密系统加密"加密文件"的密钥,这就是混合加密系统,它较好地解决了运算速度问题和密钥分配管理问题。
数字签名中的问题与改进
以上数字签字的方法是相当简单和理想化的,具体应用中还是有一些问题需要解决的。
1. 签字后的文件可能被接收方重复使用。如果签字后的文件是一张支票,接收方很容易多次用该电子支票兑换现金,为此发送方需要在文件中加上一些该支票的特有的凭证,如时间戳timestamp(但时间戳会有一个时间是否同步的问题)等,以防止上述情况发生。
2. 数字签名应用很多的RSA算法是基于大数的因子分解难题,由于计算水平的提高,人们逐渐可以用计算机分解更大的数。因此RSA算法的密钥也就越来越长,诸位使用PGP时至少要选择700比特以上的密钥。在电子商务的SET协议中,规定用户使用1024比特的RSA密钥,认证中心CA使用2048比特的RSA密钥。长密钥带来两个问题,一是运算速度较慢,另一个是密钥存储和管理问题。如果用16位的IC卡实现电子钱包,使用1024比特的RSA算法速度就很慢,要以秒计算。而固化RSA算法的IC卡或32位的IC卡价格则较贵。
3. 公钥算法的效率是相当低的,不易用于长文件的加密,为此我们采用Hash函数,将原文件P通过一个单向(one-way)的Hash函数作用,生成相当短的(仅几十或几百bits)的输出H,即Hash(P)=H,这里由P可以很快生成H,但由于H几乎不可能生成P,然后再将公钥算法作用在H上生成"签字"S,记为Ek1(H)=S,k1为A的公钥,A将(P,S)传给B,B收到(P,S)后,需要验证S是A的签字。 若我们有H1=H2,即Dk2(S)=Hash(P),我们才能认为S就是A的签字。
4. 如果在Hash签名使用一个密钥k,让只有知道此密钥k的人才能使用hash,即用H(m,k)代替H(m),则可以增强Hash加密的安全性。 以上方法实际上就是把签字过程从对原文件转移到一个很短的hash值上,大大地提高了效率,可以在现代的电子商务中被广泛的使用。
数字签名的发展方向
2000年1月举行的第六届国际密码学会议对应用于公开钥密码系统的加密算法,推荐了两种:基于大整数因子分解难题的RSA算法和基于椭圆曲线上离散对数计算难题的ECC算法。所以基于RSA算法的数字签名还有一定的发展。
对于未来的加密、生成和验证数字签名的工具需要完善,只有用SSL(安全套接层)建立安全链接的Web浏览器,才会频繁使用数字签名,公司要对其雇员在网络上的行为进行规范,就要建立广泛协作机制来支持数字签名,支持数字签名是Web发展的目标,确保数据保密性、数据完整性和不可否认性才能保证在线商业的安全交易。
和数字签名有关的复杂认证能力就像现在操作、应用环境中的口令保护一样直接做进操作系统环境、应用、远程访问产品、信息传递系统及Internet防火墙中,像Netscape 支持X.509标准的Communicator 4.0 Web客户机软件;Microsoft支持X.509的Internet Explorer 4.0客户机软件及支持对象签名检查的Java虚拟机等。
数字签名的前景与专家的担忧
数字签名作为电子商务的应用技术,越来越得到人们的重视,其中它涉及到的关键技术也很多,并且很多新的协议,如网上交易安全协议SSL、SET协议都会涉及到数字签名,究竟使用哪种算法,哪种Hash函数,以及数字签名管理、在通信实体与可能有的第三方之间使用协议等等问题都可以作为新的课题。
同时,数字签名也带来专家们的担忧,一位技术专家警告:运用越来越广泛的网络安全技术数字签名,今后很可能导致毫无私密可言。在伦敦组织的国际监控论坛上,高级译码专家Dr Stefan Brands在其发言中警告:数字签名将扩大政府跟踪和身份盗用的可能性。数字签名是为互联网用户提供的受密钥保护的唯一身份证明,该密钥向第三方证明文件、信息或交易对象的真实身份。虽然数字签名能打消很多客户的疑虑,Brand相信数字签名同时也引发了"自由"问题。
Brands博士警告,今后,数字签名使政府很容易跟踪网络用户的在线活动。Brand说:"这些标识符号只会越来越危险,你所做的每一件事都能被自动跟踪。相信不久以后这些标识你身份的符号就象安装在你身上的一个类似电话和监视器的计算机。"
数字签名的前景越来越广阔,而由此引发的问题也越来越发人深思......
【公开密钥体系】
公开密钥密码体制是现代密码学的最重要的发明和进展。一般理解密码学(Cryptography)就是保护信息传递的机密性。但这仅仅是当今密码学主题的一个方面。对信息发送与接收人的真实身份的验证、对所发出/接收信息在事后的不可抵赖以及保障数据的完整性是现代密码学主题的另一方面。公开密钥密码体制对这两方面的问题都给出了出色的解答,并正在继续产生许多新的思想和方案。在公钥体制中,加密密钥不同于解密密钥。人们将加密密钥公之于众,谁都可以使用;而解密密钥只有解密人自己知道。迄今为止的所有公钥密码体系中,RSA系统是最著名、使用最广泛的一种。
1976年提出公共密钥密码体制,其原理是加密密钥和解密密钥分离。这样,一个具体用户就可以将自己设计的加密密钥和算法公诸于众,而只保密解密密钥。任何人利用这个加密密钥和算法向该用户发送的加密信息,该用户均可以将之还原。公共密钥密码的优点是不需要经安全渠道传递密钥,大大简化了密钥管理。它的算法有时也称为公开密钥算法或简称为公钥算法。
1978年提出公共密钥密码的具体实施方案,即RSA方案。
1991年提出的DSA算法也是一种公共密钥算法,在数字签名方面有较大的应用优势。
公钥体系结构中的概念
公钥体系结构中的一些基本概念与结构组成。
密钥对
在基于公钥体系的安全系统中,密钥是成对生成的,每对密钥由一个公钥和一个私钥组成。在实际应用中,私钥由拥有者自己保存,而公钥则需要公布于众。为了使基于公钥体系的业务(如电子商务等)能够广泛应用,一个基础性关键的问题就是公钥的分发与管理。
公钥本身并没有什么标记,仅从公钥本身不能判别公钥的主人是谁。
在很小的范围内,比如A和B这样的两人小集体,他们之间相互信任,交换公钥,在互联网上通讯,没有什么问题。这个集体再稍大一点,也许彼此信任也不成问题,但从法律角度讲这种信任也是有问题的。如再大一点,信任问题就成了一个大问题。
证书
互联网络的用户群决不是几个人互相信任的小集体,在这个用户群中,从法律角度讲用户彼此之间都不能轻易信任。所以公钥加密体系采取了另一个办法,将公钥和公钥的主人名字联系在一起,再请一个大家都信得过有信誉的公正、权威机构确认,并加上这个权威机构的签名。这就形成了证书。
由于证书上有权威机构的签字,所以大家都认为证书上的内容是可信任的;又由于证书上有主人的名字等身份信息,别人就很容易地知道公钥的主人是谁。
CA(Certificate Authority)
前面提及的权威机构就是电子签证机关(即CA)。CA也拥有一个证书(内含公钥),当然,它也有自己的私钥,所以它有签字的能力。网上的公众用户通过验证CA的签字从而信任CA,任何人都应该可以得到CA的证书(含公钥),用以验证它所签发的证书。
如果用户想得到一份属于自己的证书,他应先向CA提出申请。在CA判明申请者的身份后,便为他分配一个公钥,并且CA将该公钥与申请者的身份信息绑在一起,并为之签字后,便形成证书发给那个用户(申请者)。
如果一个用户想鉴别另一个证书的真伪,他就用CA的公钥对那个证书上的签字进行验证(如前所述,CA签字实际上是经过CA私钥加密的信息,签字验证的过程还伴随使用CA公钥解密的过程),一旦验证通过,该证书就被认为是有效的。
CA除了签发证书之外,它的另一个重要作用是证书和密钥的管理。
由此可见,证书就是用户在网上的电子个人身份证,同日常生活中使用的个人身份证作用一样。CA相当于网上公安局,专门发放、验证身份证。
公开密钥算法-RSA
RSA简述
公开密钥算法是在1976年由当时在美国斯坦福大学的迪菲(Diffie)和赫尔曼(Hellman)两人首先发明的(论文"New Direction in Cryptography")。但目前最流行的RSA是1977年由MIT教授Ronald L.Rivest,Adi Shamir和Leonard M.Adleman共同开发的,分别取自三名数学家的名字的第一个字母来构成的。
1976年提出的公开密钥密码体制思想不同于传统的对称密钥密码体制,它要求密钥成对出现,一个为加密密钥(e),另一个为解密密钥(d),且不可能从其中一个推导出另一个。自1976年以来,已经提出了多种公开密钥密码算法,其中许多是不安全的, 一些认为是安全的算法又有许多是不实用的,它们要么是密钥太大,要么密文扩展十分严重。多数密码算法的安全基础是基于一些数学难题, 这些难题专家们认为在短期内不可能得到解决。因为一些问题(如因子分解问题)至今已有数千年的历史了。
公钥加密算法也称非对称密钥算法,用两对密钥:一个公共密钥和一个专用密钥。用户要保障专用密钥的安全;公共密钥则可以发布出去。公共密钥与专用密钥是有紧密关系的,用公共密钥加密的信息只能用专用密钥解密,反之亦然。由于公钥算法不需要联机密钥服务器,密钥分配协议简单,所以极大简化了密钥管理。除加密功能外,公钥系统还可以提供数字签名。
公钥加密算法中使用最广的是RSA。RSA使用两个密钥,一个公共密钥,一个专用密钥。如用其中一个加密,则可用另一个解密,密钥长度从40到2048bit可变,加密时也把明文分成块,块的大小可变,但不能超过密钥的长度,RSA算法把每一块明文转化为与密钥长度相同的密文块。密钥越长,加密效果越好,但加密解密的开销也大,所以要在安全与性能之间折衷考虑,一般64位是较合适的。RSA的一个比较知名的应用是SSL,在美国和加拿大SSL用128位RSA算法,由于出口限制,在其它地区(包括中国)通用的则是40位版本。
RSA算法研制的最初理念与目标是努力使互联网安全可靠,旨在解决DES算法秘密密钥的利用公开信道传输分发的难题。而实际结果不但很好地解决了这个难题;还可利用RSA来完成对电文的数字签名以抗对电文的否认与抵赖;同时还可以利用数字签名较容易地发现攻击者对电文的非法篡改,以保护数据信息的完整性。
通常信息安全的目标可以概括为解决信息的以下问题:
保密性(Confidentiality)保证信息不泄露给未经授权的任何人。
完整性(Integrity)防止信息被未经授权的人篡改。
可用性(Availability)保证信息和信息系统确实为授权者所用。
可控性(Controllability)对信息和信息系统实施安全监控,防止非法利用信息和信息系统。
密码是实现一种变换,利用密码变换保护信息秘密是密码的最原始的能力,然而,随着信息和信息技术发展起来的现代密码学,不仅被用于解决信息的保密性,而且也用于解决信息的完整性、可用性和可控性。可以说,密码是解决信息安全的最有效手段,密码技术是解决信息安全的核心技术。
公用密钥的优点就在于,也许你并不认识某一实体,但只要你的服务器认为该实体的CA是可靠的,就可以进行安全通信,而这正是Web商务这样的业务所要求的。例如信用卡购物。服务方对自己的资源可根据客户CA的发行机构的可靠程度来授权。目前国内外尚没有可以被广泛信赖的CA。美国Natescape公司的产品支持公用密钥,但把Natescape公司作为CA。由外国公司充当CA在我国是一件不可想象的事情。
公共密钥方案较保密密钥方案处理速度慢,因此,通常把公共密钥与专用密钥技术结合起来实现最佳性能。即用公共密钥技术在通信双方之间传送专用密钥,而用专用密钥来对实际传输的数据加密解密。另外,公钥加密也用来对专用密钥进行加密。
在这些安全实用的算法中,有些适用于密钥分配,有些可作为加密算法,还有些仅用于数字签名。多数算法需要大数运算,所以实现速度很慢,不能用于快的数据加密。以下将介绍典型的公开密钥密码算法-RSA。
RSA算法很好的完成对电文的数字签名以抗对数据的否认与抵赖;利用数字签名较容易地发现攻击者对电文的非法篡改,以保护数据信息的完整性。目前为止,很多种加密技术采用了RSA算法,比如PGP(PrettyGoodPrivacy)加密系统,它是一个工具软件,向认证中心注册后就可以用它对文件进行加解密或数字签名,PGP所采用的就是RSA算法。由此可以看出RSA有很好的应用。
RSA算法
1978年就出现的RSA算法,是第一个既能用于数据加密也能用于数字签名的算法。
RSA是一种公开密匙机理的加密算法。所谓公开密匙,就是每个用户拥有两个密码,一个公开(e),一个保密(d)。对明文加密,可以使用其中任一密码,但解密必须使用另一个密码。加密/ 解密算法是公开的,但是算法是不可逆的。
密钥的产生
1. 选择两个大素数,p 和q 。
2. 计算: n = p * q (p,q分别为两个互异的大素数,p,q 必须保密,一般要求p,q为安全素数,n的长度大于512bit ,这主要是因为RSA算法的安全性依赖于因子分解大数问题)。有欧拉函数 (n)=(p-1)(q-1)。
3. 然后随机选择加密密钥e,要求 e 和 ( p - 1 * ( q - 1 互质。
4. 最后,利用Euclid 算法计算解密密钥d, 满足de≡1(mod φ(n))。其中n和d也要互质。数e和n是公钥,d是私钥。两个素数p和q不再需要,应该丢弃,不要让任何人知道。
加密与解密
1. 加密信息 m(二进制表示)时,首先把m分成等长数据块 m1 ,m2,..., mi ,块长s,其中 2^s <= n, s 尽可能的大。
2. 对应的密文是:ci ≡mi^e ( mod n ( a
3. 解密时作如下计算:mi ≡ci^d ( mod n ( b RSA 可用于数字签名,方案是用 ( a 式签名, ( b 式验证。具体操作时考虑到安全性和 m信息量较大等因素,一般是先作 HASH 运算。
验证质数算法
想直接求一大质数是困难的,所以最好是随机选取一个大数,再来验证它是否质数。而完全验证它是否质数运算量也狠大,这里可以采用下面的方法:
如果想验证 n是否是质数:
1. 检查 n 是否能被较小的质数整除。
2. 从 { 1,2,3,4...,n-1 } 中随机选取 a
3. 测试 a,n 是否互质(辗转相除法)。且 J(a,n)-a^((n-1)/2)是否能被 n整除。这两个条件只要有一个满足,n 肯定是一合数。否则,n 是质数的概率就在1/2 以上。
附: / 1 (a=1)
J(a,n)={ J(a/2,n)*(-1)^(n^2-1)/ (a为偶数)
/ J(n mod a,a)*(-1)^((a-1)(n-1)/4) (a为其它数)
如果反复 2,3步 XXX 次,n 是质数的可能性就极大了。
由于计算机产生的是伪随机数,所以建议在多次取随机数时,多安插几次等待按键,然后用时间作种子对随机函数初始化。
关于强质数及其获得
因为幂剩余函数具有特殊的周期性,反复运算M=(C^d) mod n t 次后,将还原为最初的 M。早期的RSA 算法就曾被人用这种方法破译。所以在生成密匙时,应采用"强质数",使 t足够大。
所谓强质数 p,满足:
1. p 是个位数足够大的随机质数
2. p-1 含有一个大的质数因子 r
3. p+1 含有一个大的质数因子
4. r-1 含有一个大的质数因子 t
强质数的获得:
1. 选择两个指定长度的奇数 a,b
2. 在 a 附近产生随机质数 s ,在 b 附近产生随机质数 t
3. 由 t 产生质数 r。 (1) r=1+2t (2) 若 r 非质数,则 r=r+2t 直到 r 是质数
4. 由 r,s 生成 p (1) p=(s^(r-1)-r^(s-1)) mod (r*s) (2) 若 p 为偶数,则 p=p+r*s (3) p=p+2rs 直到 p 是质数
5. 高次幂的求模算法 ( C=(M^e) mod n
步骤如下: ___________________________
将 e 用2进制表示 Ek Ek-1 Ek-2 ... E1 E0 Ei∈{0,1} 0<=i<=k
C=1
for i=k to 0 C=C^2 mod n
若 Ei =1 则 C=C*(M mod n)
6. 快速解密算法:
除了直接用 M=(C^d) mod n 来计算,这里给出一个快速算法。
C 为密文,p〈q
设 C1=C mod p C2=C mod q
d1=d mod (p-1) d2=d mod (q-1)
m1=m mod p=C1^d1 mod p
m2=m mod q=C2^d2 mod q A为常数,满足 A*p-1 能被 q 整除 (0<A<q-1)
则有 M=(((m2+q-m1)*A) mod q)*p+m1
RSA的缺点
RSA的缺点主要有:A)产生密钥很麻烦,受到素数产生技术的限制,因而难以做到一次一密。B)分组长度太大,为保证安全性,n 至少也要 600 bits以上,使运算代价很高,尤其是速度较慢,较对称密码算法慢几个数量级;且随着大数分解技术的发展,这个长度还在增加,不利于数据格式的标准化。目前,SET(Secure Electronic Transaction)协议中要求CA采用2048比特长的密钥,其他实体使用1024比特的密钥。
由于进行的都是大数计算,使得RSA最快的情况也比DES慢上100倍,无论是软件还是硬件实现。速度一直是RSA的缺陷。一般来说只用于少量数据加密。
RSA 的安全性
RSA算法之所以具有安全性,是基于数论中的一个特性事实:即将两个大的质数合成一个大数很容易,而相反的过程则非常困难。在当今技术条件下,当n足够大时,为了找到d,欲从n中通过质因子分解试图找到与d对应的p、q是极其困难甚至是不可能的。由此可见,RSA的安全性是依赖于作为公钥的大数n的位数长度的。为保证足够的安全性,一般认为现在的个人应用需要用384或512比特位的n,公司需要用1024比特位的n,极其重要的场合应该用2048比特位的n。
RSA的安全性依赖于大数分解。公钥和私钥都是两个大素数( 大于 100个十进制位)的函数。据猜测,从一个密钥和密文推断出明文的难度等同于分解两个大素数的积。
RSA的安全性依赖于大数分解,但是否等同于大数分解一直未能得到理论上的证明,也并没有从理论上证明破译RSA的难度与大数分解难度等价。因为没有证明破解RSA就一定需要作大数分解。假设存在一种无须分解大数的算法,那它肯定可以修改成为大数分解算法。即RSA的重大缺陷是无法从理论上把握它的保密性能如何,而且密码学界多数人士倾向于因子分解不是NPC问题。
目前, RSA的一些变种算法已被证明等价于大数分解。不管怎样,分解n是最显然的攻击方法。现在,人们已能分解140多个十进制位的大素数。因此,模数n必须选大一些,因具体适用情况而定。
RSA算法的保密强度,随其密钥的长度增加而增强。但是,密钥越长,其加解密所耗的时间也越长。因此,要根据所保护信息的敏感程度与攻击者破解所要花的代价值不值得和系统所要求的反应时间来综合考虑决定。尤其对于商业信息领域更是如此。
RSA的选择密文攻击
RSA在选择密文攻击面前很脆弱。一般攻击者是将某一信息作一下伪装(Blind),让拥有私钥的实体签署。然后,经过计算就可得到它所想要的信息。实际上,攻击利用的都是同一个弱点,即存在这样一个事实:乘幂保留了输入的乘法结构:
( XM ^d = X^d *M^d mod n
前面已经提到,这个固有的问题来自于公钥密码系统的最有用的特征--每个人都能使用公钥。但从算法上无法解决这一问题,主要措施有两条:一条是采用好的公钥协议,保证工作过程中实体不对其他实体任意产生的信息解密,不对自己一无所知的信息签名;另一条是决不对陌生人送来的随机文档签名,签名时首先使用One-Way HashFunction对文档作HASH处理,或同时使用不同的签名算法。在中提到了几种不同类型的攻击方法。
RSA的公共模数攻击
若系统中共有一个模数,只是不同的人拥有不同的e和d,系统将是危险的。最普遍的情况是同一信息用不同的公钥加密,这些公钥共模而且互质,那末该信息无需私钥就可得到恢复。设P为信息明文,两个加密密钥为e1和e2,公共模数是n,则:
C1 = P^e1 mod n
C2 = P^e2 mod n
密码分析者知道n、e1、e2、C1和C2,就能得到P。因为e1和e2互质,故用Euclidean算法能找到r和s,满足:r * e1 + s * e2 = 1
假设r为负数,需再用Euclidean算法计算C1^(-1),则( C1^(-1) ^(-r) * C2^s = P mod n
另外,还有其它几种利用公共模数攻击的方法。总之,如果知道给定模数的一对e和d,一是有利于攻击者分解模数,一是有利于攻击者计算出其它成对的e'和d',而无需分解模数。解决办法只有一个,那就是不要共享模数n。
RSA的小指数攻击
有一种提高RSA速度的建议是使公钥e取较小的值,这样会使加密变得易于实现,速度有所提高。但这样作是不安全的,对付办法就是e和d都取较大的值。
RSA最近的破解
荷兰
早在1999年,位于荷兰的一个国际科学组织宣布他们已破解一个用於保护每天数以百万的因特网交易的国际安全密码,从而揭示出在电子商业中存在着严重的、无法保证安全的潜在可能。
该组织认为,这个密码的破解,可能会对互联网上的电子商务市场带来严重的影响。
这个科学组织是为阿姆斯特丹的数学和计算机科学协会的国家研究中心工作的,他们声称已经破解了一个类似著名的RSA-155加密系统的512位数的密码,这种加密系统是由麻省理工学院在70年代中期设计的。RSA-15 系统被广泛用于保护硬件和软件上传输的电子数据。例如,RSA-155被应用在国际安全协议SSL上。尤其,该组织认为512位质因数的长度与95%的用于互联网上电子商务的密匙类似。
该组织说,"结果显示,在开始预料电子商务之前,普遍采用512位密码对于一个中等程度的黑客已不再安全。" 该组织还说,"用于保护512位密匙的耗资是很大的,数十亿的美圆每天要通过财政机构投入其中。" 当密码第一次创建时,人们认为512位因数实际上是不可能的,换句话说,没有人认为一个512位的密匙能被破解,但是事与愿违。为了找出质因数,该组织使用了总共300个SUN公司的SGI工作站和奔腾级的PC电脑。而破解密码要借助计算机整日整夜的运行,耗费大约35年的计算时间。一个姆斯特丹计算机学术中心的型号为CRAY C916的拥有2GB内存的超级计算机也被投入使用。
该组织说密码被破解了大约7个月。 该组织说"如果通过互联网上成百上千的参与者参加当前的大型分布式计算工程,那么就有可能把破解512位数的时间从7个月减少到一周。"
以色列Adi Shamir
以色列电脑专家发明一部新电脑,能在几日内破解目前广泛运用的密码系统,对一般的电子商务构成重大威协。
以色列魏茨曼科学院的沙米尔,正是目前市场广泛应用的密码系统"RSA公开密码本"的设计者。他新设计的电脑系统,制造费用约达200万美元,可以在两三天内,译解以五百一十二比特(512 bits)写成的RSA密码,而一些高度机密的军事、银行及其他高度保护的数据库等系统,则不在此列。
沙米尔今年5月曾公开其设计雏型,近日在麻省伍斯特理工学院的一个研讨会上,首次向在座20名电脑密码专家解释其新设计。他是从电脑二极管的闪光得到灵感,设计出15厘米乘15厘米的电脑,精密量度二极管的闪光,再加以计算,就能在两三日之间迅速破解RSA密码。
密码专家认为,这设计进一步显示目前应用的RSA密码其实十分脆弱,相信犯罪组织、政府部门、研究机构等等,都会对此新发明很感兴趣。 虽然较敏感的机密系统都会用较长的密码,即一千零二十四比特(1,024 bits),但基于各种考虑,美国政府要有特别批准才会出口较长的密码,而目前最流行的浏览器都是用五百一十二比特(512 bits)写成。
RSA公钥体系可用于数字签名
RSA公钥体系还可用于对数据信息进行数字签名。所谓数字签名就是信息发送者用其私钥对从所传报文中提取出的特征数据或称数字指纹进行RSA算法解密运算操作,得到发信者对该数字指纹的签名函数H(m)。签名函数H(m)从技术上标识了发信者对该电文的数字指纹的责任。因发信者的私钥只有他本人才有,所以他一旦完成了签名便保证了发信人无法抵赖曾发过该信息(即不可抵赖性)。经验证无误的签名电文同时也确保信息报文在经签名后未被篡改(即完整性)。当信息接收者收到报文后,就可以用发送者的公钥对数字签名的真实性进行验证。美国参议院已通过了立法,现在在美国,数字签名与手书签名的文件具有同等的法律效力。
在数字签名中有重要作用的数字指纹是通过一类特殊的散列函数(HASH函数) 生成的, 对这些HASH函数的特殊要求是:
1.接受的输入报文数据没有长度限制;
2.对任何输入报文数据生成固定长度的摘要(数字指纹)输出;
3.从报文能方便地算出摘要;
4.难以对指定的摘要生成一个报文,而由该报文可以算出该指定的摘要;
5.难以生成两个不同的报文具有相同的摘要。
RSA的实用性
公开密钥密码体制与对称密钥密码体制相比较,确实有其不可取代的优点,但它的运算量远大于后者,超过几百倍、几千倍甚至上万倍,复杂得多。
在网络上全都用公开密钥密码体制来传送机密信息,是没有必要的,也是不现实的。在 计算机系统中使用对称密钥密码体制已有多年,既有比较简便可靠的,久经考验的方法,如 以DES(数据加密标准)为代表的分块加密算法(及其扩充DESX和Triple DES);也有一些新的方法发表,如由RSA公司的Rivest研制的专有算法RC2、RC4、RC5等,其中RC2和RC5是分块加密算法,RC4是数据流加密算法。
在传送机密信息的网络用户双方,如果使用某个对称密钥密码体制(例如DES),同时使 用RSA不对称密钥密码体制来传送DES的密钥,就可以综合发挥两种密码体制的优点,即DES 高速简便性和RSA密钥管理的方便和安全性。
RSA算法已经在互联网的许多方面得以广泛应用,包括在安全接口层(SSL)标准(该标准是网络浏览器建立安全的互联网连接时必须用到的)方面的应用。
基于RSA算法的公钥加密系统具有数据加密、数字签名(Digital Signature)、信息源识别及密钥交换等功能。目前,RSA加密系统主要应用于智能IC卡和网络安全产品。选用RSA 算法作为公共钥加密系统的主要算法的原因是算法安全性好。在模N足够长时,每lnN个整数中就有一个大小接近于N的素数。在模长为1024bit时,可以认为RSA密码系统的可选密钥个数足够多,可以得到随机、安全的密钥对。公共钥加密系统多用于分布式计算环境,密钥分配和管理易于实现,局部攻击难以对整个系统的安全造成威胁。目前还没有攻破实际应用系统的例子。
RSA专利
RSA算法在美国申请了专利,但在其他国家无专利。美国专利已经于2000年9月20日到期。
美国当地时间9月6日,美国公共密钥系统安全公司(RSA也称数据安全有限公司)决定放弃权利公开其严格保密的加密规则技术。RSA公司的公共密钥加密规则是一种类似于"c = me mod n"的数字式加密规则,公共密钥加密规则被认为是确保绝大多数网上电子商务安全的加密与密码技术的标准规则。
美国国家专利局称,加密通信系统与技术专利编号为No.4405829,该专利权于1983年9月20日授予了麻省理工学院,其后该专利由公共密钥安全公司完全买断,专利权限将于2000年9月20日到期。与Red Hat公司公开Linux系统资源及其它公司公开技术资源的情况相似,这一公开加密规则的举动将使其竞争对手可以在自己的产品中嵌入该加密技术规则。
公共密钥安全公司的首席执行官阿特·科维罗接受InternetNews.com网站采访时称,他们相信,这一举动将进一步巩固RSA加密技术作为有线、无线应有程序及设备加密标准的地位。
RSA公司公开发表它的加密算法,任何开发工作都可以使用该算法。基于该算法的产品和解决方案可以完全自由地在美国销售。这使得所有的公司都可以免费基于它的技术开发安全解决方案。这个算法已经在Netscape的浏览器和微软公司的IE浏览器中被使用,是目前在线交易的主要安全技术。
RSA公司代表Holahan的声明称,该公司的专利已经通过建立可靠的安全标准对电子商务提供了帮助。现在公开这一专利技术将给业界的安全产品带来新变化。
RSA算法和DES算法
算法的比较
上一篇〈分组密码算法分析与改进>中已经对DES作出了简单的分析,在这里再简单描述一下:
DES数据加密标准用于对64比特的数据进行加密和解密。DES算法所用的密钥也是64比特,但由于其中包含了8个比特的奇偶校验位,因而实际的密钥长度是56比特。DES算法多次组合迭代算法和换位算法,利用分散和错乱的相互作用,把明文编制成密码强度很高的密文。DES算法的加密和解密的流程是完全相同的,区别仅仅是加密与解密使用子密钥序列的顺序正好相反。
RSA算法是公开密钥系统中的杰出代表。RSA算法的安全性是建立在具有大素数因子的合数其因子分解困难这一法则之上的。RSA算法中加密密钥和解密密钥不相同,其中加密密钥公开,解密密钥保密,并且不能从加密密钥或密文中推出解密密钥。
DES算法和RSA算法各有优缺点,我们可以对DES算法和RSA算法在以下几个方面作一比较。
比较1
在加密、解密的处理效率方面,DES算法优于RSA算法。因为DES密钥的长度只有56比特,可以利用软件和硬件实现高速处理;RSA算法需要进行诸如200比特整数的乘幂和求模等多倍字长的处理,处理速度明显慢于DES算法。
比较2
在密钥的管理方面,RSA算法比DES算法更加优越。因为RSA算法可采用公开形式分配加密密钥,对加密密钥的更新也很容易,并且对不同的通信对象,只需对自己的解密密钥保密即可;DES算法要求通信前对密钥进行秘密分配,密钥的更换困难,对不同的通信对象,DES需产生和保管不同的密钥。
比较3
在安全性方面,DES算法和RSA算法的安全性都较好,还没有在短时间内破译它们的有效的方法。
比较4
在签名和认证方面,DES算法从原理上不可能实现数字签名和身份认证,但RSA算法能够容易地进行数字签名和身份认证。
基于的DES和RSA的新的加密方案
基于以上比较结果,DES及RSA各有短长,可设计出一种综合DES和RSA优点,同时又避免了它们各自的不足的加密方案。基本原理是:数据通信之前,用DES方法对消息明文加密,同时用RSA方法对DES密钥进行加密和实现数字签名。
设发送方为A(加密密钥为Kea,解密密钥为Kda),接收方为B(加密密钥为Keb,解密密钥为Kdb),上述加密方案的具体实现步骤如下:
1. 发送方先生成用于DES加密的密钥K,为了提高数据的安全性,每一个密钥K只用一次。
2. 发送方从密钥服务器中获取接收方的RSA的公开加密密钥Keb,并用Keb加密DES的密钥K形成密文Ck。
3. 发送方生成需要签名的信息,并用自己的RSA的解密密钥Kda和Keb共同形成数字签名。
4. 发送方用K加密明文和签名的信息,然后连同Ck一起形成密文C发往接收方。
5. 接收方接收到C后,先用自己的解密密钥Kdb解密出C中的DES密钥K,再利用K解密出明文和签名信息。
6. 接收方用发送方的公开密钥Kea和自己的解密密钥Kdb对签名信息进行身份认证,然后对签名信息作适当处理后(例如填写自己的标识号等),再形成自己的数字签名信息发往发送方。
7. 发送、接收双方均删除DES密钥K。
这样综合了DES算法和RSA算法的长处,所以具有如下优点:
加密、解密速度快。因为对数据量大的明文是采用DES算法来加密和解密的,而只有对签名信息和DES算法的密钥K这样的数据量小的信息才采用RSA算法,所以加密、解密的速度快,接近DES算法的速度。
通信双方在传输的密文中携带RSA加密的DES密钥,不用再秘密交换密钥,减小了密钥在传输过程中泄密的风险。
具有签名和认证的功能。由于采用了RSA算法,通信双方可以将自己的数字签名信息互相发给对方供保留和认证。
密钥管理方便。虽然采用了DES算法,但不是对每一通信对象都保密管理相应的DES密钥,只需保密管理自己的RSA解密密钥就行了。RSA公开密钥可以任意公开,DES密钥在通信之前产生,不必事先约定,通信结束后,销去相应的DES密钥。
其他公钥体制
人们一直努力在其他困难问题上建立公开密钥密码体制,不至于一旦一些数学难题被解决以后,没有可用的密码算法,所以出现了大量的公开密钥密码算法,包括:背包体制,POHLIG-Hellman算法,Rabin算法,ElGamal算法,SCHNORR算法,ESIGN算法,McEliece算法,OKAMOTO算法,还可以在有限域上的椭圆曲线上建立RSA,ElGamal算法等。
我们认为RSA算法是目前最好的密码算法,它不仅可以作为加密算法使用,而且可以用作数字签名和密钥分配与管理,而DSA只适合作签名,且安全强度和速度都不如RSA,椭圆曲线上的公开密钥密码系统安全强度依赖于曲线的选择和体制,我们相信它会有更高的安全强度。
目前200比特长的椭圆曲线密码体制已经有相当高的安全强度。
在几乎所有的实用公开密钥密码系统中,都涉及到大数运算和素数选择 ,模幂运算采用反复平方取模算法,素数测试一般采用Rabin-Miller算 法,还有其他素性测试算法用来选择大素数,如Solovag-Strassen 测试法,Lehmann 测试法等。
公开密钥系统的安全性
由于公钥不需要保密,因此在黑客或许会用他们自己的公钥冒充其他人的公钥进行攻击,这是这种模式的主要风险。为了防范这种攻击的发生,我们采用公钥证书。证书是一组规定了与特定公钥有关的单个计算机或主机名称的数字化数据。名称和密钥都受到一个值得信任的第三方附加的数字签名的保护:即证书机关(或 CA)。
公钥领域的大多数主要厂商都可以成为证书机关,他们可以将他们的信任状(credentials)安装在 Web 浏览器。 其他机构可以要求这些厂商有尝签发证书,在使用标准浏览器时,这些证书就会生效。另外,企业也可以购买软件自己签发证书。然而,被用来给这些证书签名的信任状必须安装在任何需要验证这些证书的软件 (如 Web浏览器)中。
另外,公钥长期存在的一个问题是密钥的撤消。公钥是非常易于创建和签发的。其成本主要是在撤消密钥的过程中产生的。由于公钥在签发时不需要保密,因此用户可以自由地复制和签发它们,这样其他用户在需要时就可以得到它们。然而,如果需要更换公钥,那么这个问题就成为一场噩梦。例如,黑客可能会得到属于特定公钥的私钥,这样他就可以冒充密钥的所有者和欺骗任何使用该公钥的人。如果所有者意识到这个问题,并试图更换私钥,他必须以某种方式联络曾经得到过旧的公钥的所有人和确保其他人不再使用旧的公钥。
大多数公钥系统现在都依靠撤消清单识别不应再使用的公钥。这些清单类似于以前信用卡特约商户使用的厚厚的小册子:在小册子中列出了所有丢失或被偷窃的信用卡的卡号,这些商户会查看小册子,核实某个信用卡是否被偷。其它在线证书验证技术虽然已经出现,但是还没有完全满意的解决方案应用到实践中。
随着用户的增加,密钥的数量管理也需要考虑。
【分组密码算法分析,改进】
序:这是我花了近2周的时间写的,可以说比较全面地介绍了各种分组密码、如DES算法、IDEA算法,其中最为宝贵的一部分是最后AES新推荐的算法Rijndael,它是今年10月份美国国家标准和技术研究所刚刚推出的分组密码算法,目前美国官方还没有正式发布此标准,但基本上已有定夺。
前言
数据加密作为一项基本技术是所有通信安全的基石。数据加密过程是由形形色色的加密算法来具体实施,它以很小的代价提供很大的安全保护。在多数情况下,数据加密是保证信息机密性的唯一方法。据不完全统计,到目前为止,已经公开发表的各种加密算法多达数百种。如果按照收发双方密钥是否相同来分类,可以将这些加密算法分为常规密码算法和公钥密码算法,两种算法最有名的代表分别为DES和RSA。粗略地讲,分组密码是用一个固定的变换对一个比较大的明文数组进行操作。本文将对分组密码进行详细的介绍。
分组密码
分组密码即对固定长度的一组明文进行加密的算法。它将明文按一定的位长分组,明文组和密钥组的全部经过加密运算得到密文组。解密时密文组和密钥组经过解密运算(加密运算的逆运算),还原成明文组。
分组密码的特点是:密钥可以在一定时间内固定,不必每次变换,因此给密钥配发带来了方便。但是,由于分组密码存在着密文传输错误在明文中扩散的问题,因此在信道质量较差的情况下无法使用。
分组密码其中最著名的两个分组密码即DES(Data Encryption Standard) 数据加密标准和IDEA(International Data Encryption Algorithm)国际数据加密算法。
术语和符号
一个分组密码有两个重要的参数:一个是密钥的大小,称作密钥长度;另一个是每次操作的组的大小,称作分组长度。
被变换的数据称作明文,变换后的数据称作密文。
将明文变换成密文的过程称作加密,其逆过程,即由密文恢复出原明文的过程称作解密。密钥是由希望通信的双方选择的一些秘密信息。
通信双方的密钥可能一样,也可能不一样,我们把前者称作对称密码,后者称作非对称密码。该报告限于介绍对称的分组密码。将明文变换成密文时所采用的一组规则称作加密算法,由密文恢复出原明文时所采用的一组规则称作解密算法。加密和解密算法通常是在密钥控制下进行的。
在密钥K控制之下的加密算法E记为E_K,明文消息m对应的密文记为E_K(m)。类似地,在密钥K控制之下的解密算法D记为D_K,密文消息c对的明文记为D_K(c)。显然,对所有的明文m,都有D_K(E_K(m))=m。
分组密码-DES
DES密码算法的产生及发展
DES密码是1977年由美国国家标准局公布的第一个分组密码。
20世纪五十年代,密码学研究领域出现了最具代表性的两大成就。其中之一就是1971年美国学者塔奇曼 (Tuchman)和麦耶(Meyer)根据信息论创始人香农(Shannon)提出的"多重加密有效性理论"创立的,后于1977年由美国国家标准局颁布的数据加密标准DES。
为了实现同一水平的安全性和兼容性,为此美国商业部所属国家标准局(ANBS)于1972年开始了一项计算机数据保护标准的发展规则。于1973年开始研究除国防部外的其它部门的计算机系统的数据加密标准,为了建立适用于计算机系统的商用密码,于1973年5月和1974年8月先后两次向公众发出了征求加密算法的公告。1973年5月13日的联邦记录(FR1973)中的公告,征求在传输和存储数据中保护计算机数据的密码算法的建议,这一举措最终导致了数据加密标准(DES)算法的研制。征求的加密算法要达到的目的(通常称为DES 密码算法要求)主要为以下四点:
提供高质量的数据保护,防止数据未经授权的泄露和未被察觉的修改;
具有相当高的复杂性,使得破译的开销超过可能获得的利益,同时又要便于理解和掌握;
DES密码体制的安全性应该不依赖于算法的保密,其安全性仅以加密密钥的保密为基础;
实现经济,运行有效,并且适用于多种完全不同的应用。
在征得的算法中, IBM公司提出的算法lucifer中选。DES密码实际上是Lucifer密码的进一步发展。它是一种采用传统加密方法的分组密码。1975年3月17日,ANBS向社会公布了此算法,首次公布在联邦记录中,以求得公众的评论。1977年1月正式向社会公布,采纳IBM公司设计的方案作为非机密数据的正式数据加密标准(DES-Data Encryption Standard)。成为美国联邦信息处理标准,即FIPS-46,同年7月15日开始生效。
随后DES的应用范围迅速扩大到涉及美国以外的公司、甚至某些美国军事部门也使用了DES,引起了美国国家安全局的忧虑。因此,里根总统曾于1984年9月签署了一项命令,即NSDD-145号命令,下令责成美国防部的国家安全局负责组织、研制一种新的数据加密标准CCEP(Commercial Communication Security Endorsement)商用通信安全保证程序于1988年取代DES。后来由于遭到整个最大的金融界用户以其不符合他们的要求为由的强烈反对,美国政府在其国会的压力下才撤销了里根这个NSDD-145号命令。
DES自1977年由美国国防部采用,它的标准ANSI X.3.92和X3.106标准中都有说明。因为担心这种方法被敌对国使用,美国政府不允许出口此种算法的加密软件,但是要想找到这种软件也不难,在各地的BBS上都会有。
每隔五年由美国国家保密局(NSA)对DES作出评估,并重新批准它是否继续作为联邦加密标准。
DES简介
数据加密标准(DES)是一种世界范围之内广泛使用的以密钥作为加密方法的加密手段,被美国政府确定是很难破译的,因此也被美国政府作为限制出口的一种技术。在此标准下有72,000,000,000,000,000 (72Q)多种密钥可供使用。对于每条给定的信息,密钥在这72Q个密钥中随机选择。与其它的加密方法一样,加密方和解密方必须使用相同的密钥,所以DES算法也属于对称算法。它的算法是对称的,既可用于加密又可用于解密。
设计分组密码算法的核心技术是:在相信复杂函数可以通过简单函数迭代若干圈得到的原则下,利用简单圈函数及对合等运算,充分利用非线性运算。DES算法采用美国国家安全局精心设计的8个S-Box 和P-置换,经过16圈迭代,最终产生64比特密文,每圈迭代使用的48比特子密钥是由原始的56比特产生的。
DES密码算法输入的是64比特的明文,在64比特密钥的控制下产生64比特的密文;反之输入64比特的密文,输出64比特的明文。64比特的密钥中含有8个比特的奇偶校验位,所以实际有效密钥长度为56比特。
DES算法加密时把明文以64bit为单位分成块,而后用密钥把每一块明文转化成同样64bit的密文块。DES提供72,000,000,000,000,000个密钥,用每微秒可进行一次DES加密的机器来破译密码需两千年。采用DES的一个著名的网络安全系统是Kerberos,由麻省理工学院MIT开发,是网络通信中身份认证的工业上的事实标准。
DES应用
自DES算法颁布之后,引起了学术界和企业界的广泛重视。许多厂家很快生产出实现DES算法的硬件产品,广大用户在市场上买到高速而又廉价的DES硬件产品之后,开始用它加密自己的重要数据,从而大大推广了密码技术的使用。
DES算法的入口参数有三个:Key、Data、Mode。其中Key为8个字节共64位,是DES算法的工作密钥;Data也为8个字节64位,是要被加密或被解密的数据;Mode为DES的工作方式,有两种:加密或解密。
DES算法是这样工作的:如Mode为加密,则用Key去把数据Data进行加密,生成Data的密码形式(64位)作为DES的输出结果;如Mode为解密,则用Key去把密码形式的数据Data解密,还原为Data的明码形式(64位)作为DES的输出结果。
在通信网络的两端,双方约定了一致的Key,在通信的源点用Key对核心数据进行DES加密,然后以密码形式在公共通信网(如电话网)中传输到通信网络的终点,数据到达目的地后,用同样的Key对密码数据进行解密,便再现了明码形式的核心数据。这样,便保证了核心数据(如PIN、MAC等)在公共通信网中传输的安全性和可靠性。
通过定期在通信网络的源端和目的端同时改用新的Key,便能更进一步提高数据的保密性,这正是现在金融交易网络的流行做法。
在银行金融界及非金融界,越来越多地用到了DES算法,目前美国使用的128位对称密码算法(DES),支持全美的电子商务活动。1998年全美电子商务营业额为160亿美元,尚未发现有安全问题。目前,在国内,随着三金工程尤其是金卡工程的启动,DES算法在POS、ATM、磁卡及智能卡(IC卡)、加油站、高速公路收费站等领域被广泛应用,以此来实现关键数据的保密。如信用卡持卡人的PIN的加密传输、IC卡与POS间的双向认证、金融交易数据包的MAC校验等,均用到DES算法。
DES算法
DES使用56比特有效密钥的64-比特分组密码来加密64位数据。它是一个16-圈的迭代型密码。加、解密算法一样,但加、解密时所使用的子密钥的顺序刚好相反。DES的硬件实现的加密速率大约为20 M比特/秒;DES的软件实现的速率大约为400 ~ 500 K比特/秒。DES专用芯片的加密和解密的速率大约为1G比特/秒。
DES的圈函数f对32比特的串作如下操作:首先将这32比特的串扩展成48比特的串。其次将这48比特的串和48比特的密钥进行组合并将组合结果作为八个不同S-盒的输入。每个S-盒的输入是6比特,输出是4比特。然后将S-盒的32比特做置换作为圈函数f的输出。
DES有56比特的有效密钥,64比特密钥中的第8位、第16位、…、第64位为校验位。所以对DES最尖锐的批评之一是DES的密钥太短。
DES算法以被应用于许多需要安全加密的场合。(如:UNIX的密码算法就是以DES算法为基础的)。下面是关于如何实现DES算法的语言性描述。
1. 处理密钥:
1-1、变换密钥:取得64位的密钥,每个第8位作为奇偶校验位。
1-2、变换密钥。
1-2-1、舍弃64位密钥中的奇偶校验位,根据下表(PC-1)进行密钥变换得到56位的密钥,在变换中,奇偶校验位以被舍弃。
Permuted Choice 1 (PC-1)
57 49 41 33 25 17 9
1 58 50 42 34 26 18
10 2 59 51 43 35 27
19 11 3 60 52 44 36
63 55 47 39 31 23 15
7 62 54 46 38 30 22
14 6 61 53 45 37 29
21 13 5 28 20 12 4
1-2-2、将变换后的密钥分为两个部分,开始的28位称为C[0],最后的28位称为D[0]。
1-2-3、生成16个子密钥,初始I=1。
1-2-3-1、同时将C[I]、D[I]左移1位或2位,根据I值决定左移的位数。见下表
I: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
左移位数: 1 1 2 2 2 2 2 2 1 2 2 2 2 2 2 1
1-2-3-2、将C[I]D[I]作为一个整体按下表(PC-2)变换,得到48位的K[I]
Permuted Choice 2 (PC-2)
14 17 11 24 1 5
3 28 15 6 21 10
23 19 12 4 26 8
16 7 27 20 13 2
41 52 31 37 47 55
30 40 51 45 33 48
44 49 39 56 34 53
46 42 50 36 29 32
1-2-3-3、从1-2-3-1处循环执行,直到K[16]被计算完成。
2、处理64位的数据
2-1、取得64位的数据,如果数据长度不足64位,应该将其扩展为64位(例如补零)
2-2、将64位数据按下表变换(IP)
Initial Permutation (IP)
58 50 42 34 26 18 10 2
60 52 44 36 28 20 12 4
62 54 46 38 30 22 14 6
64 56 48 40 32 24 16 8
57 49 41 33 25 17 9 1
59 51 43 35 27 19 11 3
61 53 45 37 29 21 13 5
63 55 47 39 31 23 15 7
2-3、将变换后的数据分为两部分,开始的32位称为L[0],最后的32位称为R[0]。
2-4、用16个子密钥加密数据,初始I=1。 2-4-1、将32位的R[I-1]按下表(E)扩展为48位的E[I-1]
Expansion (E)
32 1 2 3 4 5
4 5 6 7 8 9
8 9 10 11 12 13
12 13 14 15 16 17
16 17 18 19 20 21
20 21 22 23 24 25
24 25 26 27 28 29
28 29 30 31 32 1
2-4-2、异或E[I-1]和K[I],即E[I-1] XOR K[I]
2-4-3、将异或后的结果分为8个6位长的部分,第1位到第6位称为B[1],第7位到第12位称为B[2],依此类推,第43位到第48位称为B[8]。
2-4-4、按S表变换所有的B[J],初始J=1。所有在S表的值都被当作4位长度处理。
2-4-4-1、将B[J]的第1位和第6位组合为一个2位长度的变量M,M作为在S[J]中的行号。
2-4-4-2、将B[J]的第2位到第5位组合,作为一个4位长度的变量N,N作为在S[J]中的列号。
2-4-4-3、用S[J][M][N]来取代B[J]。
Substitution Box 1 (S[1])
14 4 13 1 2 15 11 8 3 10 6 12 5 9 0 7
0 15 7 4 14 2 13 1 10 6 12 11 9 5 3 8
4 1 14 8 13 6 2 11 15 12 9 7 3 10 5 0
15 12 8 2 4 9 1 7 5 11 3 14 10 0 6 13
S[2]
15 1 8 14 6 11 3 4 9 7 2 13 12 0 5 10
3 13 4 7 15 2 8 14 12 0 1 10 6 9 11 5
0 14 7 11 10 4 13 1 5 8 12 6 9 3 2 15
13 8 10 1 3 15 4 2 11 6 7 12 0 5 14 9
S[3]
10 0 9 14 6 3 15 5 1 13 12 7 11 4 2 8
13 7 0 9 3 4 6 10 2 8 5 14 12 11 15 1
13 6 4 9 8 15 3 0 11 1 2 12 5 10 14 7
1 10 13 0 6 9 8 7 4 15 14 3 11 5 2 12
S[4]
7 13 14 3 0 6 9 10 1 2 8 5 11 12 4 15
13 8 11 5 6 15 0 3 4 7 2 12 1 10 14 9
10 6 9 0 12 11 7 13 15 1 3 14 5 2 8 4
3 15 0 6 10 1 13 8 9 4 5 11 12 7 2 14
S[5]
2 12 4 1 7 10 11 6 8 5 3 15 13 0 14 9
14 11 2 12 4 7 13 1 5 0 15 10 3 9 8 6
4 2 1 11 10 13 7 8 15 9 12 5 6 3 0 14
11 8 12 7 1 14 2 13 6 15 0 9 10 4 5 3
S[6]
12 1 10 15 9 2 6 8 0 13 3 4 14 7 5 11
10 15 4 2 7 12 9 5 6 1 13 14 0 11 3 8
9 14 15 5 2 8 12 3 7 0 4 10 1 13 11 6
4 3 2 12 9 5 15 10 11 14 1 7 6 0 8 13
S[7]
4 11 2 14 15 0 8 13 3 12 9 7 5 10 6 1
13 0 11 7 4 9 1 10 14 3 5 12 2 15 8 6
1 4 11 13 12 3 7 14 10 15 6 8 0 5 9 2
6 11 13 8 1 4 10 7 9 5 0 15 14 2 3 12
S[8]
13 2 8 4 6 15 11 1 10 9 3 14 5 0 12 7
1 15 13 8 10 3 7 4 12 5 6 11 0 14 9 2
7 11 4 1 9 12 14 2 0 6 10 13 15 3 5 8
2 1 14 7 4 10 8 13 15 12 9 0 3 5 6 11
2-4-4-4、从2-4-4-1处循环执行,直到B[8]被替代完成。
2-4-4-5、将B[1]到B[8]组合,按下表(P)变换,得到P。
Permutation P
16 7 20 21
29 12 28 17
1 15 23 26
5 18 31 10
2 8 24 14
32 27 3 9
19 13 30 6
22 11 4 25
2-4-4-6、异或P和L[I-1]结果放在R[I],即R[I]=P XOR L[I-1]。
2-4-4-7、L[I]=R[I-1]
2-4-4-8、从2-4-1处开始循环执行,直到K[16]被变换完成。
2-4-5、组合变换后的R[16]L[16](注意:R作为开始的32位),按下表(IP-1)变换得到最后的结果。
Final Permutation (IP**-1)
40 8 48 16 56 24 64 32
39 7 47 15 55 23 63 31
38 6 46 14 54 22 62 30
37 5 45 13 53 21 61 29
36 4 44 12 52 20 60 28
35 3 43 11 51 19 59 27
34 2 42 10 50 18 58 26
33 1 41 9 49 17 57 25
以上就是DES算法如何加密一段64位数据块算法的描述。解密时用同样的过程,只需把16个子密钥的顺续颠倒过来,应用的顺序为K[16],K[15],K[14],。。。。K[1]。
DES的安全性
对称的分组密码算法最主要的问题是:由于加解密双方都要使用相同的密钥,因此在发送、接收数据之前,必须完成密钥的分发。因而,密钥的分发便成了该加密体系中的最薄弱因而风险最大的环节。各种基本的手段均很难保障安全地完成此项工作。从而,使密钥更新的周期加长,给他人破译密钥提供了机会。实际上这与传统的保密方法差别不大。在历史战争中,破获他国情报的纪录不外是两种方式:一种是在敌方更换"密码本"的过程中截获对方密码本;另一种是敌人密钥变动周期太长,被长期跟踪,找出规律从而被破获。在对称算法中,尽管由于密钥强度增强,跟踪找出规律破获密钥的机会大大减小了,但密钥分发的困难问题几乎无法解决。如,设有n方参与通信,若n方都采用同一个对称密钥,一旦密钥被破解,整个体系就会崩溃;若采用不同的对称密钥则需n(n-1)个密钥,密钥数与参与通信人数的平方数成正比。这便使大系统密钥的管理几乎成为不可能。
自DES算法1977年首次公诸于世以来,引起了学术界和企业界的广泛重视。
学术界对DES密码进行了深入的研究,围绕它的安全性和破译方法展开了激烈的争论,在一定意义上对密码学的理论研究也起了推动作用。 同时人们也一直对DES的安全性持怀疑态度,对密钥的长度、迭代次数及S盒的设计纵说纷纭。从技术上说,对DES的批评主要集中在以下三个方面。
作为分组密码,DES的加密单位仅有64位二进制,这对于数据传输来说太小,因为每个区组仅含8个字符,而且其中某些位还要用于奇偶校验或其他通讯开销。
密钥仅有56位二进制未免太短,各次迭代中使用的密钥K(i)是递推产生的,这种相关必降低了密码体制的安全性。目前,有人认为:在现有的技术条件下用穷举法寻找正确密钥已趋于可行,所以若要安全保护10年以上的数据最好不用DES算法。
实现替代函数Si所用的S盒的设计原理尚未公开,其中可能留有隐患。更有人担心DES算法中有"陷阱",知道秘密的人可以很容易地进行密文解密。
目前人们仍然不知道DES中是否存在陷门。所谓陷门,通俗地讲,就是在算法的设计中设计者留了一个后门,知道某一秘密的人可进入这一后门获得使用该算法的用户的秘密密钥。DES的设计准则除了极少数被公布外,其余的仍然是保密的。围绕S-盒人们讨论了一系列问题包括设计准则和构造等。
Campbell和Wiener于1992年证明了"DES不成群"这个事实。
DES至少有4个弱密钥,12个半弱密钥。
1993年Wiener给了一个详细的设计密钥搜索机的方案,他估计耗资100万美元制造一台机器,搜索一个DES密钥平均大约需花3·5小时。差分分析破译16-圈DES需要2个选择明文,破译8-圈DES需要2个选择明文。线性分析破译16-圈DES需要2个已知明文,破译8-圈DES需要2个已知明文。
根据目前的计算技术和DES的分析情况,16-圈DES仍然是安全的,但提醒使用者不要使用低于16-圈的DES,特别是10-圈以下的DES。
在对DES密码进行鉴定的期间,美国国家保密局和计算机科学技术学会组织各界专家研究了DES密码体制的安全性问题,讨论了破译DES密码体制的一切可能途径。尽管有些专家和学者对它的安全性仍持怀疑态度,但官方却得出了十分乐观的结论。他们宣布:"没有任何可以破译DES密码体制的系统分析法。若使用穷举法,则在1990年以前基本上不可能产生出每天能破译一个DES密钥的专用计算机。即使届时能制造出这样的专用机,它的破译成功率也只会在0.1到0.2之间,而且造价可能高达几千万美元。"
我们先考虑用穷举法破译DES 密码的问题。设已知一段密码文C及与它对应的明码文M,用一切可能的密钥K加密M,直到得到E(M)=C,这时所用的密钥K即为要破译的密码的密钥。穷举法的时间复杂性是T=O(n),空间复杂性是S=O(1)。对于DES密码,n=256≈7×1016,即使使用每秒种可以计算一百万个密钥的大型计算机,也需要算106天才能求得所使用的密钥,因此看来是很安全的。但是Diffie和Hellman指出,如果设计一种一微秒可以核算一个密钥的超大规模集成片,那么它在一天内可以核算8.64×1010个密钥。如果由一个百万个这样的集成片构成专用机,那么它可以在不到一天的时间内用穷举法破译DES密码。他们当时(1977年)估计:这种专用机的造价约为两千万美元。如果在五年内分期偿还,平均每天约需付一万美元。由于用穷举法破译平均只需要计算半个密钥空间,因此获得解的平均时间为半天。这样,破译每个DES密码的花销只是五千美元。后来,Diffie在1981年又修改了他们的估计,认为以1980年的技术而论,用造价为五千万美元的专用机破译DES密码平均要花两天时间。但是他与Hellman都预计:1990年时,破译DES密码的专用机的造价将大幅度下降。
计算及科学家Tanenbaum指出,即使没有这种专用机,也可以用穷举法破译DES。
DES对每64位数据块应用一个56位的密钥。整个过程要经历16个加密运算周期(或操作)。在1997年,RSA(数据安全公司)为能够破解DES信息的人提供$10,000奖金,于是在Internet上的一次多达14,000计算机的联合行动最终找到了密钥,这次行动中,总共搜索了72Q个密钥中的18Q个,这也显示了网络分布式计算机的强大威力。能够令我们放心的是,因为人力的关系,对于普通信息不可能受到这样的破译。
据美国(华尔街报)1999年3月8日报导,由Verisign公司(一个信息保密安全公司)经理 Anil Pereira分指出,欲破解一个秘密密钥长度为128位的DES加密要比破解一个秘密密钥长度为40位的DES加密要困难300X1042倍(300 Septillion倍)。也就是说如以300MC奔腾CPU的PC机破解40位DES加密要花3个小时计,那么用同样的PC机来破解一个128位DES加密就要花去900 X1042小时。这在一个人的有生之年是不可能做到的。
对一个密码算法的安全来说,密钥长度只是密码强度痕量标准之一,对一个密码算法的评价,除密钥长度外,还必须对算法进行详尽、系统的理论分析,对于DES型的分组密码,就需进行算法抵抗所谓的差分攻击和线性密码分析的能力。在国外,商用密码的算法必须是公开的,DES就是这样,因为这样有利于密码算法评价的公开性和公正性,这是我国商用密码管理的必由之路。
DES算法的应用漏洞
DES算法具有极高的安全性,到目前为止,除了用穷举搜索法对DES算法进行攻击外,还没有发现更有效的办法。而56位长的密钥的穷举空间为256,这意味着如果一台计算机的速度是每一秒钟检测一百万个密钥,则它搜索完全部密钥就需要将近2285年的时间,可见,这是难以实现的。当然,随着科学技术的发展,当出现超高速计算机后,我们可考虑把DES密钥的长度再增长一些,以此来达到更高的保密程度。
由上述DES算法介绍我们可以看到ES算法中只用到64位密钥中的其中56位,而第8、16 、24、......64位8个位并未参与DES运算,这一点,向我们提出了一个应用上的要求,即DES的安全性是基于除了8,16,24,......64位外的其余56位的组合变化256才得以保证的。因此,在实际应用中,我们应避开使用第8,16,24......64位作为DES密钥的有效数据位,而使用其它的56位作为有效数据位,才能保证DES算法安全可靠地发挥作用。如果不了解这一点,把密钥Key的8,16,24,......64位作为有效数据位使用,将不能保证DES加密数据的安全性,对运用DES 来达到保密作用的系统产生数据被破译的危险,这正是DES算法在应用上的误区,是各级技术人员、各级领导在使用过程中应绝对避免的。
避开DES算法漏洞安全管理
在DES密钥Key的使用、管理及密钥更换的过程中,应绝对避开DES算法的应用误区,即:绝对不能把Key的第8,16,24......64位作为有效数据位,来对Key进行管理。这一点,特别推荐给金融银行界及非金融业界的领导及决策者们,尤其是负责管理密钥的人,要对此点予以高度重视。有的银行金融交易网络,利用定期更换DES密钥Key的办法来进一步提高系统的安全性和可靠性,如果忽略了上述应用误区,那么,更换新密钥将是徒劳的,对金融交易网络的安全运行将是十分危险的,所以更换密钥一定要保证新Key与旧Key真正的不同,即除了第8,16,24,...64位以外其它位数据发生了变化,须务必对此保持高度重视!
现代密码学的特征是算法可以公开。保密的关键是如何保护好自己的密钥,而破密的关键则是如何能破解得到密钥。
系统的安全主管者,要根据本系统实际所使用的密钥长度与其所保护的信息的敏感程度、重要程度以及系统实际所处安全环境的恶劣程度,在留有足够的安全系数的条件下来确定其密钥和证书更换周期的长短。同时,将已废弃的密钥和证书放入黑库归档,以备可能后用。 密钥更换周期的正确安全策略是系统能够安全运行的保障,是系统的安全管理者最重要、最核心的日常工作任务。
DES的变形
DES 算法目前已广泛用于电子商务系统中。随着研究的发展,针对以上DES的缺陷,DES算法在基本不改变加密强度的条件下,发展了许多变形DES。人们提出了解几种增强DES安全性的方法,主要有以下几种。
多重DES
为了增加密钥的长度,人们建议将一种分组密码进行级联,在不同的密钥作用下,连续多次对一组明文进行加密,通常把这种技术称为多重加密技术。对DES,人们建议使用三重DES,这一点目前基本上达成一个共识。
三重DES
虽然DES被认为是一种十分可靠的加密方法,但许多公司仍然采用称为"三重DES"的方法加密,这种方法边连续使用三个密钥进行加密。
因为确定一种新的加密法是否真的安全是极为困难的,而且DES主要的密码学缺点,就是密钥长度相对比较短,所以人们并没有放弃使用DES,而是想出了一个解决其长度问题的方法,即采用三重DES。其基本原理是将128比特的密钥分为64比特的两组,对明文多次进行普通的DES加解密操作,从而增强加密强度。
这种方法用两个密钥对明文进行三次加密,假设两个密钥是K1和K2:
1. 用密钥K1进行DES加密。
2. 用K2对步骤1的结果进行DES解密。
3. 用步骤2的结果使用密钥K1进行DES加密
三重DESDES算法扩展其密钥长度的一种方法,可使加密密钥长度扩展到128比特(112比特有效)或192比特(168比特有效)。此方法为密码专家默克尔(Merkle)及赫尔曼(Hellman)推荐。据称,目前尚无人找到针对此方案的攻击方法。
S-盒可选择的DES(也称带用交换S盒的DES算法)
比哈姆(Biham)和沙米尔(Shamir)证明通过优化S盒的设计,甚至S盒本身的顺序,可以抵抗差分密码分析,以达到进一步增强DES算法的加密强度的目的。
在一些设计中,将DES作如下改进:
使S-盒的次序随密钥而变化或使S-盒的内容本身是可变的。
8个DES的S-盒的改变可使得DES变弱许多,使用某些特定次序的S-盒的16-圈DES仅需要大约2个选择明文就能用差分分析方法被破译。采用随机的S-盒的DES很容易被破译,即使是对DES的一个S-盒的数字稍作改变也会导致DES易于破译。结论:不管怎样随机选择S-盒都不会比DES更安全。
具有独立子密钥的DES
DES的另一种变形是每圈迭代都使用不同的子密钥,而不是由单个的56比特密钥来产生。因为16-圈DES的每圈都需要48比特密钥,所以这种变形的DES的密钥长度是768比特。这一方法可以增强DES的加密强度,大大地增加了实现DES的难度。
但据密码专家比哈姆(Biham)及沙米尔(Shamir)证明利用261个选择明文便可破译这个DES变形,而不是人们所希望的2768个选择明文。所以这种改变并不能使DES变得更安全。
G-DES
G-DES是广义的DES的缩写,设计它的目的是为了提高DES的速度和强度。总的分组长度增加了(分组长度是可变的),但圈函数f保持不变。Biham和Shamir仅使用16个已知明文就能用差分分析破译分组长度为256比特的16-圈G-DES。使用48个选择明文就能用差分分析破译分组长度为256比特的22-圈G-DES。即使是分组长度为256比特的64-圈G-DES也比16-圈DES弱。事实证明,比DES快的任何G-DES也就比它不安全。
IDEA算法
1990年赖学家(XueJia Lai)和梅西(Massey)开发的IDEA密码首次成形,称为PES,即"建议的加密标准"。次年,根据有关专家对这一密码算法的分析结果,设计者对该算法进行了强化并称之为IPES,即"改进的建议加密标准"。该算法于1992年更名为IDEA,即"国际加密标准"。
IDEA算法的密钥长度为128位。设计者尽最大努力使该算法不受差分密码分析的影响,赖学家已证明IDEA算法在其8圈迭代的第4圈之后便不受差分密码分析的影响了。假定穷举法攻击有效的话,那么即使设计一种每秒种可以试验10亿个密钥的专用芯片,并将10亿片这样的芯片用于此项工作,仍需1013年才能解决问题;另一方面,若用1024片这样的芯片,有可能在一天内找到密钥,不过人们还无法找到足够的硅原子来制造这样一台机器。目前,尚无一片公开发表的试图对IDEA进行密码分析的文章。因此,就现在来看应当说IDEA是非常安全的。
IDEA分组密码已在欧洲取得专利,在美国的专利还悬而未决,不存在非商用所需的使用许可证费用问题。
IDEA算法概述
IDEA是一个迭代分组密码,分组长度为64比特,密钥长度为128比特。IDEA的软件实现速度与DES差不多。但硬件实现速度要比DES快得多,快将近10倍。设计者们声称由ETH Zurich开发的一种芯片,采用IDEA算法的加密速率可达到177M比特/秒。
IDEA密码中使用了以下三种不同的运算:
逐比特异或运算;
模2加运算;
模2+1乘运算,0与2对应。
IDEA算法是由8圈迭代和随后的一个输出变换组成。它将64比特的数据分成4个子块,每个16比特,令这四个子块作为迭代第一轮的输出,全部共8圈迭代。每圈迭代都是4个子块彼此间以及16比特的子密钥进行异或,MOD2加运算,MOD2+1乘运算。任何一轮迭代第三和第四子块互换。该算法所需要的"混淆"可通过连续使用三个"不相容"的群运算于两个16比特子块来获得,并且该算法所选择使用的MA-(乘加)结构可提供必要的"扩散"。 I
IDEA现状
IDEA有大量的弱密钥,这些弱密钥是否会威胁它的安全性还是一个迷。IDEA密码能够抵抗差分分析和线性分析。
设计者Lai认为IDEA不是一个群,但目前仍未得到证实。
Eurocrypt'97会议上给出了两种新的攻击低圈IDEA的方法,第一种攻击方法可破译大约3·5-圈的IDEA;第二种攻击方法可破译大约3-圈的IDEA。但从分析结果来看,这两种攻击方法并未对IDEA的安全性构成威胁。
其它分组密码简介
随着DES的逐渐衰老,分组密码的研究也在不断深入。在DES之后,近年来国际上又相继提出了多种新的分组密码体制,在这些分组密码中,有的已被破译,有的仍具有较高的安全性。下面对这此算法作一简介。
近年来出现的一些分组密码体制
分组密码 密钥组位长度(比特) 明、密文组位长度(比特) 迭代次数(次)
DES(美国) 56 64 16
FEAL-8(日本) 64 64 8
LOKI(澳大利亚) 64 64 16
Khufu Khafre(美国)512 64 ...
IDEA(欧洲) 128 64 8
FEAL-8密码
FEAL密码算法家族是日本NTT(日本电报电话公司)的清水(Shimizi)和宫口(Miyaguchi)设计的。作为一种分组密码,与DES相比其主要想法为增加每一圈迭代的算法强度,因此可以通过减少迭代次数而提高运算速度。
FEAL-8即为8圈迭代的FEAL密码算法。FEAL密码算法推出之后,引起有关专家的注意。密码专家比哈姆和沙米尔利用养分密码分析技术发现,可以用比穷举法更快的速度破译FEAL密码。如FEAL-8只需2000个选择明文即可破译,而FEAL-4更只需8个精心选择的明文便可破译。
目前,FEAL已经取得了专利。
LOKI算法
LOKI算法作为DES的一种潜在替代算法于1990年在密码学界首次亮相。LOKI同DES一样以64位二进制分组加密数据,也使用64位密钥(只是其中无奇偶校验位),所有64位均为密钥。LOKI密码公布之后,有关专家对其进行了研究破译并证明不大于14圈的LOKI算法极易受到差分密码分析的攻击等。不过,这仍然优于56位密钥的DES。LOKI较新的成果版本是LOKI-91。
LOKI尚未取得专利,任何人都可以使用该算法。有意在商用产品中使用设计者基准方案的人士,可以与澳大利亚堪培拉国防学院计算机科学系西特拉德主任联系。
Khufu和Khafre算法
1990年由默克尔(Merhie)设计的这对算法具有较长的密钥,适合于软件实现,比较完全可靠。Khufu算法的总体设计同DES,只是拥有512位(64字节)的密钥。Khafre算法与前者类似,预定用于不能预先计算的场合。由于Khufu算法具有可变的S盒,可以抵抗差分密码分析的攻击。据了解目前尚无以该算法为目标的其它密码分析成果。
这对密码算法都已取得专利,算法的原码在专利之中。对使用这对算法感兴趣的人士,可以与施乐(Xerox)公司专利许可证发放部的彼得(Petre)主任联系。
SAFER K-64算法
SAFER K-64是Massey于1993年提出的一种面向字节的迭代分组密码,它的分组长度和密钥长度均为64比特。SAFER K-64既适合于硬件实现又适合于软件实现。1995年Massey将SAFER K-64的密钥长度修改为128比特。设计者建议使用6-圈SAFER K-64,实际上,它可以是任意圈。每一圈都使用了两个面向字节的不同的非线性变换,两个64比特长的子密钥和一个三级线性层的伪Hadamard变换。伪Hadamard变换的作用是实现"扩散"。最后一圈末,再经过一个输出变换形成密文。
SAFER K-64是一种Markov密码,而Markov密码关于能抵抗差分分析的能力的研究已有一些成果。Massey认为6-圈SAFER K-64就能抵抗差分分析。关于该算法的安全性的讨论目前还很少。
SAFER K-64的密钥方案存在着某些弱点,但还未对它的安全性构成威胁。
RC5算法
RC5算法是Rivest于1994年提出的一个新的迭代分组密码,但它不是Feistel型密码。
它的特点是:分组长度W,密钥长度b和圈数r都是可变的。简记为RC5-W/r/b。该密码既适合于硬件实现又适合于软件实现,实现速度非常快。它主要通过数据循环来实现数据的扩散和混淆。每次循环的次数都依赖于输入数据,事先不可预测。
目前只有少数几篇论文对RC5的抵抗差分分析和线性分析的能力作了分析。分析结果表明,12-圈的RC5就可抵抗差分分析和线性分析。
RC5是利用数据循环的观点设计的一种密码算法,那么利用这种观点设计密码算法是否成功还有待于进一步探讨。
Skipjack算法
Skipjack算法是NSA为Clipper和Capstone芯片开发的一个加密算法。该算法从1985年开始设计,于1990年完成,1993年将告知众人,但算法一直保密,没有公开。只知道该算法是一个32-圈的分组密码,分组长度为64比特,密钥长度为80比特。加、解密的运行速度非常快。
Skipjack算法仍未公开,这就引起了人们的强烈不满。尽管NIST声称Skipjack算法比DES多么安全,用穷搜索破译它有多么难,但许多人对Skipjack算法的安全性仍表示怀疑。也有人怀疑Skipjack算法可能有陷门。
其它分组密码算法
除了上面介绍的算法外,还有一些分组算法,诸如,RC2,FEAL-N,REDOC-II,LOKI,COST,Blowfish,Crab,Khufu,Khafre,MMB,3-WAY等。在这里我们不可能作逐一介绍,对这些算法感兴趣的读者可在Schneier所著的《Applied Cryptography:Protocals,Algorithms,and Source Code in C》一书中找到。
关注新的加密标准(AES)
从分组密码的参数来看,它的两个重要参数即分组长度和密钥长度有增长的趋势。这主要取决于计算机的处理能力和计算能力。
从分组密码的应用来看,它的应用将更加广泛。从国家的重要机构到个人都有使用分组密码的要求。
从分组密码的研究来看,随着美国新的数据加密标准的出现,分组密码的研究将会掀起新的浪潮。
AES发展过程
在DES每隔五年的评估会议中,最后一次在1998年美国政府终于签署了不再继续延用DES作为联邦加密标准,就也就表明了DES将退出加密标准的舞台,而新的标准AES(Advanced Encryption Standard)将粉墨登场。
1997年4月15日,美国国家标准和技术研究所(NIST)发起征集AES (Advanced Encryption Standard)密码算法的活动。
1997年9月7日,NIST公开发表了面向公众、科研机构、工业界以及政府机构的AES侯选算法征集书,请社会各界提供AES的侯选算法,以便从中筛选出符合要求的算法作为AES正式算法使用。NIST发起这次征集的主要目标,是为AES选定一种能在近期内代替DES、公开的、能够很好地保护政府的敏感信息直到下个世纪的算法,强度应不低于3重DES,而且实现效率要比3重DES高。
NIST对AES侯选算法有三条基本要求:
(1)是对称密码体制,也即秘密密钥算法;
(2)算法应为分组密码算法;
(3) 算法明密文分组长度为128比特,应支持128、192、256比特的密钥长度;
由此可见,AES算法的密钥长度比起DES的56比特要长的多,EFF的DES破译机要搜索长度为128比特以上的密钥其能力还远远不够。
1997年9 月12月在联邦登记处(FR)公开发布了征集AES候选算法的通告。并提出了对AES的基本技术要求,即候选算法要比三重DES快,与三重DES一样安全,分组长度为128比特,密钥长度为128、192和256比特。
1998年8月,NIST召开了第一次AES候选会议,宣布对15个候选算法的若干讨论结果。作为第一轮评测的候选算法情况是:其中5个来自美国(HPC、MARS、RC6、SAFERT和TWOFISH);2个来自加拿大(CAST-256和REAL);澳大利亚(LOK197)、比利时(RIJNDAEL)、哥斯达黎加(FROG)、法国(DFC);德国(MAGENTA)、日本(EZ)、韩国(CRYPTON)和挪威(SERPENT)各一个。
第一轮评测1999年4月15日结束,并开始第二轮评测。这次评测将从15个候选算法中选出5个,这5个候选算法为:MARS、RC6、Rijndael、Serpent、Twofish。最后再在这5个优选算法中评选出一个算法作为正式的AES标准,计划在2001年正式出台。
而最新的消息2000年的10月,美国政府通过公开招标选定了新的加密算法Rijndael作为其高级加密标准(AES),该方案是由两位比利时工程师提交。
这两位中标人分别是ProtonWorldInternational的JoanDaemen和天主教大学电子工程系的VincentRijmen。
贸易部负责技术的官员CherylShavers说,新的高级加密标准(AES)可支持128、192和256位的密钥,并且将取代现在的数据加密标准(DES),DES仅支持56位的密钥。
国家标准局的当前任务是在2001年2月前,草拟AES联邦信息执行标准供公众审查和评定。新标准计划将在2001年二季度正式公布施行。
最新的AES标准-Rijndael
NIST已经选择了Rijndael作为推荐的AES算法。这种算法的设计者建议用这样发音来读Rijndael:Reign Dahl、Rain Doll、Rhine Dahl。两位开发者都是来自比利时的密码专家:国际质子中心的Joan Daemen (Yo'-ahn Dah'-mun)博士和Vincent Rijmen (Rye'-mun)博士一位来自Katholieke大学电子工程系的博士后研究员。这两位在密码学界都有一定的知名度。
NIST的AES标准选择小组撰写了有关AES的开发报告,这是一个很综合涉及面广的报告。报告中对于各种有关AES的版本进行探讨,罗列了一些自公开试行时的分析和评论。总结了五个最后入围的有关算法的特点,对照和比较了他们的优缺点,表明了NIST对于Rijndael的选择。
宣布新的AES标准标志着四年来美国政府与私人企业及来自世界各国学术机构共同合作开加密技术已经达到了顶峰,这些加密技术将有成百上千人使用的潜力。NIST预言将会在国内和国际上更广泛地应用。
为什么NIST选择Rijndael作为AES标准,全面的考虑,Rijndael是将安全、高效、性能、方便的使用及灵活性集于一体,这使它成为AES的合适选择。特别指出的是,Rijndael在不同硬件和软件运行环境下表现出始终如一的良好性能,而无论这些环境是否有反馈模式,它的密钥设置时间相当出色,密钥的灵敏性也不错。Rijndael对于内存要求可以很低,这使得它可以广泛使用与空间上受限制的环境,在这样的环境下它仍然可以表现出出色的性能。Rijndael的操作可以很容易的抵御时间和空间上的攻击。另外,在提供这些保护的同时也并没有影响Rijndael的性能。从分组长度和密钥长度的观点来看,Rijndael设计带有灵活性,同时这种算法也允许一定循环次数的修正,但这个特点还需进一步研究,在现在还不被认同。最后要说的,Rijndael内部循环结构使得它表现出有益于并行水平结构的很好的潜能。
从安全的观点来看,NIST在它的报告中指出,这五种算法作为AES标准都有其合适的安全性能。但这并不表明除Rijndael外的其他四种算法有什么不当之处,当把多种分析小组对它们的评价也作为考虑之列时,NIST小组感觉还是把Rijndael作为AES更为合适。NIST考虑过选择复合函数作为AES的可能性。因为大家曾广泛讨论过复合算法的课题。在公开评审期间评审争论都是有关或赞同或反对把复合算法作为标准。NIST的AES评选小组认为这些评论探讨优先于算法的评估。概括的讲,AES评选小组决定选择一种算法有几个原因,首先,其他赞同的算法如(3-DES)提出了对系统的弹性要求,会因为成为AES而变成一个问题;其次,复合AES的密钥程度对提高安全等级;第三,单一的AES算法会促进共同的操作性来减少应用的复杂性,这种应用也同样遵从于AES的特殊范例,比起复合AES算法也更能在实施中带来较少的花费;第四,考虑到潜在的知识产权问题,费用问题,单一的AES算法也保护了设计者的利益。
NIST 对Rijndael算法不会做改动,比如增加循环的次数。早在NIST的AES选择小组对最后的5个入围者评审之前,他们就讨论是否对于某一种或几种算法的循环次数进行改变的问题。这个问题在提交给公众评论期间就提出了。一些公众评议表明了改变循环次数的特别理由,但大多数并没有提出什么理由来。似乎也没有达成有关算法,循环次数应该改变的协议。(即使达成了也没有确切指出应如何改变)。NIST小组认识到改变循环次数可能会削弱大量分析的有效性,而这种分析两年前就已开始。对于一些算法来说,如何用循环次数的不同完全定义一个算法并不十分清楚。同样也不十分清楚这种改变对于完全性的影响。另一个问题是,没有一个算法的研究者打算改变他们算法中的循环次数。而是在1999年夏天曾允许他们对自己的产品进行一些改动。基于这么多原因,NIST的AES小组还是决定在保持5个算法原有风貌上对其评估继而进行选择也许是更合适的。
NIST将会继续对Rijndael的密码分析进行研究、开发,同时对于其他标准密码算法也会进行研究。一旦AES成为官方标准,那么每5年便会对其评估一次,在合适的时候考虑到一些特殊环境,对于标准的修改工作也将会进行。当需要立即引起注意的问题出现时,NIST会迅速行动,并考虑各种可选择的算法。
可以预言在Rijndael公布不久,应用Rijndael的商用产品会很快出现。然而从时间表上看,AES直到2001年才会成为官方标准,当AES成为官方标准,NIST就会对应用Rijndael的产品进行测试。
对于Rijndael算法和利用它的相关信息,我们还将继续进行关注。以上的Rijndael内容因为从网站中的英文资料中获得,准备仓促,有不正确的地方还请大家指教。
一种相对比较新的技术--椭圆曲线加密系统,已经逐渐被人们用做基本的数字签名系统。椭圆曲线作为数字签名的基本原理大致和RSA与DSA的功能相同,并且数字签名的产生与认证的速度要比RSA
太好了 关于椭圆曲线还有更细的资料嘛?
我最需要有限域gf(2^m)就是2的m次方的资料
目前在座 多项式乘法和摸除 |
|