发布网友 发布时间:2022-04-25 13:53
共1个回答
热心网友 时间:2023-05-14 17:33
假设有个坏家伙H,虽然不能发现A和B交换的秘密,但是他可以干预并且破坏他们的对话。
举例来说,如果H位于A和B之间,他可以选择让大多数的消息返回以及向前继续传输没有改变,但是破坏了特定位的消息。
A-->H hello
H-->B hello
B-->H Hi, I'm B, B's-certificate
H-->A Hi, I'm B, B's-certificate
A-->H prove it
H-->B prove it
B-->H A, This Is B{ digest[A, This Is B] } B's-private-key
H-->A A, This Is B{ digest[A, This Is B] } B's-private-key
A-->H ok B, here is a secret B's-public-key
H-->B ok B, here is a secret B's-public-key
B-->H {some message}secret-key
H-->A Garble[ {some message}secret-key ]
H一直让数据没有改变的通过,直到A和B分享一个秘密。然后H通过改变B发送给A的消息来进入这个方式中。这时候A是相信B的,因此她就可能相信这个改变的消息,然后按照它来做。注意H并不知道这个秘密-他能做的所有事就是破坏用这个秘密的密钥加密的数据。他可能不能利用这个协议制造出一条有效的消息,但是下一次,他可能会幸运一点。
为了防止这种破坏,A和B在他们的协议中引入了一种消息认证码(MAC)。MAC是根据秘密的密钥和传输的数据计算出来的,上面描述的摘要算法的属性正好可以用于构造抵抗H的MAC功能。
MAC := Digest[ some message, secret ]
因为H不知道这个秘密的密钥,所以他无法计算出这个摘要的正确数值。即使H随机的改变消息,如果摘要数据很大的话,他成功的可能性也很小。举例来说,通过使用MD5,A和B能和他们的消息一起发送128位的MAC值。H猜中这个正确的MAC值的几率是 18,446,744,073,709,551,616 分之1。
下面是样本协议,又订正了一次:
A-->B hello
B-->A Hi, I'm B, B's-certificate
A-->B prove it
B-->A {digest[A, This Is B] } B's-private-key
ok B, here is a secret B's-public-key
{some message,MAC}secret-key
H现在有麻烦了,H可以改变任何的消息,但是MAC的计算将揭露他的欺诈行为。A和B能发现伪造的MAC值并停止会话,H就不能伪造B的消息了。
但是这样同样不能防范H鹦鹉学舌。如果H记录了会话的过程,他虽然可能不知道会话的内容,但是他可以重放这些会话。实际上,H能在A和B之间做一些真正龌龊的事。