数字证书原理

非对称加密

在传统的加密算法中,通信的双方会采用一个共享秘钥来对数据进行加密和解密。消息发送方先采用秘钥对明文进行加密然后再进行传送,待接收方收到消息后,再采用秘钥对密文进行界面,以得到明文。由于加密和解密采用的秘钥是相同的,这种加密算法也称为对称加密。采用对称加密的通信过程如下图所示:

Snipaste_2023-07-09_12-23-24

与传统的对称加密不同,非对称加密算法采用了两个密钥:公开密钥(publickey:简称公钥)和私有密钥(privatekey:简称私钥)。公钥与私钥是成对使用的,如果用公钥对数据进行加密,只有用对应的私钥才能解密;同样,使用私钥对数据进行加密,只有用对应的公钥才能解密。因为加密和解密使用的是两个不同的密钥,所以这种算法叫作非对称加密算法,也称为公开密钥加密。采用非对称加密的通信过程如下图所示:

Snipaste_2023-07-09_12-23-25

使用对称加密算法需要双方事先交换加/解密用的共享秘钥,而交换的过程就存在密码泄露的风险。非对称加密的保密性比较好,因为它消除了通信双方交换秘钥(加密用的私钥)的需要。公钥是不需要进行保密的,可以对外进行公布,但加密后的信息只有私钥的拥有者才能进行解密。

但是非对称加密的效率比对称加密低,因此在通信过程中一般会结合非对称加密和对称加密来实现数据加密传输。先通过非对称加密协商一个用于对称加密的共享秘钥,后续在传递数据时采用该对称加密秘钥匙来对数据加密,以在保证安全性的同时兼顾加密传输的效率。SSL/TLS就采用了类似的加密传输机制。

哈希函数

哈希函数是一个具有以下输入和输出的数学函数 H(X)=Y:

  • H: 哈希函数,其输入参数为X,输出为Y。
  • X: 哈希方法的输入,可以是任意长度的任意数据。
  • Y:哈希方法的输出,是一段固定长度的二进制数据,长度可以是256,384,516…。

用于加密的哈希函数有下面的特征:

  • 无法找到产生相同输出的输入。从数学理论上来说,我们是可以找到具备相同输出的输入的,因为输入可以是任何数据,而输出则是固定长度的。但是对于一个好的哈希函数来说,我们就是使用地球上所有的计算机一起进行计算,也无法在可以接受的时间内找出该输入。
  • 无法通过输出反推出输入。对于输入值的范围很大的情况来说,这是没有问题的,如果输入值是一个有限的集合,则很容易通过遍历尝试每一个输入值来推断出一个输出对应的输入。在这种情况下,我们可以为输入X加上一个随机值R来隐藏输入值,即 H(R|X)=Y。由于攻击者不知道R的值,因此无法再通过遍历尝试每个输入的方法推断出Y对应的输入。这种做法被称为“加盐”,例如我们在存储密码时就会通过“加盐”的方法来避免彩虹表攻击。

从上面哈希函数的的特点可以看出,一段数据的哈希值就是该数据的一个固定长度的,独一无二的“特征”,我们可以把哈希值看作该数据的“数字指纹”。

数字签名

非对称加密加密一般是采用公钥进行加密而私钥进行解密。实际上我们也可以采用私钥进行加密,采用公钥进行解密。秘钥对的拥有者采用私钥对一段数据进行加密,然后公布密文,原文和公钥,任何人都可以使用公钥解密密文,然后核对原文和密文是否一致。由于私钥是不公开的,只有拥有者才能采用私钥对数据加密,所以这种方式可以用于证明发布这条消息的用户拥有消息中的公钥对应的私钥,这就是数字签名的基本原理。在数字证书,区块链,比特币中就采用了这种方法来验证用户身份。采用数学公式来表示数字签名的原理:

  • 消息发送者生成秘钥对: (sk,pk):= generates(keysize)
  • 消息发送者生成数字签名: signature := encrypt(sk, message)
  • 消息接收者验证发送者身份: isValid := isEqual(decrypt(pk, message),message)

该方法直接对传递的原始数据进行加密,当数据很大时,对数据进行签名和传输的效率很低。此时我们可以通过哈希函数提取数据的特征值,然后只对数据的哈希值进行签名。由于哈希函数的特点,通过哈希值同样可以验证签名的私钥身份,同时还避免了对整段数据进行加密和传输的开销。采用哈希函数后的数字签名原理如下: - 消息发送者生成秘钥对: (sk,pk):= generates(keysize) - 消息发送者生成数字签名: signature := encrypt(sk, hash(message)) - 消息接受者验证发送者身份: isValid := isEqual(decrypt(pk, signature),hash(message))

下图展示了数字签名和验证的流程:

Snipaste_2023-07-09_12-23-26

除了验证公钥拥有者的身份之外,数字签名还可以证明传输的数据没有被人恶意篡改,因为如果数据被篡改了,数据的哈希值就和解密后的签名对不上。