数字签名就是类似电子版的手写签名,首先你要明确你签的东西,不能说你签在购房合同上的签名明天让别人剪下来贴在欠条上了;其次,这个签名只有你能签出来,就比如你的字体,是你签的就是你签的,你抵不了赖,别人也伪造不了;当然,签名要简单,不能说为了证明这是你出得合同,你手写再把上面抄一遍,这个不实际,在电子版中,如果太长或者太难算,那就直接等于增加了网络或CPU的负担,影响用户体验,这样你的安全产品是没人用的。以上是对于签名者,对于其他人呢,你的签名要好认,你给我出个数独,解出来之后答案再拿到什么什么东西里算之类的,这样的签名就不合适;但同时,你的签名还不能让别人能够轻易伪造;还有一点,就是得好存,怎么说呢,数字签名经常用于一些权限的验证,比如你买了某个公司的软件,你有好多终端,如果你的数字签名不好存,那我就只能用这个获取DS的电脑使用你的服务,这样影响用户体验。
说了这么多DS的要求,下面说一下实现DS的两种方法,RSA和DSS。
RSA Approach
sender先把m哈希后,用自己的 k d k_d kd加密,然后发送m|| k d ( h ( m ) ) k_d(h(m)) kd(h(m))给receiver,然后receiver利用sender的公钥和公开的hash function来验证,这个方法我没有进行验证,但是我觉得一直用同一套key的话,如果一直在被passive attack,你的secret key可能是会泄漏的(只是个想法 懒癌有空会去想这个问题的 看不完了 别学我别学我。。。)
DSS Approach
这个厉害,这里有两种key,大家(global)公有的key是p,q和g,p取很大,长度在512到1024之间;(p-1)要能被q整除,并且q要是一个160bits的数,为啥160呢,因为发过去的签名要用于partition,要用q参与验证部分的计算,为啥要整除呢,因为 g = h ( p − 1 ) / q g=h^{(p-1)/q} g=h(p−1)/q,h是 Z p Z_p Zp中随机的,这就是global public key,是属于某个group才有的,如果你不属于这个group又想sniff他们的信息,好的,第一步你先把这三个数算出来吧,512到102