数字签名简介

数字签名主要有以下几个步骤:
第一发方首先有一个 公钥/私钥对 ,它 将要签名的报文作为一个单向散列函数的输入,产生一个定长的散列码,一般称为消息摘要。
第二使用发放的私钥对散列码进行加密生成签名。将报文和签名一同发出去。
第三收方用和发放一样的散列函数对报文运算生成一个散列码,同时用发放的公钥对签名进行解密。
第四如果收方计算得到的 散列码 和解密的签名一致,那么 说明的确是发方对报文进行了签名而且报文在途中没有被篡改
其具体过程如图1所示:
数字签名简介_第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中的数字签名和数字证书

你可能感兴趣的:(java,Algorithm,算法,加密,解密,Security)