深入淺出:區塊鏈技術中的非對稱加密演算法--簽名和加密

買賣虛擬貨幣

專欄介紹:

本系列文章是荷月科技在過去幾年中為企業或政府提供區塊鏈解決方案所得到的一些經驗總結,也是我們在區塊鏈技術應用這一過程中的一些思考。

我們希望使用區塊鏈技術幫助企業或政府降低信任成本,開拓新的業務機會,荷月科技是一個求真務實的團隊,希望這些分享與溝通能切實的幫助企業更好的應用區塊鏈技術。

——荷月科技 羅蔚

作者介紹:

朱天陽:荷月科技開發工程師,曾參與中國電子技術標準化研究院牽頭的《中國區塊鏈與物聯網融合創新應用藍皮書》、《區塊鏈資料格式規範》標準、《中國區塊鏈技術和應用發展研究報告(2018)》等行業標準及白皮書。在區塊鏈架構,應用開發等具有豐富的經驗。

簽名是一種非對稱加密演算法的用法,即使用不同的加密金鑰與解密金鑰,而由已知加密金鑰推匯出解密金鑰在計算上是不可行的。簽名是用非對稱演算法的私鑰簽名,然後用私鑰對應的公鑰來驗證簽名,的主要作用是確定傳送方的身份。

除了簽名,非對稱加密演算法還有一個用處是加密和解密,加密則是用公鑰來對資訊加密,然後用對應的私鑰進行解密,主要作用是向接收方傳遞加密的資訊。簽名和加密的作用和演算法都不相同,因此需要加以區別。

1

簽名與驗籤

簽名演算法可以在不洩露傳送者本身的私鑰的情況下,透過公鑰和簽名資訊來確認傳送者持有對應的私鑰。簽名還可將傳送者的身份和資訊繫結,防止其他人冒充傳送者,因此這樣處理可保證資訊的防篡改的同時認證傳送者的身份。目前常用的簽名驗籤演算法有RSA數字簽名和橢圓曲線數字簽名(ECDSA),其中橢圓曲線數字簽名是區塊鏈中應用最多的方法。

1.1 RSA數字簽名

RSA 是被研究得最廣泛的公鑰演算法,從提出到現在已有四十年的歷史,經歷了各種攻擊考驗。RSA的安全性主要依賴大數分解,優勢是秘鑰長度可以增加到任意長度。

RSA運算方式造成了簽名內容如果較短,會被很容易修改為攻擊者想要的內容,所以一般還需要將簽名內容進行一次雜湊運算,並填充至和私鑰差不多的長度。此外,隨著計算能力的增長,為防止被破解,秘鑰長度也需要不斷增長,目前認為安全的秘鑰長度是2048bit。同時RSA的私鑰生成需要兩個質數的組合,因此尋找更長私鑰的計算速度也更慢。

1.2 橢圓曲線數字簽名

橢圓曲線演算法是利用在有限域上的橢圓曲線的離散對數問題來加密或簽名的。橢圓曲線的秘鑰和RSA不同,有效範圍會受橢圓曲線引數的限制,因此不能像RSA一樣可以透過增加私鑰長度來提高安全性,對於安全性不夠的曲線,必須修改橢圓曲線的引數,不如RSA靈活。

和RSA演算法比,橢圓曲線的優勢在於:私鑰可以選取有效範圍內的任意數,私鑰的生成速度遠快於RSA演算法的私鑰。最重要的是相同秘鑰長度的橢圓曲線安全效能高很多,因此達到相同安全等級需要的橢圓曲線秘鑰的長度遠小於RSA秘鑰的長度,因此佔用的儲存空間相對較小,對於儲存比較受限的區塊鏈來說,橢圓曲線更適用。

這裡用橢圓曲線對簽名演算法進行簡單介紹,因為橢圓曲線的簽名方法和加解密的方法區別明顯,而RSA的簽名和加解密演算法模式近似,容易引起混淆,在此不做介紹。

1.3 非對稱簽名驗籤演算法

簽名演算法最主要的思路就是利用演算法的單向性,使私鑰和隨機數被隱藏起來,然後用公開資訊計算獲得一致的結果來驗證簽名的有效性。

如圖所示,藍線為簽名所需要的資料,經過單向門的資料可被隱藏,未經過單向門的資料需要小心處理;紅線是驗籤的資料,這些資料對驗籤者都是公開的。

