首先还是来公布在上篇博文中所留作业的答案:私钥用于解密和签名,公钥用于加密和认证。

签名和认证是非对称加密算法除了数据加密功能以外的另一大功能:数字签名。
数字签名是指发送方使用自己的私钥加密要发送的数据,接收方使用发送方的公钥解密数据。由于私钥仅为用户个人拥有,所以通过数字签名可以使接收方确认发送方的身份,而发送方也不能对发送出去的数据抵赖,从而保证数据的有效性。其原理如下图所示。

CA证书服务器(3) 数字签名和消息摘要算法_第1张图片

在这个过程中,在发送方用私钥将明文加密的操作称为签名,在接收方,用公钥将密文解密的操作称为认证。要注意的是,虽然这里也是在进行加密和解密的操作,但目的并非是为了实现数据的机密性,而是为了保证数据的有效性。

回想一下在本系列的第一篇博文中提出的,在数据通信方面的网络安全技术中要解决的三大问题:数据的机密性、数据的有效性、数据的完整性和一致性,前两个问题都已经解决了,现在只剩最后一个完整性和一致性的问题,即如何保证接收方收到的数据与发送方发出的数据是完全一样的。
解决这个问题的方法是通过另外一种称为消息摘要的算法。

消息摘要算法也称为单向散列算法(Hash算法),这种算法非常特殊,通过它将数据加密之后,是无法将密文还原成明文的,也就是说它只能加密而不能解密,整个算法是一个从明文到密文的不可逆过程,故而称之为单向散列算法。

另外,消息摘要算法还有一个神奇的特点:无论一个多大的数据,只要经过消息摘要算法加密,之后得到的密文都是一个固定长度的数值( Hash值),这个Hash值就称为摘要信息。
比如我们将一个大小只有 1B的文件和一个大小为5GB的文件,分别用消息摘要算法进行加密,最终得到的Hash值都是一个128位或160位的二进制数(具体多少位,由不同的算法而定)。
消息摘要算法的特点还不止这些,总结一下,它包括 4个主要特征:
  • 输入一样,输出必定一样。
  • 雪崩效应:输入微小改变,将引起结果巨大改变。
  • 定长输出:无论原始数据多大,其结果大小一样。
  • 不可逆:无法根据加密后的密文,还原原始数据。
后两个特点刚才已经介绍过了,下面我们通过一个具体的操作来体会一下前两个特点,我们以经典的消息摘要算法—— MD5为例,所使用的工具是我随便从网上找到的一个名为MD5Calculator的小软件。
首先随意找一个文件,比如一个 word文档,用它来生成Hash值。注意,下图这个文档中最后没有句号。

用软件MD5Calculator对文件进行加密运算,生成Hash值,将其保存下来。

CA证书服务器(3) 数字签名和消息摘要算法_第2张图片

把原先的文件修改一下,在末尾增加一个句号。然后重新计算生成Hash值。

CA证书服务器(3) 数字签名和消息摘要算法_第3张图片

对比可以发现,前后两次的Hash值差别非常大,但是Hash值的长度都是一样的,都是一个32位的十六进制数(即128位的二进制数)。

正是因为消息摘要算法具有这些特点,所以可以被用于验证发送数据的完整性和一致性。信息的发送方使用散列算法生成数据的 Hash值,然后将Hash值与数据本身一起发送。接收方同时收到数据和Hash值,并将收到的数据也用同样的散列算法产生另一个Hash值,然后将两个Hash值进行比较,如果两者相同,则说明数据在传送过程中没有被改变。
 
因而我们可以发现,消息摘要算法的目的并非是为了实现数据的机密性,而是为了验证数据的完整性和一致性。
 
目前最常用的消息摘要算法是 MD5和SHA-1。为了使找到两块具有相同散列值的数据的机会尽可能的少,因而这两种算法都采用了足够长度的散列值。
MD5,可产生一个 128位的散列值;SHA-1是以MD5为原型设计的安全散列算法,可产生一个160位的散列值,比MD5具有更高的安全性。
 
在实际应用中,一般都是将数字签名和消息摘要结合起来使用,即在进行数字签名时,并非是用私钥将整个明文数据进行加密,而是先将明文用消息摘要算法生成散列值,然后用私钥对散列值进行加密。这样做的好处很明显,一是可以提高效率,二是可以保证散列值的安全。在接收方,需要先用公钥解密得到散列值,然后对明文数据也进行同样的散列运算,最终对结果进行比较。

至此,网络安全的基础知识就介绍得差不多了,在实践中,大都是将这些安全技术综合在一起运用的。如安全电子邮件协议PGP对数据的处理过程如图所示。

CA证书服务器(3) 数字签名和消息摘要算法_第4张图片

如果你仔细看过了本系列的三篇博文,那么对这幅图中的数据处理流程是完全可以轻松理解的。

在发送方 A,首先对要发送的明文用MD5算法生成摘要,并将摘要用A的私钥加密,实现了对信息的数字签名。然后将加密后的数据与原先的明文拼接在一起,经过压缩以后用对称加密算法IDEA加密,IDEA的密钥则用接收方B的公钥加密。将加密后的明文和加密后的密钥拼接在一起,经过编码之后发送出去。

在接收方B,首先用自己的私钥解密IDEA的密钥,然后再用密钥解密IDEA加密的数据,得到明文和加密后的MD5值。再用A的公钥解密MD5值,并用同样的MD5算法对明文进行散列运算,将得到的MD5值进行对比,如果比较结果一致,证明签名无误,接受该邮件。