PGP利用了公钥密钥系统(Public Key Encryption, PKE)。所谓公钥密钥系统,是指当一个用户使用一把密钥加密消息产生输出密文时,密文的解密需要使用第二把密钥才能得到原始消息。这两把密钥的产生要形成一种数学关系,并且在目前的数学水平下无法根据一把密钥计算出另外一把。在实际使用中,用户自己持有一把密钥,称为私钥,将另一把密钥公开,这把密钥称为公钥。
众所周知,电子邮件传输采用的是SMTP(Simple Mail Transfer Protocol)协议,即简单邮件传输协议,它传输的数据没有经过任何加密。电子邮件在经过网络时任一黑客都有可能截获和更改该邮件,甚至伪造某人的电子邮件。
从技术上看,没有任何方法能够阻止攻击者截获电子邮件数据包,我们不可能确定电子邮件将会经过哪些路由器,没有任何办法可以阻止攻击者截获需要在网络上传输的数据包。但是,我们可以使用邮件加密。这样,即使攻击者截获了电子邮件,在没有密码对截获的信息进行解密的情况下,只是一堆没有任何意义的乱码数据。在众多的加解密软件中,PGP(Pretty Good Privacy)已经成为事实上的工业标准。
假设我要发送电子邮件给朋友甲,我首先要得到朋友甲的公钥。我就用甲的公钥加密邮件后寄出,甲收到后就可以用自己的私钥解密出我的邮件原文。由于没别人知道甲的私钥,所以即使是我本人也无法解密这封信,这就解决了信件保密的问题。如果甲把自己的公钥公布给其他人,那么每一个人都可以给甲发送加密邮件了。但是有一天,甲突然收到内容完全相反的两封信,署名都是我的名字。显然有人装扮成我,向甲发送了一封欺骗邮件。有没有一种方法,使得其他人无法以我的名义招摇撞骗呢?有,这就是数字签名。
在说明数字签名前先要解释一下什么是“邮件文摘”(message digest),也就是说,对一封邮件用某种算法算出一个能唯一标识这封邮件的数来,一旦邮件有任何改变,这个数都会变化。我用自己的私钥将这封信的“digest”加密(签名),附加在邮件上,再用甲的公钥将整个邮件加密。甲收到这封信后,就用自己的私钥将邮件解密,得到信的原文和我的签名(用我的私钥加密的“digest”),甲用我的私钥解密签名,就得到了原始邮件的“digest”。甲也从原文计算出一个 “digest”,再与原有“digest”比较,如果符合就说明这份邮件确实是我寄来的,否则就是别人假冒的。
PGP还可以只签名而不加密,这适用于公开发表声明时,声明人为了证实自己的身份(在网络上只能如此了),可以用自己的私钥签名。这样就可以让收件人能确认发信人的身份,也可以防止发信人抵赖自己的声明。这一点在商业领域有很大的应用前途,它可以防止发信人抵赖和信件在途中被篡改。
上面的讨论都是建立在这样一个假设上,即我们可以安全得获得对方的公钥。但事实并非如此。
假设我要给朋友甲发送一封重要邮件,我们互相不知道对方的公钥。我让甲把他的公钥通过电子邮件发送给我。不幸的是,一个黑客截获了甲发送给我的邮件,并用黑客另一个公钥替换掉了邮件中甲的公钥,并把这封经过篡改的信重新发送给我。而我和甲并不知道这一切,于是黑客就可以截获我发给甲的所有重要资料,并用他手中的私钥来解密我发送给甲的电子邮件,甚至他还可以用甲真正的公钥来转发我给甲的信,这样谁都不会起疑心。他如果想改动我给甲的信也没问题。
当然,PGP对这种可能也有预防的建议,那就是由一个大家普遍信任的人或机构担当这个角色。他被称为“密钥侍者”或“认证权威”,每个由他签字的公钥都被认为是真的,这样大家只要有一份他的公钥就行了,认证这个人的公钥是方便的,因为他广泛提供这个服务,假冒他的公钥是极其困难的,因为他的公钥流传广泛。这样的“权威”适合由非个人控制组织或政府机构充当。为了方便用户的使用,在PGP软件中,已经内置了这样的服务器。
http://media.ccidnet.com/media/ciw/1265/m1602.htm
众所周知,电子邮件传输采用的是SMTP(Simple Mail Transfer Protocol)协议,即简单邮件传输协议,它传输的数据没有经过任何加密。电子邮件在经过网络时任一黑客都有可能截获和更改该邮件,甚至伪造某人的电子邮件。
从技术上看,没有任何方法能够阻止攻击者截获电子邮件数据包,我们不可能确定电子邮件将会经过哪些路由器,没有任何办法可以阻止攻击者截获需要在网络上传输的数据包。但是,我们可以使用邮件加密。这样,即使攻击者截获了电子邮件,在没有密码对截获的信息进行解密的情况下,只是一堆没有任何意义的乱码数据。在众多的加解密软件中,PGP(Pretty Good Privacy)已经成为事实上的工业标准。
假设我要发送电子邮件给朋友甲,我首先要得到朋友甲的公钥。我就用甲的公钥加密邮件后寄出,甲收到后就可以用自己的私钥解密出我的邮件原文。由于没别人知道甲的私钥,所以即使是我本人也无法解密这封信,这就解决了信件保密的问题。如果甲把自己的公钥公布给其他人,那么每一个人都可以给甲发送加密邮件了。但是有一天,甲突然收到内容完全相反的两封信,署名都是我的名字。显然有人装扮成我,向甲发送了一封欺骗邮件。有没有一种方法,使得其他人无法以我的名义招摇撞骗呢?有,这就是数字签名。
在说明数字签名前先要解释一下什么是“邮件文摘”(message digest),也就是说,对一封邮件用某种算法算出一个能唯一标识这封邮件的数来,一旦邮件有任何改变,这个数都会变化。我用自己的私钥将这封信的“digest”加密(签名),附加在邮件上,再用甲的公钥将整个邮件加密。甲收到这封信后,就用自己的私钥将邮件解密,得到信的原文和我的签名(用我的私钥加密的“digest”),甲用我的私钥解密签名,就得到了原始邮件的“digest”。甲也从原文计算出一个 “digest”,再与原有“digest”比较,如果符合就说明这份邮件确实是我寄来的,否则就是别人假冒的。
PGP还可以只签名而不加密,这适用于公开发表声明时,声明人为了证实自己的身份(在网络上只能如此了),可以用自己的私钥签名。这样就可以让收件人能确认发信人的身份,也可以防止发信人抵赖自己的声明。这一点在商业领域有很大的应用前途,它可以防止发信人抵赖和信件在途中被篡改。
上面的讨论都是建立在这样一个假设上,即我们可以安全得获得对方的公钥。但事实并非如此。
假设我要给朋友甲发送一封重要邮件,我们互相不知道对方的公钥。我让甲把他的公钥通过电子邮件发送给我。不幸的是,一个黑客截获了甲发送给我的邮件,并用黑客另一个公钥替换掉了邮件中甲的公钥,并把这封经过篡改的信重新发送给我。而我和甲并不知道这一切,于是黑客就可以截获我发给甲的所有重要资料,并用他手中的私钥来解密我发送给甲的电子邮件,甚至他还可以用甲真正的公钥来转发我给甲的信,这样谁都不会起疑心。他如果想改动我给甲的信也没问题。
当然,PGP对这种可能也有预防的建议,那就是由一个大家普遍信任的人或机构担当这个角色。他被称为“密钥侍者”或“认证权威”,每个由他签字的公钥都被认为是真的,这样大家只要有一份他的公钥就行了,认证这个人的公钥是方便的,因为他广泛提供这个服务,假冒他的公钥是极其困难的,因为他的公钥流传广泛。这样的“权威”适合由非个人控制组织或政府机构充当。为了方便用户的使用,在PGP软件中,已经内置了这样的服务器。
http://media.ccidnet.com/media/ciw/1265/m1602.htm