下面不考慮乘法在有限域橢圓曲線上的具體演算法,以SEC的橢圓曲線簽名演算法來簡單介紹一下簽名的過程。SEC是一個橢圓曲線的標準,一些常用的曲線,如secp256k1、secp256r1都是這個標準下的(http://www.secg.org/sec1-v2.pdf)。其他橢圓曲線演算法的流程都差別不大,但是簽名的方式有區別,如國密SM2的簽名和驗籤計算的方式和SEC的不一樣,給訊息進行雜湊演算法的流程也更多。RSA簽名則沒有隨機數的流程。

1.3.1 私鑰簽名

簽名演算法多次用到了演算法的單向性,可以看做一個單向的門,經過計算相當於從一邊穿過單向門,但是並不能透過運算再走回去。比如私鑰為k,公鑰K可透過橢圓曲線乘法算出:kG(x,y)=K(x',y'),其中G為橢圓曲線基點,但知道公鑰K和基點G是無法反推出私鑰k的。橢圓曲線乘法和雜湊演算法都是這種單向門。簽名的過程為(其中有小寫字母的為數值,大寫字母為點):

1.取隨機數r,計算橢圓曲線乘法:r * G(x,y) = R(x",y");

2.計算訊息m的雜湊值h:Hash(m)=h;

3根據隨機數r,雜湊值h和私鑰k,計算 s = (h + k * Rx) / r,其中Rx為R點x軸的數值;

4.將訊息m(一些需要隱私保護的情況下可能僅發生雜湊值h)和簽名(Rx, s)傳送給驗證者。

需要注意的是第三步s的計算是數值計算,利用隨機數隱藏私鑰,並非雜湊或橢圓曲線乘法這種單向性的運算。因此每次簽名隨機數r必須更換,否則對不同資訊用相同的隨機數簽名就可以推算出私鑰,而且隨機數r的質量將影響私鑰的保密性。

1.3.2 公鑰驗籤

驗籤是透過公鑰K(x',y')、訊息雜湊h和簽名值(Rx,s)來推算簽名值是否由公鑰K對應的私鑰k簽名。驗籤的過程為:

1.根據收到的訊息m,計算雜湊值h:Hash(m)=h;

2.根據收到的公鑰、簽名和雜湊值h計算:R’ = hG(x,y)/s + RxK(x',y')/s

3.驗證R‘x是否等於Rx。

公鑰驗籤的原理是用公鑰、簽名和雜湊值構造出演算法,使計算結果能回到原來選取的隨機數上:

R’ = h * G(x,y) / s + Rx * K(x',y') / s

= h * G / s + Rx * (k * G) / s

= (h + k * Rx)G / s

= (h + k * Rx)G * (r / (h + k * Rx))

= r * G

因此驗籤是否成功的標誌是R'x和Rx是否相同。

這裡都是最簡化的推導方式,沒有把求模運算和具體的橢圓曲線加法和乘法等涉及到的運算考慮進去,實際計算中關於數值的計算要求模,因此最後R’可能算出的是R的對稱點,而對稱點的y軸座標不同但是x軸相同。還有,數值除法也並不是常規的運算,而是將除數轉換成模逆元再做乘法。

2

加密與解密

非對稱加密的作用是將資訊透過公鑰加密傳遞給私鑰持有者。非對稱加密和簽名相反,資訊是經過隱藏的,傳送方也並不和身份繫結,主要的功能是傳輸資訊而不是確定身份。非對稱加密的效率比對稱加密低很多,主要的優勢是接收方不需要將秘鑰透過交換協議或者直接傳輸給資訊傳送方。和簽名類似,非對稱加密也有RSA和橢圓曲線的方法。

加密同樣利用演算法的單向性,使訊息和隨機數被隱藏起來,然後用私鑰計算將加密的訊息提取出來。

如圖所示,藍線為簽名所需要的資料,經過單向門的資料可被隱藏,未經過單向門的資料需要小心處理;紅線是驗籤的資料,這些資料是要傳給解密者或者解密者本身持有的。解密流程中私鑰為解密方單獨持有,隨機數和訊息由加密方生成和提供。

2.1 公鑰加密

加密也用到單向門的特性將隨機數隱藏,具體流程為:

1.取隨機數r,計算橢圓曲線乘法:r * G(x,y) = R(x',y');

2.將訊息m編碼到橢圓曲線上,獲取橢圓曲線上的點M(x",y");

3.用隨機數r和接收方的公鑰K,計算橢圓曲線乘法:r * K(x,y);

4.計算橢圓曲線加法得出加密點S(x"',y"') = M(x",y") + r * K(x,y),並和R(x',y')一起傳送給接收方;

加密中編碼的方式有很多種,比如用M點做對稱加密的金鑰,然後將用該金鑰加密後的資訊一起傳送給接收方,接收方用私鑰解密出M後,再用M解密對稱加密的資訊。

2.2 私鑰解密

私鑰解密是透過加密內容,隨機點R和私鑰k來還原出編碼M的過程,具體流程為:

1.根據傳送方傳輸的S(x"',y"'),R(x',y')和接收方自己的私鑰k,計算S(x"',y"') - k * R(x',y')還原M(x",y");

2.用編碼M解出訊息m;

私鑰解密的原理是用私鑰和加密相關的訊息還原出編碼點M:

S(x"',y"') - k * R(x',y') = M(x",y") + r * K(x,y) - k * R(x',y')

= M(x",y") + r * k * G - k * r * G(x',y')

= M(x",y")

然後根據M還原出加密的訊息。

免責聲明:

  1. 本文版權歸原作者所有,僅代表作者本人觀點,不代表鏈報觀點或立場。
  2. 如發現文章、圖片等侵權行爲,侵權責任將由作者本人承擔。
  3. 鏈報僅提供相關項目信息,不構成任何投資建議

推荐阅读

;