1、PKI 相关密码体系学习总结王文路前言1883 年荷兰语言学家和密码学家 Dr. Auguste Kerckhoffs 发表了著名的Kerckhoff 原则,就是密码系统的安全性只能依赖于密钥,不能依赖于算法或者系统的任一部分。1 对称密钥算法对称密钥算法(Symmetric-key algorithms)指的是通信双方都掌握一个密钥,加解密都由这个密钥完成的密码算法。对称加密算法分为分组密码(block cipher 也叫块状密码)算法和序列密码(stream cipher 也叫做流密码)算法。分组密码算法中几个主要的是:DES 算法、3DES 算法、R5 算法、AES 算法和IDEA 算法
2、;序列密码算法中几个主要的是:R4 算法和 SSF33 算法(国家商密)。1.1 DES 算法1.1.1 产生背景1973 年 5 月 15 日,当时美国的国家标准局(NBS)就是现在的美国国家标准与技术研究所(NIST)在联邦公报上公开征集标准密码算法,他们制定了一系列的设计准则,除了安全性,易于理解,适合应用,可以出口等等以外,最重要的是算法的安全性必须依赖于密钥,而不依赖于算法,这个即著名的 Kerckhoffs 原理的观点。是这次的结果不尽人意,1874 年 8 月同样的机构在同样的地方以同样的方式发布了同样的内容,最后他们收到了一个来自 IBM 的算法就是后来的 DES,这个算法由同
3、样来自 IBM 的算法 Lucifer(路西法)发展而来,这群发明这个算法的 IBM 的人员中,有个叫做 Horst Feiste,他出生在柏林,二战时期来到美国,以他名字命名的分组密码著名的 Feistel 网络结构(一种设计分组密码的通用构造) 。而这个算法被改进之后成为 DES(Data Encryption Standard 数据加密标准)的算法。1.1.2 算法描述对称密码算法的算法描述相对较长,但是阅读算法的数学知识使用较少。DES 是对 64 位的明文块进行加密。加密过程分为四步:生成子密钥( subkey) 、明文的初始置换、经过加密函数(S 盒和 P 盒) 、末置换。首先理解
4、一个概念:置换。有一组数据要经过置换表的置换生成一组新数据,例子如下:一组数据为 010110,置换表为, 然后经过置换后的数据的第一位是原数据的第二位就是 1,第三位是原数据的第四位就是 1,这样经过置换之后的数据就是 101010,这样置换就完成了,下面我们进行 DES 的加密过程。一、生成子密钥DES 使用的密钥也是 64 位的数(就是 01001这样的数值) 。 去掉每个字节的第八位,因为每个第八位是用于奇偶校验的(parity check bits) ,经过一个密钥选择(这里是一个置换,所谓的 PC-1)得到一个 56 位的值(那些第八位都去掉了) ; 将这个 56 位的值分成前后
5、28 位,按照移位表(这个表只有 16 个值,为 1122222212222221)各进行前后 1 或 2 位的 16 轮移动,每次移动的结果都进行合并得到 16 组 56 位的值; 对这 16 组 56 位的值分别进行压缩置换(所谓的 PC-2,一种置换按照表里的位置放置数据,没有提到的数据将被略去,这个表是 48 个项的表, ,有 8 个位置没有在这个表中列出)得到 16 组 48 位的数,就是 16组 48 位的子密钥 K1、K 2、K 16(这里从 1 开始计) 。二、明文的初始置换(initial permutation,IP 置换)现在开始对明文进行操作,对 64 位的明文按照 I
6、P 置换表进行置换得到的还是 64 位的数据(这里没有什么奇偶校验的东西) ,然后把这个值分成左 32 位和右 32 位的两个值 L0 和 R0,这里的数字 0(第一个不是 1 而是 0)代表对明文经过 IP 置换后进行的 16 轮重复运算的第 1 轮。之前我们计算得到的 16 个子密钥 k1、k 2、k 16 将按照轮数参加到各轮的计算中。三、经过加密函数 F 的运算F 意思指 Feistel 网络(见 1.1.3)中的函数,F 的输入为 Ri-1 和子密钥 Ki。 扩展置换先对 Ri-1 (32 位)进行扩展置换,规则如下:先对这 32 位进行 4 位 4 位的分组,每个 4 位输入分组的
7、第 1 位和第 4 位分别表示输出分组的两位,而第 2、3 位表示一位,这句话不好理解,通俗点讲就是第 1 位和第 4 位重复两次,例如序号 1 2 3 4 输出后为 1 1 2 3 4 4 这样扩展之后 32 位的 Ri-1变成了 48 位,然后将这 48 位的输出值与子密钥 Ki(它也是 48 位)进行异或运算(运算符号为) ,得到的结果要进行 S 盒(substitution boxes)替代。 S 盒替代2 1 46 5 3这里经过与 Ki 异或后的 48 位值进行分组,以 6 个为一组,自然分 8组,对应着 8 个 S 盒进行操作,这里 8 个 S 盒每个 S 盒是个 4 行 16
8、列的替代表,给个例子:S 盒 6(第 6 个 S 盒):12 1 10 15 9 2 6 8 0 13 3 4 14 7 5 1110 15 4 2 7 12 9 5 6 1 13 14 0 11 3 89 14 15 5 2 8 12 3 7 0 4 10 1 13 1164 3 2 12 9 5 15 10 1114 1 7 6 0 8 13注意到每行都是 0 到 15 的一个排列,为什么这个 S 盒这么设计,由于原因过度的复杂,我们这里不做讨论,但是知道这样子很安全。回来说 S 盒的替代,举个 S 盒替换的例子,经过分组后的第 6 组为 110011,它是第 6 组,自然针对 S 盒 6
9、 进行操作, 110011 为输入,1、6 位是 11,对应 S 盒 6 的第 3 行(从 0 开始计,如果 1、6 位是 00 就对应第 0 行,是 01 就对应第 1行) ,中间的 1001 为 9,即第 9 列(当然也是从 0 开始计的) ,找到 S 盒 6中的 这个位置的数:14 转化为布尔值是 1110,那么经过 S 盒 6 替代之后的输出就是 1110,代替之前那个与 ki 异或之后的值的第 6 组(即110011) ,这样子 6 位的输入经过 S 盒替代之后变为 4 位,那么 8 组数经过8 个 S 盒替代就是 32 位的值,这个 32 位的值马上要进行 P 盒置换。 P 盒替代
10、这个置换是直接置换,即没有省略和重复的置换,这样得到的还是一个 32位的值。 (这步相对简单)这一系列动作完成后,将这个 32 位值与 Li-1(这里才用到 Li-1)异或运算得到一个新的 32 位分组就是 Li,而 Li-1 的值原封不动地成为 Ri,这时新出现的Li 和 Ri 就要开始新的一轮运算了。四、末置换(final permutation,即 FP 对应一开始的 IP)在 DES 的最后一轮后,左半部分和右半部分并未交换,而是将 R16 和 L16直接合并在一起形成一个分组作为末置换的输入,末置换是初始置换的逆运算即 IP-1,这时候得到的 64 位的数值即为密文!解密和加密使用相
11、同的算法,二者的唯一区别在于子密钥的次序相反,如果各轮加密的子密钥分别是 K1、K 2、K 1 那么解密的子密钥就是K16、K 15、K 1。1.1.3 Feistel 网络在密码学中,有相当大比例的分组密码算法使用这个以 IBM 的 Horst Feistel 的大叔命名的构造进行设计。这个网络最早出现在 IBM 的 Lucifer(路西法)算法中,这个网络的设计者是 Horst Feistel 与 Don Coppersmith(DES 算法的设计者之一) 。Feistel 网络的思想是,取一个长度为 n 的分组(n 为偶数) ,然后分成长度为 n/2 的两半部分:L 和 R,这样就可以定
12、义一个迭代型的分组密码算法,其第i 轮的输出取决于前一轮的输入:Li=Ri-1Ri=Li-1F(R i-1,K i)其中 Ki 是第 i 轮使用的子密钥, F 是任意一轮的轮函数。该函数保证了它的可逆性,异或被用来合并左半部分和轮函数的输出,于是它肯定满足:Li-1F(R i-1,K i)F(R i-1,K i)=L i-1加解密过程如图:使用 Feistel 网络或者基于 Feistel 网络设计的算法如下:Lucifer、DES、Triple DES、Blowfish 、RC2、RC5、COST_28147-8、Camellia、CAST-128、FEAL、ICE、KASUMI、LOKI9
13、7、MAGENTA、MISTY1、TEA、MARS、Twofish、RC6、XTEA、CAST-256、MacGuffin 、Skipjack1.2 三重 DES 算法1.2.1 算法描述由于 DES 的密钥长度过短(只有 56 位) ,人们尝试简单地对数据进行多遍加密,不幸的是仅仅应用两遍的 DES 的结果和 DES 安全性一样,一种叫做中间相遇攻击(meet-in-the-middle,或者叫做中间位面攻击)的方式可导致使用和攻破 DES 一样的时间攻破两遍 DES,因此,不得不出现三重 DES(Triple DES) ,而 3DES 的有效强度是 112 位,这只是原本天真的期望两遍 D
14、ES 所具有的强度。3DES 目前的流行方式是加密解密加密( EDE)的模式,这种模式和加密加密加密(EEE)的安全性一样,而且在三个密钥改成一个话,就等同于单次 DES。这种 3DES 的方式被引用为 3DES-EDE:加密过程:MDES E k1DES D k2DES E k3C解密过程:CDES E k3DES D k2DES E k1M这里的三重 DES 又分两种,即 2TDS(2-key Triple DES,即 k1=k3)和3TDES(3-key Triple DES,即三次使用的密钥各不相同) ,这里建议 3TDES。3DES 拥有 192 位密钥资料(168 位密钥和 24
15、位的奇偶校验位) ,但是只有112 位的安全强度。1.2.2 使用领域IPSec 和 SSL 以及各种实用分组密码算法的地方大部分都采用 DES 或者3DES 算法。1.3 RC2、RC5、RC6 算法“RC”系列密码由 Ron Rivest(全名 Ronald L. Rivest)设计, “RC”代表“Rivest Cipher”或者“Rons Code”,Ronald L. Rivest ,2002 年图灵奖得主,美国国家工程院院士,美国国家科学院院士,美国计算机协会院士,国际密码研究学会院士,美国艺术与科学院院士。RC1 只存在在 Rivest 的记事本上,而RC3 在他发明之后就被自己
16、破解了,觉得不能拿出去丢人,就没发布。RC2、RC5 和 RC6 都是分组密码算法,而 RC4 是序列密码算法(见 1.6) 。RC2和 RC4 算法都是 RSA 公司的商业秘密,但是后来都被匿名人士找出来放在互联网上,算法被公开。1.3.1 算法描述RC2 加密算法RC2 的一轮加密RC2 是设计成取代 DES 的一种密钥长度可变的 64 位分组密码,也是Feistel 网络的结构。在 SSL 中使用 128 位的密钥和 128 位有效密钥长度。现在的 IBM Lotus Notes 也有应用 128 位的 RC2 加密算法。R5 加密算法RC5 的一轮加密RC5 算法的设计类似 Feist
17、el 网络,它更加灵活,它是参数变量的分组密码算法:分组大小(32、64 或者 128bits) 、密钥大小( 02040bit 推荐 128bit)和加密轮数(0255) ,这三个参数都是可变的。RC5 加密算法使用了三种运算:异或() 、加(+)和循环(Enc C10 Key-Enc C10| | | | | | |取最左一个字节 | 取最左一个字节 | | | | | | |P10XOR - -C 10 C10 XOR-P 10加密过程 解密过程8 位 CFB 模式对 P10的加解密CFB 模式也需要 IV(寄存器的前几位的产生) ,但是 CFB 模式下的 IV 必须唯一。1.6.5 O
18、FBOFB(output-Feedback,输出反馈模式)OFB 与 CFB 模式极其相似,但是它移位寄存器中的数和明文密文没有任何关系(离线的) ,寄存器中的数据作为加密函数的输入,加密之后取这个加密输出的最左一个字节(8 位 OFB 的情况下)有两个用处:一个是与明文块进行异或运算产生密文(密文只是异或产生的) ,另一个返回到移位寄存器的最右端进行下一次操作。这里与明文进行异或运算的移位器数据的加密输出称为密钥流。n 位的 OFB 定义如下:Ci=PiS i;S i=EK(S i-1)这里的 Si 就是密码流。S2|S3|S4|S5|S6|S7|S8|S9 | S2|S3|S4|S5|S6
19、|S7|S8|S9 - | - | | | | | | |Key-Enc |S10 Key-Enc |S10| | | | | | |取最左一个字节 | 取最左一个字节 |_| |_ | | P10 XOR-C 10 C10 XOR-P 10加密过程 解密过程8 位 OFB 模式对 P10的加解密OFB 模式没有错误扩散,密文的单个错误只引起恢复明文的单个错误。1.6.6 CTRCTR( counter mode,计数模式)同 OFB 一样,CTR 模式也是一种流密码模式,但是它生成密钥流的方式很是简单,就是使用瞬时值与计数值连接起来,然后对其加密就产生密钥流的一个密钥块。然后这部分与明文块进
20、行异或就产生密文。定义如下:Ki=EK(Nonce| i ); Ci=PiK iNonce10 Counter10 Nonce10 Counter10 - - | | | |Key-Enc Key-Enc | | | | P10 XOR- C10 C10 XOR-P 10加密过程 解密过程CTR 模式也没有错误扩散,可以分布式计算,其安全性依赖于加密算法和系统提供的唯一瞬时值。1.7 RC4 算法1.7.1 算法描述RC4 算法是目前所知应用最广泛的对称序列密码(流密码)算法,该算法以 OFB 方式工作,密钥流与明文相互独立,这里在了解 OFB 的工作模式后,对 RC4 的具体算法不做描述,R
21、C4 广泛应用于商业密码产品中。2 摘要算法2.1 哈希(hash)函数密码学的哈希(hash)函数(也被叫做杂凑函数或单向散列函数)H(M) ,作用于任意长度的输入 M,输出为固定长度的值 h 的函数,h 叫做哈希值(hash value,也称为摘要或者校验和) 。密码学的哈希函数 H(M)被要求有如下特性: 给定 M,很容易计算出 h,但是给定 h,通过 H(M)计算出 M 很难; 对于给定的 M,找到另外一个不同的 M满足 H(M )=H(M)很难; 找两个随机的不同的输入 M 和 M,满足 H( M)=H(M)很难(防碰撞,collision resistance ) 。2.1.1 压
22、缩函数大部分的哈希函数是建立在压缩函数的思想上的,压缩函数的输入是消息分组和文本前一分组的输出,输出是到该点的所有分组的散列,即分组 Mi 的散列为 hi=f(M i,h i-1) 。2.1.2 生日攻击房子里面应有多少人才有可能使至少一人与你的生日相同?答案是 253.既然这样,那么应该多少人才能使他们中至少两个人的生日相同呢?答案出乎意料地低:23 人。对于仅有 23 人的屋子里,仍有 253 个不同对的人。寻找两个随机的具有相同生日的两个人类似于寻找两个随机的 M 和 M,满足 H(M)=H(M ) ,这种攻击方式叫做生日攻击(birthday attack) 。假设一个哈希函数是安全的
23、,而且攻击它最好的方式穷举攻击,其输出为m 位的值,那么寻找一个输入,使其哈希值等于 m 需要计算 2m 次;而寻找两个输入具有相同的哈希值仅需要实验 2m/2 个随机的数。意味着如果让对手破译系统的可能性低于 1/280,那么应该使用 160 位的哈希函数。2.2 MD2、MD4 和 MD5MD2、MD4 、MD5 都是 Ron Rivest 设计的摘要算法,MD 意思为消息摘要(Message Digest) ,这三个算法都是产生 128 位的摘要值,但是 MD2 专门为 8位的机器做过优化,它的安全性依赖于字节(byte,8bits )之间的随意置换(细节略去) 。MD4 算法设计并公布
24、出来后,广大的密码分析学家对这个算法进行了破解,这个算法共三轮加密,但是前两轮和后两轮均被成功的攻击。Ron Rivest 马上改进了该算法就是 MD5.MD5 算法以 512 位分组来处理明文,每一组又划分为 16 个 32 位的子分组,输出由 4 个 32 位的分组构成并级联成为一个 128 位的摘要。首先填充消息使其长度恰好为一个比 512 的倍数仅小 64 位的数。填充方法是附在一个 1 在消息后边,后接要求的多个 0,然后在其后附上 64 位的消息长度(填充前的) 。这两步的目的是使消息长度恰好为 512 位的整数位,同时确保不同的消息在填充后不相同。这四个 32 位变量初始化为:A
25、=0x01234567B=0x89abcdefC=0xfedcba98D=0x76543210这些值被称为链接变量, (“0x”为十六进制前缀)然后进行算法的主循环,循环次数是填充后的消息中 512 位消息分组的数目。主循环有四轮(MD4 只有三轮) ,每轮很相似但是不完全一样,主循环如下图:MD5 主循环每一轮进行 16 次操作,每次操作对 A、B、C 和 D 中的其中三个作一次非线性函数运算,然后将所得结果加上第四个变量,以及文本的第一个分组和一个常数。再将所得结果向右移动一个不定的数,并加上 A、B 、C 或 D 中之一,最后用该结果取代 A、B、C 或 D 中的之一。以下为加密中用到的
26、四个非线性函数(每轮一个,即第一轮使用 F,第二轮使用 G,第三轮使用 H,第四轮使用 I):其中为异或,是与,是或,是反。如图为一次操作(每轮 16 次):MD5 的一个操作过程(一次主循环要 64 次操作)所有的操作完成后,把最开始的 A、B、C、D 分别加上生成的A、B、 C、D ,然后作为下一分组的继续运行算法。2.3 SHA-1美国国家标准和技术研究所(NIST)和美国国家安全局( NSA)共同设计了用于安全散列标准(SHS )的安全散列算法(或安全哈希算法)SHA ,但是它有一个缺陷,NSA 随后改正了这个缺陷,现在见到的标准中的算法 SHA-1,SHA-1 与 MD5 很相似,也
27、是基于 MD4 改进的, SHA-1 有由 5 个 32 位的字组成的 160 位的状态,产生 160 位的散列值(或叫哈希值) ,SHA-1 总共也有 4轮3 公共密钥算法3.1 数学基础3.1.1 素数的模运算设 p 是素数,进行素数的模运算时,只需要使用 0,1,p-1 这些数。素数模的基本规则是,把这些数作为整数进行运算,但是每一次的结果 r 都要对 p 进行模运算。取模运算就是用 p 除以 r,丢弃所得的商,而把余数作为答案。例如:对 25 做模 7 运算,就是用 7 除 25,得到商为 3,余数为 4。余数就是答案,于是(25 mod 7)=4。由于模运算很常用,所以当表示方程的所
28、有运算都是取模 p 运算的时候,整个方程的书写都没有体现出任何模运算,只是把(mod p)加在方程的后面。3.1.2 三个数学难题大整数因数分解问题 给定两个素数(质数)p,q,计算乘积 p*q=n 很容易; 给定整数 n,求 n 的素因数 p,q 使得 n=p*q 很难。离散对数问题已知有限循环群 G=k=0,1,2,及其生成元 g 和阶 n=|G|。 给定整数 a,计算 ga=h 很容易; 给定元素 h,计算整数 x,0xn,使得 gx=h 非常困难。椭圆曲线离散对数问题已知有限域 Fp 上的椭圆曲线群E(Fp)=(x,y)|F pFp,y2=x3+ax+b,a,bFpO及点 P=(x,y
29、)的阶为一个大素数。 给定整数 a,计算点 aP=(xa,ya)=Q 很容易; 给定点 Q,计算整数 x,使得 xP=Q 非常困难。3.2 密钥确立的方式3.2.1 RSA 算法共享会话密钥RSA 算法是由 Ron Rivest, Adi Shamir, 和 Leonard Adleman 在 1977 年发明的算法描述选取两个大素数 p,q(这两个数必须保密),为了安全性,可使这两个数长度一样,然后得 n=p*q;选取随机的数 e(加密密钥) ,使 e 与(p-1)(q-1)互素(互质) ;计算解密密钥 d:使得 e*d1mod(p-1)(q-1) ,即求 e 模(p-1)(q-1)的唯一逆
30、元,求得 d=e-1 mod (p-1)(q-1)为解密密钥;这里 n,e 为公钥; n,d 为私钥。使用过程对于明文 M 的一个分组 Mi,进行加密得密文 Ci: Ci=Mie mod n ;解密:M i=Cid mod n (这一步在数学上可以得到证明) 。这样描述算法是在假定消息是一个数字,但是实际上,消息往往是一组字串,因此必须使用一些规则将字串转换为数字,这个数字应该多少与 n 的大小相当(但是不能比 n 大) ,以确保 Men,否则 C=Me mod n =Me (即 mod n 没起作用)。PKCS#1 中规定了如何完成此类转换的标准过程。虽然 RSA 也可以加密数据,但是相对于
31、对称加密算法来说,它的加密速度过于慢,于是利用 RSA 的方式来共享加密密钥(会话密钥) ,首先产生一个随机的会话密钥,经过适当的填充后,使用接收方的公钥进行加密,然后接收方再利用自己的私钥对消息进行解密,去掉填充字节之后等到会话密钥。3.2.2 DH( Diffie-Hellman)密钥交换Diffie-Hellman 算法是个首个公开(1976 年)发表的公共密码算法,很明显这个算法是 Whitfield Diffie 和 Martin Hellman 发明的,它是一种密钥协商算法,发送方不是产生一个密钥并针对接收方进行加密,而是由发送方与接收方共同产生一个对他们来说是私有的密钥,发送与接
32、收方共同拥有这个密钥对,要想计算出协商后的密钥,只要发送方组合使用其私用密钥和接收方的公用密钥,或者接收方组合使用其私用密钥和发送方的公用密钥。首先,Alice 和 Bob(这两个人名是在密码协议讲解中普遍使用的人名)协商出一个大的素数 n 和 g,g 是模 n 的本原元。这两个数不必是秘密的,因为这两个数要在不安全的途径上传递。 Alice 选取一个大的随机整数 x,计算 X=gx mod n 并发送给 Bob; Bob 选取一个大的随机整数 y,计算 Y=gy mod n 并发送给 Alice; Alice 计算 k=Yx mod n=gxy mod n; Bob 计算 k=Xy mod
33、n=gxy mod n。在线路上的窃听者只知道 n,g,X 和 Y,除非他能计算离散对数,恢复出x,y,否则无济于事。3.2.3 EIGamal 加密算法Taher Elgamal 是美籍埃及人,著名的密码学家, EIGamal 算法以他的名字命名,其安全性依赖于计算有限域上的离散对数的难度(见第二个数学难题) 。选择一素数 p,两个随机整数 g 和 x,g 和 x 都小于 p,计算:y=g x mod p公共密钥是 y,g 和 p,私人密钥是 x。它同 RSA 算法一样可以用来加密也可以用来数字签名。3.2.4 椭圆曲线加密算法ECC( Elliptic Curve Cryptography
34、)基于有限域上椭圆曲线的离散对数计算困难性。1985 年由 Koblitz(美国华盛顿大学) 和 Miller(IBM 公司) 两人提出。定义在有限域(F p 或 F(2m))的椭圆曲线 y2=x3+ax+b 上的点(x,y) ,再加上无穷点O,如按一定的规则运算(估且称为乘法)将组成一个群(数学中的一种代数结构) 。有限域上椭圆曲线乘法群也有相对应的离散对数计算困难性问题(见数学难题三) 。这里对 ECC 的算法不作描述,相对于 RSA 算法 ECC 算法的安全性能更好,处理速度更快,密钥存储空间更小,210 位的 ECC 就与 2048 位的 RSA 具有相同的安全强度。3.3 数字签名3
35、.3.1 与摘要算法一起使用 RSA 进行数字签名RSA 算法进行数字签名,先计算出消息的摘要值(使用 MD5 或者 SHA-1)并用签名者的私钥进行加密(就是签名) ,接收方收到摘要值和签名后使用签名者的公钥对加密的摘要值进行解密,并与摘要值进行匹配,如果相同,则签名是有效的。RSA 签名中不是仅仅对消息摘要值加密,而是加密一个使用 DER 编码的DigestInfo 结构,其中包括以算法标识符表示的摘要算法(MD5 或 SHA-1) 。该结构是一系列特定的字节加上摘要本身的内容。该方式用以防止以下的攻击伪造签名:假设一种广泛用于签名的摘要算法 H1,被彻底破解,有可能产生摘要是给定值的消息
36、,如果我们使用另一种不同的算法强度很好的摘要算法 H2 对消息M 进行摘要签名,而攻击者可以使用 H1(M) =H2(M )的特性产生一个新的消息 M,如果他把我们的签名附加于他产生的消息 M(使用已被攻破的摘要算法 H1进行签名)上,该签名可以通过验证,于是攻击者成功产生了由我们签名但是却是他选择的消息的攻击。3.3.2 与 SHA-1 一起使用的 DSA 算法DSA(Digest Signature Algorithm,数字签名算法)由 NSA(美国国家安全局)发明,并作被标准化为 DSS(Digest Signature Standard,数字加密标准) ,但是 DSS 只能与 SHA-
37、1 一起使用(其实可以与任何 160 位的摘要算法一起使用,只是标准要求使用 SHA-1) 。DSA 算法描述: p 是 L 位长的素数,其中 L 是 512 到 1024 且是 64 的倍数; q 是 160 位长且与 p-1 且与互素的数; g=h(p-1)/q mod p,其中 h 是小于 p-1 并且满足 h(p-1)/q mod p 大于 1 的任意数; x 是小于 q 的数; y=gx mod p; DSS 制定了算法使用的摘要算法为 SHA-1 这里表示为 H(m),这里p,q 和 g 是公共的,私人密钥是 x,公共密钥是 y。DSA 的签名过程: Alice 产生一个小于 q
38、的随机数 k; Alice 产生:r=(gk mod p) mod qs=(k-1(H(m)+xx) mod q r 和 s 就是她的签名,她将它们发送给 Bob。 Bob 通过计算验证签名:w=s-1 mod qu1=(H(m)w) mod qu2=(rw) mod qv=(gu1yu2) mod p) mod q如果 v=r,则签名有效。DSA 签名不包括摘要标识符,无法像 RSA 签名那样防止摘要算法遭破解之后的伪造签名。参考资料应用密码学协议、算法和 C 源程序 (第二版) Bruce Schneier(美)著密码学实践 Bruce Schneier(美),Niels Ferguson( 美) 著SSL 与 TLS Eric Rescoria (美)著信息安全数学基础 陈恭亮 著主要算法流程图来自于 wikipedia(维基百科)http:/en.wikipedia.org/