为了解决这个问题,标准化组织发明了一个叫做证书的东西,一个证书包括下面的一些内容:

  证书发行者的名字
  证书发送给的团体
  主题的公钥
  一些时间戳

  证书是由证书发行者的私钥签名的,每个人都知道证书发行者的公钥(即证书发行者有一个证书,等等)。证书是一种把公钥绑定到名字的标准方式。

  通过使用证书这种技术,每个人都可以通过检查Bob的证书来判断Bob是不是伪造的。假设Bob严格的控制着他的私钥,并且的确是Bob得到了他的证书,那么一切都好。下面是补偿协议:

A-->B hello
B-->A Hi, I’m Bob, bobs-certificate
A-->B prove it
B-->A Alice, This Is bob{ digest[Alice, This Is Bob] } bobs-private-key

  当Alice收到Bob的第一条消息,她可以检查证书,核实签名(如上,使用摘要和公钥加密),然后,核实主题(Bob的名字)来判断那是不是真的Bob。这样她就相信公钥是Bob的公钥,然后要求Bob证明他的身份。Bob则重新进行一次上面的相同过程,计算消息的摘要,签名之后发给Alice,Alice可以用从证书得到的公钥检查Bob的消息摘要,从而判断Bob的身份。

  一个坏家伙 - 我们不妨叫他Mallet - 可以做下面的事情:

A-->M hello
M-->A Hi, I’m Bob, bobs-certificate
A-->M prove it
M-->A ????

  但是Mallet在最后的消息中不能满足Alice。Mallet没有Bob的私钥,所以他无法构造一条使Alice相信来自Bob的消息。