http://hubingforever.blog.163.com/blog/static/17104057920118774251514/
数字签名主要有以下几个步骤:
第一、
发方首先有一个
公钥/私钥对
,它
将要签名的报文作为一个单向散列函数的输入,产生一个定长的散列码,一般称为消息摘要。
第二、
使用发放的私钥对散列码进行加密生成签名。将报文和签名一同发出去。
第三、
收方用和发放一样的散列函数对报文运算生成一个散列码,同时用发放的公钥对签名进行解密。
第四、
如果收方计算得到的
散列码
和解密的签名一致,那么
说明的确是发方对报文进行了签名而且报文在途中没有被篡改。
其具体过程如图1所示:
如前所述,数字签名主要分为两个步骤:产生
消息摘要
和
数字签名
。
使用单向散列函数的目的就是
可以让任意长度的消息压缩成为某一固定长度的消息摘要
。单向散列函数又称之为单向Hash函数,它并不是加密函数,其基本模型为:
h=
F
(M)
其中
M
是输入的消息正文,可以为任意长度;
F
为单向散列算法/函数;
h
为生产的消息摘要,拥有固定的长度,它和
M
的长度无关。一个好的单向散列算法
F
应该有以下5个特性:
1、
能处理任意长度的
M
(至少在实际应用中能碰到的任何长度);
2、
生成的消息摘要
h
,要有不可预见性,
h
看起来和
M
没有任何关系;
3、
给定
M
应该能很容易算出
h
;
4、
给定
h
不能计算出
M,
甚至不能得到关于
M
的任何信息;
5、
给定任何一个
M1
,要想找到另一个
M2
,且
M2
不等于
M1
,要使
F
(M1)
和
F
(M2)
的结果一样很难,在计算上要几乎不可行.
目前在密码学上已经设计出了大量的单向散列算法,比如RabinHash方案、MerkleHash方案,NHash算法,MD2算法,MD4算法,MD5算法和SHA等。实际中常用的单向散列算法有消息摘要算法MD5(Message Digest5)和安全散列算法SHA(Security Hash Algorithm).
如上所述,进行数字签名至少应该进行以下2步:
(1)
发方用单向
散列函数F
对
消息正文M
进行计算,产生
散列码h
(2)
发方用其用其私匙对
散列码进行h
加密,把加密后的散列码和消息正文一起发送出来。
验证数字签名至少需要以下2个步骤:
(1)
接方用
单向散列函数F
对接受到消息正文M进行计算,产生
散列码h2
(2)
接方用发方的公钥对接收到散列码进行解密,还原得到
散列码h
,比较
散列码h
和
散列码h
是否一致。
如果一致就说明发方的确对该消息进行了签名,且消息在途中没有被窜改。