Just For Fun

李亚普诺夫斯基的混乱天堂

加密

leave a comment »

今天跟Evg同学聊了一会儿会儿,学了一点关于pgp encryption,public key, private key的东西,花10分钟记下来。n年前考所谓的计算机3级网络技术时就把这些名词背得烂熟,却始终没搞明白到底是怎么回事,而Evg同学画个草图,5分钟就讲得明明白白,可见国内的考试认证是多么的没用。

1. public key(公钥) 和 private key(私钥)
A和B想在网络上安全的交流。A首先运行一个小程序,输入一个密码,小程序生成一对key,分别是公钥和私钥(也就是两串字符,比如公钥是Pubk_A,私钥是Prik_A,当然实际比这要长)。其中私钥是用A的密码加密过的,只有A知道;而公钥是A要公开给大家的,B,C,D都知道。

公钥和私钥有这样一个特点:如果你把信息用公钥加密,那只有这个对应的私钥能解开。

现在如果B要发消息”hello”给A,B先在自己的电脑上用A的公钥来加密这个消息,然后通过网络发给A。因为这个加密的消息只有通过A的私钥才能解密,所以即使是别人(比如C)在消息传播的途中截获了消息,他也没法解密,因为他只有A的公钥,而公钥是不能解密消息的。

2 签名
现在B已经可以放心地把消息发给A了,但A还不放心:他不知道消息是不是来自B的,因为所有人都有A的公钥。于是B除了要对消息(用A的公钥)加密之外,还需要加上签名,过程如下:

B首先对要发的消息进行Hash,得到一串字符,比如”hho”。Hash算法有这样一个特点,对一个输入能够得到一个确定的输出,但是你拿到这个输出,却没法算出它的输入(比如无论谁对”hello”进行Hash,都可以得到”hho”;但是我告诉你我把一串字符进行Hash得到”hho”,你永远不知道这串字符是什么)。然后B用自己的私钥(比如Prik_B)对Hash的结果”hho”进行加密,得到一个签名。这个签名可以用B的公钥(A,C,D都知道)来解密。

然后B把这个签名连同刚才用A的公钥加密的消息一起发给A。A首先用自己的私钥Prik_A把消息解密,得到”hello”;然后对消息进行Hash,得到”hho”;然后用B的公钥Pubk_B(所有人都知道B的公钥)对签名解密,发现也得到了”hho”,一致,于是断定消息确实是从B发来的。

上面的过程已经非常安全了: 首先,如果别人(比如C),在网络传输中截获了B发出来的消息和签名,他只能对签名进行解密,得到消息的Hash的结果”hho”,而因为Hash是不可逆的,所以他得不到消息。 第二,如果C想给A发一条消息”fuck you”,想办法让A以为是B发的,这也是不可能的,因为C他不知道B的私钥;A拿着B的公钥对签名解密,会发现得到的签名和A对消息解密后再Hash的结果不一致。

3 公钥的分配
可以看出来上面的过程非常安全了,大家只要记住自己的密码,就可以得到自己的私钥(没人愿意直接记住256位的私钥吧);然后告诉大家自己的公钥,然后就可以安全的交流了(虽然很麻烦)。但如果最开始告诉别人公钥的时候被人做了手脚怎么办呢?于是存在公钥的分配问题。

解决这个问题需要首先存在一个所有人都信任的分配公钥的机构Z(肯定不是中国政府或者cctv),这个机构告诉大家自己的公钥Pubk_z(所有人百分之百确定这个公钥就是Z的),大家也都告诉Z自己的公钥(Z负责确认这些公钥属于各自的主人)。然后Z用上面那一套方法把所有人的公钥分配给大家。

当然如果A在街上遇到B,可以直接把自己的公钥告诉B,而不去麻烦Z。

4 结语和鸣谢
感谢知识面广阔的Evg同学给我如此通俗易懂的解释。感谢发明Public-key cryptography, digital signatures这套系统以及RSA/DSA算法,Hash算法,PGP程序的前辈。

Written by Jerry

May 5, 2009 at 9:07 pm

Posted in techniclick

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s

%d bloggers like this: