最近在研究區塊鏈的時候關注了一下加密技術,小有心得,於是設計了一款資料加密共享與簽名的方案,希望能夠為做電子合同,資料存證,資料共享的朋友有所幫助吧。
業務場景
一、電子合同
Alice和Bob需要簽訂一個合同,而Charlie是中介,也需要在看到該合同上並簽字,而Dave是外人,不參與這個合同的簽訂,所以不允許看到合同的內容。
二、資料存證
Alice和Bob在網上玩剪刀石頭布的遊戲,由於沒有第三方的參與,所以Alice必須告訴Bob她已經做出了選擇,但是同時又不能告訴Bob她具體出的是什麼,Bob同樣也是要告訴Alice他已經做出了選擇,而又告訴她具體選擇是什麼。在雙方都確認對方做出了選擇後,然後各自公佈自己的選擇,並且可以驗證對方公佈的結果是不是跟之前告之的一致。
三、資料共享
Alice、Bob和Charlie是同事,他們在使用同一個公司網盤共享檔案。現在有一個機密專案只有Alice和Bob在參與,他們希望繼續通過公司網盤共享檔案,但是同時也不希望Charlie能夠看到他們共享的檔案中的內容。後來新同事Dave加入到了該機密專案中,又希望Dave能夠看到共享的檔案內容。
涉及的密碼學
1.對稱加密
也就是說用明文通過金鑰的加密後得到密文,使用同樣的金鑰就可以把密文解密為明文。常用的對稱加密演算法是3DES。
2.非對稱加密
金鑰是有一對(2個,1個叫公鑰,1個叫私鑰),使用公鑰加密的資訊,只有對應的私鑰才能解密;使用私鑰加密的資訊,只有對應的公鑰才能解密。公鑰是可以公開出來的,私鑰需要自己儲存,不能讓其他人知道。目前主要的非對稱加密演算法有RSA和橢圓曲線加密演算法ECC。
3.雜湊
雜湊演算法是一種摘要演算法,對於任意長度的輸入,都輸出相同長度的結果,並且輸出結果對輸入具有敏感性,也就是說輸入只是一個小小的變化,就會引起輸出巨大的不同。另外雜湊演算法還需要扛對撞,也就是說我們不能輕易找到兩個不同的輸入,使得他們的雜湊輸出相同。常用的雜湊演算法有MD5, SHA256 。
4.數字簽名
數字簽名就是將雜湊演算法與非對稱加密演算法結合的一個最好應用。對於一條明文訊息M,我們需要對其進行簽名,那麼首先就是計算該訊息的摘要,也就是雜湊值,得到H(M),然後再用我們的私鑰對這個雜湊值進行加密,結果就是數字簽名。任何人拿到訊息M和數字簽名後,都可以用我們的公鑰對數字簽名進行解密,將解密結果與訊息M的雜湊值進行對比,如果相同,就說明M沒有被更改,同時該簽名也是我們簽署的,而不可能是別人偽造的簽名。
電子合同的簽名方案
1.準備
每個使用者都有自己的私鑰和公鑰,私鑰由於私密性,所以需要加密儲存,使用者只有輸入自己設定的口令後才能解密出自己的私鑰。而使用者的公鑰則公開在系統上,所有使用者都可訪問。
2.加密合同
Alice現在準備好合同檔案M,由於隱私的考慮,所以需要對合同檔案加密,而這裡加密採用的是對稱加密演算法,金鑰是隨機生成的,加密後的合同檔案為密文M。Alice希望合同的乙方Bob還有就是中介Charlie能夠看到這個合同(當然Alice本人也需要能看到合同),所以她將這個隨機金鑰用各自的公鑰進行加密,加密後生成了3個密文:密文A、密文B、密文C。現在Alice就可以將加密後的合同密文M以及密文A、密文B、密文C放到網上。
3.簽名合同
Alice不需要對明文的合同M進行簽名,她需要的是在密文M上進行簽名,也就是說先計算出密文M的雜湊值“H(密文M)”,然後用自己的私鑰A對該雜湊值進行加密,這樣就能得到簽名A。現在Alice把簽名A也放在網上,因為Alice的公鑰是公開的,所以任何人都可以用公鑰A來解密簽名A,從而驗證密文M的雜湊值是否和解密相同。
4.解密合同
Bob作為合同的乙方,在收到Alice上傳並簽名的合同後,他首先需要驗證合同的簽名A是否正確,如果正確則說明該合同確實是Alice簽名的,而且沒有被篡改過。但是網上存在的合同是密文M,那麼Bob該怎麼檢視合同內容呢?因為Bob有自己的私鑰,他可以解鎖出解密檔案的隨機金鑰,用這個金鑰再去解密加密檔案,就能夠看到原始檔案了。
5.加簽合同
接下來Bob需要加簽合同,那麼他的做法和步驟3簽名合同是類似的,只需要用自己的私鑰對密文進行簽名,然後把簽名放到網路上即可。
【上面的文章是我在整理電腦時發現當年寫了,沒有釋出的,現在稍作修改釋出出來,希望對大家有所幫助。】