2.7 带加密的数字签名
通过把公钥密码和数字签名结合起来,我们能够产生一个协议,可把数字签名的真实性和加密的安全性合起来。想象你妈妈写的一封信:签名提供了原作者的证明,而信封提供了秘密性 。
(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.
加密前签名是很自然的。当Alice写一封信,她在信中签名,然后把信装入信封中。如果她把没签名的信放入信封,然后在信封上签名,那么Bob可能会担心是否这封信被替换了。如果Bob把Alice的信和信封给Carol看,Carol可能因信没装对信封而控告Bob说谎。
在电子通信中也是这样,加密前签名是一种谨慎的习惯做法[48]。这样做不仅是更安全(敌人不可能从加密信息中把签名移走,然后加上他自己的签名)。而且还有法律的考虑:当他附加他的签名时,如果签名者不能见到被签名的文本,那么签名没有多少法律强制作用[1312]。有一些针对RSA签名技术的密码分析攻击(见19.3节)。
Alice没有理由必须把同一个公钥/私钥密钥对用作加密和签名。她可以有两个密钥对:一个用作加密,另一个用作解密。分开使用有它的好处:她能够把她的加密密钥交给警察而不泄露她的签名,一个密钥被托管(见4.13)而不会影响到其他密钥,并且密钥能够有不同的长度,能够在不同的时间终止使用。
当然,这个协议应该用时间标记来阻止信息的重复使用。时间标记也能阻止其他潜在的危险,例如下面描述的这种情形。
作为收据的重发信息
我们来考虑这个协议附带确认信息的实现情形:每当Bob接收到信息,他再把它传送回发方作为接收确认。
(1)Alice用她的私钥对信息签名,再用Bob的公钥加密,然后传给Bob。
EB(SA(M)).
(2)Bob用他的私钥对信息解密,并用Alice的公钥验证签名,由此验证确是Alice对信息签名,并恢复出信息。
VA(DB(EB(SA(M))))=M.
(3)Bob用他的私钥对信息签名,用Alice的公钥加密,再把它送回给Alice。
EA(SA(M)).
(4)Alice用她的私钥对信息解密,并用Bob的公钥对验证Bob的签名。如果接收的信息与她传给Bob的相同,她就知道Bob准确地接收到她所发送的信息。
如果同一算法既用作加密又用作数字签名,就有可能受到攻击[305]。在这些情况中,数字签名操作是加密操作的逆过程:VX=EX,并且SX=DX。
假设Mallory是持有自己公钥和私钥的系统合法用户。让我们看看他怎么读Bob的邮件。首先他将Alice在(1)中送给Bob的信息记录下来,在以后的某个时间,他将那个信息送给Bob,声称信息是从Mallory处来的。Bob认为是从Mallory来的合法信息,于是就用私钥解密,然后通过用Mallory的公钥解密来验证Mallory的签名,那么得到的信息纯粹是乱七八糟的信息:
EM(DB(EB(DA(M))))=EM(DA(M)).
即使这样,Bob继续执行协议,并且将收据发给Mallory。
EM(DB(EM(DA(M)))).
现在Mallory所要做的就是用他的私钥对信息解密,用Bob的公钥加密,再用Mallory自己的私钥解密,并用Alice的公钥加密。哇!Mallory就获得了所要的信息M。
认为Bob会自动回送给Mallory一个收据不是不合理的。例如:这个协议可能嵌入在通信软件中,并且在接收后自动发送收据。收到乱七八糟的东西也送出确认收据会导致不安全性。如果在发送收据前仔细地检查信息是否能理解,就能避免这个安全问题。
还有一种更强的攻击,就是允许Mallory送给Bob一个与窃听的信息不同的信息。不要对从其他人那里来的信息随便签名并将结果交给其他人。
阻止重发攻击
由于加密运算与签名/验证运算相同,同时解密运算又与签名运算相同,因此,上述攻击才凑效。安全的协议应该是加密和数字签名操作稍微不同,每次操作使用不同的密钥能做到这一点,每次操作使用不同的算法也能做到;采用时间标记也能做到,它使得输入的信息和输出信息不同。用单向Hash函数的数字签名也能解决这个问题(参看2.6节);;
一般说来,下面这个协议是非常安全的,它使用的是公开密钥算法:
(1)Alice对消息签名。
(2)Alice用Bob的公钥对消息和签名加密(采用和签名算法不同的加密算法),然后将它传送给Bob。
(3)Bob用他的私钥对消息解密。
(4)Bob验证Alice的签名。
对公钥密码的攻击
在所有公钥密码协议中,回避了Alice怎么得到Bob的公钥这件事。3.1节将更详细地讨论,但在这儿值得提及。
得到某人的公钥的最容易的方法是从某个地方的安全数据库中得到。这个数据库必须是公开的,以便任何人都可得到其他人的公钥。数字库也必须阻止Trent以外的其他人写入数据;否则Mallory可能用他选取的任意一个公钥代替Bob的,他那样做后,Bob就不能解读发给他的信息,但Mallory却能读。
即使公钥存贮在安全数据库中,Mallory仍能在传送期间用另外的公钥来代替。为了防止这个问题,Trent可用他的私钥对每一公钥进行签名。当用这种方式时,Trent常被称为密钥鉴证机关或密钥分配中心(KDC)。在实际的实现中,KDC对由用户名、公钥和其他用户的重要信息组成的一组信息进行签名。被签名的这组信息存贮在KDC数据库中。当Alice得到Bob的密钥时,她验证KDC的签名以使自己确信密钥的有效性。
在最后的分析中,对Mallory来说并不是不可能,只不过更困难了:Alice仍将KDC的公钥存贮在某个地方,Mallory只得用自己的公钥代替那个密钥,破坏数据库,然后用自己的密钥代替有效密钥(好像他就是KDC一样,用自己的私钥对所有密钥签名),再进行运算,如果Mallory要制造更多的麻烦,他甚至连文件签名都可以伪造。密钥交换将在3.1节详细讨论