数字签名一般由如下几个步骤组成:
1. 使用Hash算法(如MD, SHA等)对明文进行Hash编码生成数字摘要。
其中Hash算法必须有5大特性:
a. 单向性,即过程不可逆可以有Hash(m)得到c,但是几乎不可能从c得到m。
b. 快速性,即通过Hash(m)能够很快获得c。
c. 抗碰撞性,即保证几乎不可能存在m1和m2,使得Hash(m1)=Hash(m2)
d. 雪崩性,即改变m中的一个bit使得得到的c至少一半发生变化。
e. 对于m,没有长度限制,但对于c,总是能得到长度固定的c。
另外用户可以使用含有密钥的Hash算法来生成数字摘要,这样可以增加安全性。
2. 使用自己的私钥加密数字摘要得到数字签名。(这个步骤是基于非对称加密的,由于非对称加密安全性高于对称加密,所以一般使用非对称加密来加密数字摘要;非对称加密算法有RSA,DSA和ECC[椭圆曲线加密算法]等)
3. 使用对称加密算法(如DES,RC等)加密明文(使用对称加密算法加密明文比使用自己私钥加密明文安全性高,但比使用对方公钥加密明文安全性低,不过由于现在公钥加密不是很成熟,使用公钥加密的话速度很慢,特别是当明文很长的时候。)
4. 如果数字签名不是很长,可以用对方的公钥进行加密;如果很长,则用对称加密算法进行加密。
5. 使用对方的公钥加密对称加密的密钥,Hash算法的密钥(如果有的话)以及自己的公钥(如果需要传送的话)。
6. 将加密后的明文,数字签名,各种密钥打包发给对方。
7. 对方收到后,解密各种密钥,明文和数字签名。
8. 使用发送方的公钥解密数字签名得到数字摘要。
9. 使用相同的Hash算法对收到的明文进行编码获得用来验证的数字摘要(如果需要使用Hash密钥请使用它)。
10. 比较收到的数字摘要和自己生成的用来验证的数字摘要,从而得到结果。
数字签名保证了文件的保密性,完整性和不可否认性。
数字签名在实际应用中的问题:
1. 签名的文件可能被接收方重复使用,解决的办法是另外再加上一些特殊的凭证,如时间戳。
2. 密钥的长度,如果密钥变得越来越长将不利于使用和管理,如RSA的密钥。