无论是对称密码还是公钥密码,密码的作用都是确保机密性。由于确保较长的明文整体的机密性很困难,因此我们用密码将明文转换成密文。这样一来,我们就不必保护明文本身了。相对地,我们则需要保护加密时所使用的密钥。通过保护较短的密钥来保护较长的明文,这样的做法可以称为机密性的压缩。
单向散列函数是用于确认完整性的。我们不必检查较长的明文的完整性,只要检查散列值就能够确认完整性了。通过检查较短的散列值来确认较长的明文的完整性,这样的做法可以称为完整性的压缩。
消息认证码和数字签名都是用于认证的技术,但我们并不是直接对较长的消息本身进行认证,而是通过将较长的消息与密钥结合起来,生成较短的比特序列(认证符号),再通过认证符号进行认证。在消息认证码中,MAC值就是认证符号;而在数字签名中,签名就是认证符号。通过较短的认证符号来对较长的消息进行认证,这样的做法可以称为认证的压缩。
那么伪随机数生成器又是怎样的呢?在伪随机数生成器中,所生成数列的不可预测性是非常重要的。要大量生成具备不可预测性的随机数列非常困难,于是我们通过将种子输入伪随机数生成器,生成具备不可预测性的伪随机数列。也就是说,为了对伪随机数列赋予不可预测性,我们使用了随机数种子,这可以称为不可预测性的压缩。反过来说,伪随机数生成器是将种子所具备的不可预测性进行了扩张。
这里的观点很重要,因此我们从另一个角度来总结一下。
密钥是机密性的精华
散列值是完整性的精华
认证符号(MAC值和签名)是认证的精华
种子是不可预测性的精华
通过上面的整理,大家应该可以理解密钥、认证符号和种子之间的关系了吧。