证明你是你
信息的加解密过程很简单:假设A要发送信息给B,A用B的公钥加密信息,得到密文;B用自己的私钥解密信息,得到明文。
但其中有一个问题:怎么证明A是A?
由于B的公钥是公开的,如果仅仅这样简单地加解密,显然B是不能确定信息是否来自于A的。于是就有了签名这个东西。
签名
在说签名之前,先来说一下数据摘要(Digest)
我们知道人的指纹是独一无二的,于是我们就想,文件能不能也有这样一个属性,这样我们就可以容易地验证文件是否被更改。
数据摘要就是这样一个东西,通过使用数据摘要算法,常见的有(MD5,SHA1等),我们可以生成文件的数据摘要,并且可以认为这个摘要是独一无二的。
签名是为了让信息的接收者可以验证发送者的身份。
同样假设A发送信息M给B,A首先生成一下所要发送信息的数据摘要,然后用自己的私钥对摘要进行加密,用私钥加密摘要的这个过程就叫签名,操作之后就得到了签名S。
然后A用B的公钥加密信息M得到密文C,将C和生成的签名S一起发送给B。
B收到后,用自己的私钥对密文C进行解密,得到明文M。
然后B生成M的数据摘要D2,用A的公钥解密签名S,得到数据摘要D2,将D1和D2进行比较,如果相同则证明这个消息确实来自于A。
注意:用私钥加密,公钥解密。和用公钥加密,私钥解密都是可以的。
证书
当今世界什么都可能是假的,你可能是个假人,上了个假大学……
所以B拿到的A的公钥也可能是假的,如果这样的话,那签名什么的还有什么意义呢?可能C想对B图谋不轨,将B手中的A公钥替换成了自己的公钥,然后就可以冒充A和B对话。
于是就有了证书这东西。
证书就是用来证明你手里的公钥的主人省份,证书一般包含:
- 公钥PU
- 公钥的签名S
- 公钥所有者的信息。
拿到证书之后,我们需要解密公钥的签名S,然后与公钥PU对比,那我又怎么保证解密S用的公钥PUU是真的呢?那我是不是又要有一个证书来证明PUU的正确性,那你又怎么证明用来解密PUU签名的公钥PUUU的正确性呢,然后就是PUUUUUU……
其实这个循环从开始就可以避免,只要发放证书的是一个权威机构不就行了。这个机构叫做CA(Certification Authority)
CA
CA用自己的私钥对A的公钥进行签名,将这个签名和A的公钥,以及与A相关的一些信息做成证书。
当B想要A的公钥时,找CA拿A的证书。用CA的公钥解密A的公钥的签名,与证书中的A的公钥比较,如果一样,证明这个证书是有效的。如果不一样,说明说明证书可能已经被篡改,或者这是个假的CA……