數字簽名就是類似電子版的手寫簽名,首先你要明確你籤的東西,不能說你簽在購房合同上的簽名明天讓別人剪下來貼在欠條上了;其次,這個簽名只有你能簽出來,就比如你的字體,是你籤的就是你籤的,你抵不了賴,別人也僞造不了;當然,簽名要簡單,不能說爲了證明這是你出得合同,你手寫再把上面抄一遍,這個不實際,在電子版中,如果太長或者太難算,那就直接等於增加了網絡或CPU的負擔,影響用戶體驗,這樣你的安全產品是沒人用的。以上是對於簽名者,對於其他人呢,你的簽名要好認,你給我出個數獨,解出來之後答案再拿到什麼什麼東西里算之類的,這樣的簽名就不合適;但同時,你的簽名還不能讓別人能夠輕易僞造;還有一點,就是得好存,怎麼說呢,數字簽名經常用於一些權限的驗證,比如你買了某個公司的軟件,你有好多終端,如果你的數字簽名不好存,那我就只能用這個獲取DS的電腦使用你的服務,這樣影響用戶體驗。
說了這麼多DS的要求,下面說一下實現DS的兩種方法,RSA和DSS。
RSA Approach
sender先把m哈希後,用自己的加密,然後發送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參與驗證部分的計算,爲啥要整除呢,因爲,h是中隨機的,這就是global public key,是屬於某個group纔有的,如果你不屬於這個group又想sniff他們的信息,好的,第一步你先把這三個數算出來吧,512到1024bits哦!
然後是某個用戶的key,,x就是private key,y是public key,像不像Elgalmal PK cryptosystem?DSS好像就是根據E signature scheme改的。和平時不一樣的是,DSS又加了一個隨機的key k,這是sender隨機產生的,sender也不會告訴別人。
現在,假如你是這個group的一員,你所擁有的東西就是(p,q,g,y),當然y是你想驗證目標的public-key,如果它發給你了一個數字簽名M=m||s||r,那麼你所有的東西就是[(p,q,g),(y),(m,s,r),(h(m))],這個h(m)就是特定的hash function啦,當然你也知道你的s和r的計算方法,, ,你怎麼驗證這條簽名呢?
我們要知道,sender不同於其他人的地方其實就是它知道k和x,而它的k和x會和它post給大家的y有關,如果sender能夠成功的把k和x加入到s和r中,我用y能驗證s和r確實是用x進行加密的,因爲我可以用y解開x的部分(當然你得不到這個值),這樣這兩個未知數兩個方程的就變成了一個未知數兩個方程,因爲y帶有x的信息,可以消掉一個未知數,然後我就可以驗證兩個方程共同含有的未知數是否一致了,雖然你也無法計算出k的值。這就是我對DSS的理解。
本着上面的想法(反正我是這麼瞎想的),取s的倒數得到,爲了得到k,,這裏省略了mod是因爲,現在你要麼直接算k然後用r和q把k算出來,要麼就是把k帶到r的公式裏看看和r相不相等,反正我是選第二種,discrete logarithm還是留個大神們吧!這樣你把k帶入r的公式裏就又,那x是人家的private key怎麼辦!別慌,我們還有public key,這樣,你把r和r’對比一下,如果一樣,那就驗證成功了!
參考
Prof.Ding 的ppt