转载:http://code.logphp.com/article/17739.html
虽然我不是做信息安全的,但是却被各种信息安全的东西包围着。通过把公钥复制到github上从而可以无密码fetch和push代码,hadoop节点节点间也通过公钥实现无密码登陆。但是,我一直不知道为什么可以这样,今天终于忍不住要把它们搞清楚了。它们分别是对称加密、非对称加密、数字签名和证书。
一、对称加密加密是一个很好理解的概念,就是把一个信息保护起来,让别人无法知道信息的真实面目。实现对信息加密的东西就是密钥。密钥的功能和钥匙一样,钥匙用来锁门,密钥用来锁数字信息,也和钥匙一样,钥匙可以用来开门,密钥也可以用来解密数字信息。当加密数字信息和解密数字信息的密钥相同时,这就是对称加密,如下图:
在图中,加密方法就是锁,密钥就是钥匙,而加密方法和密钥一起被当作一种函数。
对称加密有一个很大的问题,当我们用密钥把一个东西加密后,另一个人想解密这个东西,就必须要我们用于加密的密钥,也就是说,如果要传送加密后的信息给别人,同时也得把密钥传送过去,密钥需要在网络上传输,这是非常危险的。于是,就有了非对称加密。
二、非对称加密
非对称加密是加密数字信息和解密数字信息的密钥不同的加密方法。每一个使用非对称加密的人都自己生成一对钥匙,分别称为公钥和私钥,公钥加密的信息私钥可以解密,私钥锁上的信息公钥也可以解密。我们用PA表示Alice的公钥,SA表示Alice的私钥,于是有如下等式:
M=SA(PA(M))
M=PA(SA(M))
其中,M是被加密的信息。公钥被公之于众,私钥只有自己知道。当我们需要给某人传送私密信息的时候,就把那人的公钥拿过来,对信息加密,加密的信息只有那人的私钥才能解开,而那人的私钥只有他一人拥有,固信息是绝对安全的。例如,Bob要给Alice传送秘密信息,如下图所示:
即使窃密者拿到加密后的C,也无法获得原来的信息,因为他不可能知道Alice的密钥。
可是,问题又来了,Alice怎么能确定给她发送信息的人是Bob,而不是别人呢?这就是数字签名要做的事情了,而且同样可以通过非对称加密实现。
三、数字签名
用PB表示Bob的公钥,SB表示Bob的私钥。Bob可以先用自己的私钥对要传送给Alice的信息M进行加密,得到加密后的信息C,然后用Alice的公钥PA对(M, C)进行加密,得到MC/。Alice得到MC/后先用自己的私钥对MC/解密,得到(M, C),然后再用Bob的公钥PB对C进行解密,看解密得到结果和M是否相等,如果相等,说明消息确实是Bob,否则就不是。因为只有Bob能根据M得到C,所以这可以算作Bob的签名。
不过,现在问题又来了,Alice怎么能确定PB就是Bob的公钥呢?如果PB不是Bob的公钥,而是别人伪造的,那么通过上面验证签名的过程也就失去意义了。而数字证书就是来让Alice确定PB确实是Bob的公钥的。
四、证书
数字证书由一家权威机构提供,它的公钥众所周知。证书里保存着谁的公钥是什么这样的信息,并且是通过权威机构的私钥加密。Bob可以把包含自己的公钥是什么的证书传送给Alice,Alice通过权威机构的公钥得到证书里面的内容,从而就可以确定PB是否是Bob的公钥了。
现在问题又要了。非对称加密(少说密钥也有512位)通常非常费时,而对称加密(如AES算法的密钥只有128位、192位或256位)比较快,另外计算数字信息的哈希值也很快,对称加密和计算哈希的区别在于一个可逆,一个不可逆,所以它们俩分别用来和非对称加密结合提告加密和计算数字签名的效率。
五、提高加密和签名效率
对称加密和非对称加密结合提高加密效率。具体是这样操作的,首先把信息用对称加密进行加密,然后用非对称加密对对称加密密钥进行加密。对称加密加密信息很快,非对称加密加密很短的对称加密密钥也很快,所以加密效率提高了。
非对称加密和哈希函数结合提高计算数字签名的效率。具体是这样操作的,通过哈希函数计算数字信息M的哈希值,比如MD5值,只有128位,然后再对这个哈希值进行加密得到C。Alice通过Bob的公钥PB对C进行解密,同时用同样的哈希函数计算哈希值,看两者的结果是否一样,从而验证文件是否是Bob传送过来的。