在密碼學中,環形簽名是一種數字簽名,可以由一組使用者中的任何成員執行,每個使用者都有金鑰。因此,一個帶有環簽名的訊息是由特定人群中的某個人背書的。環簽名的安全特性之一是,不能通過計算確定哪個組成員的金鑰才是簽名。
例如,環簽名可以用來提供一種來自“白宮高階官員”的匿名簽名,而不透露是哪位官員簽署了這條資訊。環簽名適合這個應用,因為環簽名的匿名性不能被撤銷,而且一個環簽名的是可以臨時組成的(不需要預先設定)。
以上資訊來自百科
環簽名的任務
環簽名所要達成的目標是:在簽名過程中將與私鑰相關的資訊隱藏在眾多公鑰之中。
環簽名的可用性
在簽名過程中,每個公鑰都對應這一個隨機數(隨機數會參與計算),而簽名者由於擁有自己的私鑰,所以可以計算出一個能夠使的環閉合的那個特定的數(之後會放在隨機數裡),我們無法在一堆隨機數裡找到這個特定的數,也就是說無法確定是誰的私鑰參與了計算。但是可以確定這個簽名一定是至少擁有這眾多公鑰之中某一個對應的私鑰,不然是無法使環閉合。這就可以保證一定是環中的某個成員所簽名認證的。
利用眾多的公鑰依次對訊息進行加密(其中摻雜這隨機數,隨機數與公鑰存在一一對應關係)
環簽名的特性
除了上面所說的匿名性以外,環簽名的另一特點是簽名者在完成簽名之後無法證明改環簽名是由自己所籤。
因為在隨機數列表中他無法證明那個特定的隨機數是簽名者自己產生的,實際上每個擁有對應私鑰的人都可以說某個隨機數是他產生的。也都可以說是其他人產生的,因為從一個環的任意一點截斷所得到的繩子一定是一樣的。
通過現實案例解釋環簽名
例如你們需要實名舉報你們某個人,但是誰都不想在這個簽名紙上第一個簽下自己的姓名(這相當與發起人),這時你提議所有人以某個點為圓形,在一定的半徑上簽名,在所有人都簽完之後形成一個完整的環,這樣也就無法確認這個環的首部在哪裡。
當然這個案例所講述的知識環簽名的作用,在實際操作上與上述例項還是有很大的不同。
環簽名的一種實現(利用各個公鑰的加密演算法)
- 簽名者需要擁有:多個他人的公鑰{P0,P1,P2.......Pn}注意這裡的他人有n+1個,以及對應的加密演算法Gi,自身的公私鑰對
- 簽名者首先計算待簽名的雜湊值用作簽名,記做H
- 簽名者為每個公鑰產生一個對應的R,及產生{R0,R1,R2.......Rn}
- 簽名者產生一個隨機數V0,用做首次計算
- 簽名者利用他人的公鑰將Ri加密產生對應的Y,記做{Y0,Y1,Y2,Y3.....Yn}
- 依次計算V1=V0^Y0+H........最後的到V(n+1):這一步已經利用晚所有的公鑰(這裡本來是連續亦或,後來發現連續亦或有可能導致H被抵消掉)
- 現在已經形成一個鏈,如果V0和最後一個V相等則會形成一個環(現在是不等的)
- 於是我們可以計算出那個使環閉合的Y,V0=V(n+1)^Y^H,這裡V0,V(n+1),H都已知可以得到這個Y
- 也就是說只要我有一個特定的R,使得用我的公鑰加密後的結果為Y,那麼這個R就會使環閉合
- 所以這裡就到了簽名最關鍵的一步,在已知Y的情況下,簽名者用自己的私鑰很容易就可以計算出這個特定的R,因為這個Y是用簽名者自己的公鑰計算出的。
- 將簽名者的私鑰放在listP的尾部,R放在listR的尾部
- 這裡由於會暴露簽名者在這個公鑰連結串列的尾部,所以還不急著把V放進去,在已知這是一個環的情況下我們只需要將這個環隨機的轉動一下,也就是對listP,listR進行一個迴圈移位,然後將對應的V選取出來得到這個簽名S(listP,listR,V)
上述簽名的可用性原理
要說明這個簽名的可用性主要是要證明這個簽名一定是由公鑰中的某個人所籤的,他人可以驗證的到這個簽名是正確的
首先在上述簽名過程中使環閉合的那個數是由簽名者私鑰計算得出的,也就是說簽名者至少擁有listP中某一個或多個公鑰所對應的私鑰,這也就說明了簽名一定來自與listP中的某個人,在listP之外的人是無法偽造簽名的。驗證人只需要計算檔案的hash然後利用計算出的H驗證這個V成環。
先預約一下下次更新:go或者python實現環簽名(實際上我已經用go大概實現了原理,但是go語言自帶的rsa庫中不能用私鑰解密一個隨機的資料,他還會驗證資料是否可用,就是敗在最關鍵的一步)?,最遲下週6更新