公钥、私钥、数字签名和数字证书简介

加密方式

简单来说分为两种,对称加密和非对称加密。

对称加密:

加密和解密用的是同一个秘钥,在对称加密算法中常用的算法有:DES、3DES、TDEA、Blowfish、RC2、RC4、RC5、IDEA等。这类加密算法的优点就是计算量小、加密速度快、加密效率高;但是缺点也很明显,在传输数据前,双方必须商定并保存好秘钥,任何一方的秘钥被泄露,加密信息就不再安全了。另外,每次使用对称加密算法时,都需要使用其他人不知道的唯一秘钥,这会使得收、发双方所拥有的钥匙数量巨大,密钥管理成为双方的负担。

非对称加密:

非对称加密需要两个秘钥来进行加密和解密,这两个秘钥非别是公有秘钥(公钥)和私有秘钥(私钥),公钥与私钥是一对,如果用公钥对数据进行加密,那么就必须用对应的私钥才能解密;同理,如果用私钥对数据进行加密,那么只有用对应的公钥才能解密。在非对称加密中使用的主要算法有:RSA、Elgamal、背包算法、Rabin、D-H、ECC(椭圆曲线加密算法)等。

工作流程(如下图):

1、首先乙生成一对公钥和私钥,自己保存好私钥,并将公钥向其他所有人公开
2、然后甲使用乙的公钥对原始数据进行加密,并将生成的密文发送给乙
3、乙接收到消息后用自己的私钥对密文进行解密,得到原始数据
即使密文在传输过程中被截获了也没关系,因为别人根本不知道乙的私钥,所以无法解密。同理,如果乙要给甲回信,首先乙要得到甲的公钥,然后用甲的公钥对消息进行加密,发送给甲,甲用私钥进行解密。

上面的传输方式看似无懈可击,但是请设想这样的一个场景:由于公钥是公开的,所以除了甲以外其他人也知道乙的公钥,那么这时候我们就能用乙的公钥对消息进行加密,然后冒充甲给乙发消息,导致乙无法区分消息到底是不是甲发送的。
为了解决这个问题可以这样做:首先甲用自己的私钥对消息进行加密,生成另一个密文,然后将密文发送给乙,乙收到消息后,如果能用甲的公钥对密文进行解密,就说明这个这个消息确实是甲发送的。

数字签名

虽然上面的方法解决了身份认证的问题,但是由于所有人都有甲的公钥,所以只要消息发送中途被截获就一定能被解密;而且对文件加密可能是个耗时过程,比如文件足够大,那么用私钥加密整个文件以及拿到文件后解密的开销无疑是巨大的。为了解决这两个问题数字签名就被提了出来,有了数字签名就可以用下面的方式发送消息了:

  1. 甲先用hash函数对消息进行运算,得到的hash值成为“摘要”,我们就叫它h1吧
  2. 然后甲用自己私钥对摘要进行加密,生成的密文就叫做“数字签名”,我们就叫它signature吧
  3. 之后用乙的公钥对消息进行加密,生成的密文就叫secret吧
  4. 最后把密文secret和signature一起发送给乙
  5. 乙收到后首先用甲的公钥对signature进行解密,如果能够解密说明消息确实是甲发送的,失败说明不是甲发的
  6. 然后乙用自己的私钥对密文secret进行解密,并使用相同的hash函数对解密后的结果进行运算,得到一个hash值,我们就叫它h2吧,如果h2=h1,说明消息内容没有被篡改,如果不等于说明消息内容中途被篡改了
    流程图如下:
    公钥、私钥、数字签名和数字证书简介_第1张图片

有了数字签名,我们就可以验证消息来源和消息的完整性了,但是这个过程真的就完美了吗?让我们设想以下场景:如果第三者丙偷偷在乙的电脑用自己公钥替换了甲的公钥,然后用自己的私钥给乙发送消息,这时乙收到的消息其实是被丙冒充的,但是乙却无法察觉,仍认为是甲发送的消息。
为了解决上面这个问题数字证书就出现了。

数字证书

在说数字证书之前,我们首先要搞明白导致发生上面那种情况的根源在哪里?本质上来说就是乙无法区分电脑中公钥到底是谁的,以至于乙会把丙错当成甲,所以我们就要想办法给公钥做身份认证(数字证书),以便能让别人搞清楚公钥到底是谁的。有了数字证书后就可以用以下方式发送消息了:

  1. 首先甲去找"证书中心"(certificate authority,简称CA),为自己公钥做认证(就好比去公安局办身份证一样)。CA用自己的私钥对甲的公钥和一些其他信息进行加密,生成的东西就叫"数字证书"(Digital Certificate)
    公钥、私钥、数字签名和数字证书简介_第2张图片

  2. 甲给乙发送的消息如下:
    公钥、私钥、数字签名和数字证书简介_第3张图片

  3. 乙收到消息后用CA的公钥解密甲的数字证书,拿到甲的公钥,然后验证甲的数字签名,后面流程和上面的一样。

如此一来问题就解决了,但是新的问题又出现了:每个人都有一个CA给颁发的数字证书,如果有一百万个人给乙发消息,那么乙就要保存一百万份不同的CA公钥来验证这些人的身份。显然这是不可能接受的,所以就有了“根证书”,里面存储CA公钥来验证所有CA分部颁发的数字证书,乙直接保存一份“根证书”就可以验证所有人的身份了。最后一点就是“根证书”的可靠性有谁来保证呢?确切的来说无法保证,就好像你自己无法证明你是你一样,“根证书”也是如此,只不过CA机构是获得社会绝对认可和有绝对权威的第三方机构,就像政府法院一样,这一点保证了根证书的绝对可靠。如果根证书都有问题那么整个加密体系毫无意义。

你可能感兴趣的:(其他,公钥,私钥,数字签名,数字证书)