第9章 带密钥的消息摘要算法—数字签名算法
相信绝大多数读者朋友都有刷卡购物的经历。刷卡时,我们都要签下自己的名字,我们把这种行为简称为“签名”,或者叫做“手写签名”。这种签名几乎与使用者一一绑定,成为防止使用者对其行为否认的一种手段。如果使用者对自己的行为表示质疑,可鉴定签名是否一致,判别签名是否有效。
数字签名是手写签名在计算机软件应用中的一种体现,它同样起到了抗否认的作用。手写签名应用于纸质文件,数字签名应用于数据。手写签名针对纸质文件内容确认,数字签名对数据进行摘要处理。两种方式都离不开签名实体,其校验方法也基本一致。
无论是手写签名还是数字签名,如果离开了签名实体(文件或数据)就没有了意义。如果经过手写签名的文件被修改了,我们可以认为该文件无效。同理,经过数字签名的数据可以通过验证签名操作辨别该数据是否被修改。
相信大多数读者朋友都使用过微软的操作系统(如Windows XP),在安装该系统时需要输入一个25位的产品密钥,系统会验证这个产品密钥是否合法,这其实就是一个签名验证的过程。
9.1 数字签名算法简述
数字签名算法可以看做是一种带有密钥的消息摘要算法,并且这种密钥包含了公钥和私钥。也就是说,数字签名算法是非对称加密算法和消息摘要算法的结合体。
9.1.1 数字签名算法的由来
数字签名算法是公钥基础设施(Public Key Infrastructure, PKI)以及许多网络安全机制(SSL/TLS、VPN等)的基础。
数字签名算法要求能够验证数据完整性、认证数据来源,并起到抗否认的作用。这3点与OSI参考模型中的数据完整性服务、认证(鉴别)服务和抗否认性服务相对应。
消息摘要算法是验证数据完整性的最佳算法,因此,该算法成为数字签名算法中的必要组成部分。
基于数据完整性验证,我们希望数据的发送方(以下称甲方)可以对自己所发送的数据做相应的处理(签名处理),同时给出对应的凭证(签名),并且数据的接收方(以下称乙方)可以验证该签名是否与数据甲方发送的数据相符。
如果任何机构都可以进行签名处理,那签名本身就失去了验证的意义。因此,签名操作只能由甲方来完成,验证签名操作则由乙方来完成。既然签名操作仅限于甲方,那么签名操作本身是基于甲方的某些私有信息完成的操作。并且,用于验证操作的相关信息是由甲方公布给乙方。
用于签名的相关信息私有,用于验证的相关信息公有,且这两种信息必须成对出现。非对称加密算法中的私钥和公钥满足这种关系,成为数字签名算法中的重要元素。
数字签名算法包含签名和验证两项操作,遵循“私钥签名,公钥验证”的签名/验证方式,签名时需要使用私钥和待签名数据,验证时则需要公钥、签名值和待签名数据,其核心算法主要是消息摘要算法。因此,我们可以把数字签名算法近似看成是一种附加了公钥和私钥的消息摘要算法。
与摘要值的表示方式相同,签名值也常以十六进制字符串的形式来表示。
需要读者朋友注意的是,数字签名算法在实际运用时,通常是先使用消息摘要算法对原始消息做摘要处理,然后再使用私钥对摘要值做签名处理;验证签名时,则使用公钥验证消息的摘要值。