如果你的新的密码系统的强度依赖于攻击者不知道算法的内部机理,你注定会失败。
最好的算法是那些已经公开的,并经过世界上最好的密码分析家们多年的攻击,但还是不能破译的算法;
第二章:密码协议
协议是一系列步骤,它包括两方或多方,设计它的目的是要完成一项任务。(一次执行、至少2人、完成一个任务;明确、完整、具体)
单向Hash 函数有很多名字:压缩函数、缩短函数、消息摘要、指纹、密码校验和、信 息完整性检验(DIC)、操作检验码(MDC)。Hash 函数 就是把可变输入长度串(叫做预映射,Pre-image)转换成固定长度(经常更短)输出串(叫 做hash 值)的一种函数。Hash 函数是公开的,对处理过程不用保密。单向hash 函数的安全性是它的单向性。无 论怎么看,输出不依赖于输入。预映射的值的单个比特的改变,平均而言,将引起 hash 值 中一半的比特改变。已知一个 hash 值,要找到预映射的值,使它的 hash 值等于已知的hash 值在计算上是不可行的。
下面描述Alice 怎样使用公开密钥密码发送信息给Bob:
(1)Alice 和Bob 选用一个公开密钥密码系统。
(2)Bob 将他的公钥传送给Alice。
(3)Alice 用Bob 的公钥加密她的信息,然后传送给 Bob。
(4)Bob 用他的私钥解密Alice 的信息。
(用自己的私钥解自己的公钥,私钥只有自己知道、原封不动)
在实际的世界中,公开密钥算法不会代替对称算法。公开密钥算法不用来加密消息,而 用来加密密钥。这样做有两个理由:1.公钥算法比对称算法慢,对称算法一般比公钥算法快一千倍。
2.公开密钥密码系统对选择明文攻击是脆弱的。如果C=E(P),当 P 是N 个可能明文集中的一个明文,那么密码分析者只需要加密所有 N 个可能的明文,并能与 C 比较结果(记住,加密密钥是公开的)。用这种方法,他不可能恢复解密密钥,但他能够 确定P。
在大多数实际的实现中,公开密钥密码用来保安全和分发会话密钥。这些会话密钥用在 对称算法中,对通信消息进行保密[879]。有时称这种系统为混合密码系统。
(1)Bob 将他的公开密钥发给Alice。
(2)Alice 产生随机会话密钥 K,用 Bob 的公开密钥加密,并把加密后的密钥 EB(K)送给Bob。
(3)Bob 用他的私钥解密 Alice 的消息,恢复出会话密钥。DB(EB(K))= K
(4)他们两人用同一会话密钥对他们的通信信息进行加密。
使用对称密码系统和仲裁者的文件签名
Alice 想对数字消息签名,并送给Bob。Trent 是一个有权的、值得依赖的仲裁者。他能同时与 Alice 和Bob(也可以是其他想对 数据文件签名的任何人)通信。他和 Alice 共享秘密密钥 KA,和 Bob 共享另一个不同的秘 密密钥 KB。
(1)Alice 用KA 加密她准备发送给Bob 的信息,并把它传送给Trent。
(2)Trent 用 KA 解密信息。
(3)Trent 把这个解密信息和他收到Alice 信息的声明,一起用KB 加密。
(4)Trent 把加密的信息包传给Bob。
(5)Bob 用 KB 解密信息包,他就能读 Alice 所发的信息和 Trent 的证书,证明信息来
自Alice。
(Trent 可以用 KA 解密信息说明信息一定来自Alice,因为只有Alice拥有Ka加密信息)
如果 Bob 想把Alice 签名的文件给Carol 阅读,他不能把自己的秘密密钥交给她,他还 得通过 Trent:
(1)Bob 把信息和Trent 关于信息是来自Alice 的声明用KB 加密,然后送回给Trent。 (2)Trent 用 KB 解密信息包。
(3)Trent 检查他的数据库,并确认原始信息是从Alice 那里来的。
(4)Trent 用他和Carol 共享的密钥KC 重新加密信息包,把它送给Carol。
(5)Carol 用KC 解密信息包,她就能阅读信息和Trent 证实信息来自 Alice 的证书。
使用公钥密码对文件签名
基本协议是简单的:
(1)Alice 用她的私钥对文件加密,从而对文件签名。
(2)Alice 将签名的文件传给Bob。
(3)Bob 用Alice 的公钥解密文件,从而验证签名。
在实际的实现过程中,采用公钥密码算法对长文件签名效率太低。为了节约时间,数字 签名协议经常和单向 Hash 函数一起使用。Alice 并不对整个文件签名,只对文件的 Hash 值 签名。在这个协议中,单向Hash 函数和数字签名算法是事先就协商好了的。
(1)Alice 产生文件的单向Hash 值。
(2)Alice 用她的私钥对Hash 加密,凭此表示对文件签名。
(3)Alice 将文件和 Hash 签名送给Bob。
(4)Bob 用 Alice 发送的文件产生文件的单向 Hash 值,然后用数字签名算法对 hash
值运算,同时用 Alice 的公钥对签名的 Hash 解密。如果签名的 hash 值与自己产生的 Hash 值匹配,签名就是有效的。
用私钥 K 签名信息表示为: SK(M).用相应的公钥验证信息表示为:VK(M).
在签名时,附在文件上的比特串叫数字签名(在上面的例子中,用私钥对文件的单向 Hash 值加密)或者就叫签名。
带加密的数字签名:
(1)Ailce 用她的私钥对信息签名。
SA(M).
(2)Alice 用Bob 的公钥对签名的信息加密,然后送给 Bob。
EB(SA(M)).
(3)Bob 用他的私钥解密。
DB(EB(SA(M)))=SA(M).
(4)Bob 用Alice 的公钥验证并且恢复出信息。
VA(SA(M))=M.
即使公钥存贮在安全数据库中,Mallory 仍能在传送期间用另外的公钥来代替。为了防 止这个问题,Trent 可用他的私钥对每一公钥进行签名。当用这种方式时,Trent 常被称为密 钥鉴证机关或密钥分配中心(KDC)。在实际的实现中,KDC 对由用户名、公钥和其他用 户的重要信息组成的一组信息进行签名。被签名的这组信息存贮在 KDC 数据库中。
计算机中的随机序列产 生器(至少,在有限状态机中)是周期性的,周期性的任何东西都是可预测的。如果是可预 测的,那么它就不可能是随机的。真正的随机序列产生器需要随机输入,计算机不可能提供 这种随机输入。