数字签名

http://hubingforever.blog.163.com/blog/static/17104057920118774251514/


数字签名主要有以下几个步骤:

第一发方首先有一个 公钥/私钥对 ,它 将要签名的报文作为一个单向散列函数的输入,产生一个定长的散列码,一般称为消息摘要。
第二使用发放的私钥对散列码进行加密生成签名。将报文和签名一同发出去。
第三收方用和发放一样的散列函数对报文运算生成一个散列码,同时用发放的公钥对签名进行解密。
第四如果收方计算得到的 散列码 和解密的签名一致,那么 说明的确是发方对报文进行了签名而且报文在途中没有被篡改
其具体过程如图1所示:
数字签名简介 - hubingforever - 民主与科学
如前所述,数字签名主要分为两个步骤:产生 消息摘要 数字签名
使用单向散列函数的目的就是 可以让任意长度的消息压缩成为某一固定长度的消息摘要 。单向散列函数又称之为单向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中的数字签名和数字证书
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值