数字签名简介

来源:互联网 发布:黑马程序员javaee网盘 编辑:程序博客网 时间:2024/05/11 02:43
数字签名主要有以下几个步骤:
第一发方首先有一个公钥/私钥对,它将要签名的报文作为一个单向散列函数的输入,产生一个定长的散列码,一般称为消息摘要。
第二使用发放的私钥对散列码进行加密生成签名。将报文和签名一同发出去。
第三收方用和发放一样的散列函数对报文运算生成一个散列码,同时用发放的公钥对签名进行解密。
第四如果收方计算得到的散列码和解密的签名一致,那么说明的确是发方对报文进行了签名而且报文在途中没有被篡改
其具体过程如图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是否一致。
如果一致就说明发方的确对该消息进行了签名,且消息在途中没有被窜改。
关于在Java语言中,使用RSA算法实现数字签名请参考用RSA实现数字签名》。
关于在Java语言中,使用DSA算法实现数字签名则请参考用DSA算法实现数字签名》。
关于java本身的数字签名和数字证书请参考《Java中的数字签名和数字证书