报文鉴别

数字签名就能够实现对报文的鉴别

然而这种方法有一个很大的缺点,就是对较长的报文进行数字签名会使计算机增加非常大的负担,因为这需要进行较多的时间来进行运算。

密码散列函数

散列函数具有以下两个特点:

  1. 散列函数的输入长度可以很长,但其输出长度则是固定的,并且较短。

  2. 不同的散列值肯定对应于不同的输入,但不同的输入却可能得出相同的散列值。

报文鉴别码

在报文鉴别中使用散列函数的方式如下:

  1. 用户 A 首先根据自己的明文 X 计算出散列 H(X)。为方便起见,把得出的散列 H(X) 记为 H。

  2. 用户 A 把散列 H 拼接在明文 X 的后面,生成了扩展的报文(X,H),然后发送给 B。

  3. 用户 B 收到了这个扩展的报文(X,H)。B 通过散列函数的运算,计算出收到的明文 X 的散列 H(X)。若 H(X)=H,则 B 似乎可以相信所收到的明文是 A 发送过来的。

    因为散列的长度 H 是早已知道的固定值,因此很容易便可以把收到的散列 H 和明文 X 分离开。

上面列举的做法,实际上是不可行的。设想某个入侵者创建了一个伪造的报文 M ,然后也同样地计算出其散列 H(M),并且冒充 A 把拼接有散列的扩展报文发送给 B。B 收到扩展的报文(M,H(M))后,按照上面步骤 3 的方法进行验证,发现一切都是正常的,就会误认为所收到的伪造报文就是 A 发送的。

解决上述问题的办法并不复杂,就是对散列进行一次加密。

从上图可以看出,在 A 从报文 X 导出散列 H 后,就对散列 H 用密钥 K 加密。这样得出的结果叫做报文鉴别码 MAC(Message Authentication Code)

  • A 把已加密的报文鉴别码 MAC 拼接在报文 X 的后面,得到扩展的报文,发送给 B。

  • B 收到扩展的报文后,先把报文鉴别码 MAC 与报文 X 分离出来。然后用同样的密钥 K 对收到的报文鉴别码 MAC 进行解密运算,得出加密前的散列 H。再把报文 X 进行散列函数运算,得出散列 H(X)。最后,把计算出的散列 H(X) 与 H 进行比较。如一致,就可以相信所收到的报文 X 的确是 A 发送的。

由于入侵者不掌握密钥 K ,所以入侵者无法伪造 A 的报文鉴别码 MAC,因而无法伪造 A 发送的报文。这样就完成了对报文的鉴别。

上面给出的鉴别报文的方法实际上还有不少问题有待解决。例如,采用什么样的方法可以安全有效地来分发通信双方共享的密钥 K?一种可行的方法是采用公钥系统

用户 A 用其私钥对散列 H 进行加密,得出报文鉴别码 MAC。然后 A 把报文鉴别码 MAC 拼接在报文 X 的后面,构成扩展的报文发送给 B。B 收到扩展的报文后,采取的做法和前面所述的基本一样,不同的地方是,对收到的报文鉴别码 MAC 是用 A 的公钥进行解密

由于入侵者没有 A 的私钥,因此他不可能伪造出 A 发出的报文。采用这样的方法得到的扩展报文,不仅是不可伪造的,也是不可否认的。

Last updated