常见的密码算法分类方式如表3-1所示。
表3-1 密码算法的分类
根据算法和密钥的异同,可以将密码算法分为对称加密和非对称加密两类。在对称加密中,加密和解密函数在形态或原理上非常相似,而且加密和解密过程中使用的密钥 k 1 和 k 2 是相同的。可以将图3-1形象地看作:Alice将信息存入一个密码箱并加锁,而Bob得到同一个密码箱,并用复制的钥匙打开密码箱获得信息。
对称加密算法面临着两个挑战。第一,如何保护密钥的安全?密钥不能和信息在同一信道上进行传输,需另外开辟一条安全通道。第二,在实际应用中,如何规避通信双方之间的欺诈?例如,若Alice是采购方,Bob是供应商,Alice将加密后的订单发给Bob作为采购需求发起的标志。由于Alice和Bob都知道密钥,Bob可以伪装订单信息,或者Alice可以称某个真实订单是由Bob伪造的。非对称加密中的加密和解密使用不同的密钥( k 1 ≠ k 2 ),可以很好地解决类似问题。在非对称加密算法中,一般将加密密钥 k 1 称为公钥,而将解密密钥 k 2 称为私钥(注意这并不是绝对的)。
非对称加密算法一般有两个基本要求:第一,通过公钥不能够轻易推算出私钥;第二,利用公钥不可能进行解密计算。在后续章节中,我们会进一步理解其中的奥妙。
根据对信息序列的计算处理方式,可以将密码算法分为分组密码和流密码两类。分组密码一般是将原文序列 m 划分为若干个分组,即每个分组是一定长度的信息块。各信息块再通过相同或不同的密钥分别进行加密,称为密文序列。在接收端,解密函数对各信息块分别进行解密,然后重构原文序列 m 。一般情况下,单个信息块的长度要兼顾计算复杂度和加密算法的安全性来选取。流密码对原文序列 m 中的单个比特进行加密操作。首先采用一定的方法产生和原文序列 m 等长的密钥序列 k ,然后利用密钥序列中相应位置的密钥逐位对原文序列信息位进行加密。流密码的安全性主要依赖于所采用的密钥序列,一般情况下基于长的伪随机序列或递归的方式来构建。