ECDSA - Elliptic Curve Digital Signature Algorithm

身為曾經的通訊組研究生,儘管主修影像壓縮與編解碼的演算法,同實驗室還有語音編解碼以及類神經網路;但在當年組內的七大實驗室當中,密碼學的那一間,總透著神秘。原來在網路的世界當中,密碼學的應用這麼普遍。

ECDSA (Elliptic Curve Digital Signature Algorithm),除了加密領域的應用之外,同時也是區塊鏈應用的引擎核心。其重要性類似於影像壓縮領域中的 DCT (Discrete Cosine Transform) 演算法。後者深藏在各式影像與視訊串流的應用當中,乃至在效能與邏輯閘的數目最佳化以後,直接內建於硬體晶片之中。

在區塊鏈底層的架構中,不論是產生一個新的位址,簽名發出一條交易,或者簽署一則訊息,都需要透過 ECDSA。它的原理,主要定義了一條橢圓曲線 (Elliptic Curve) 以及一個初始點,在一個相當大但有限的質數場域內,將私密金鑰轉換成公開金鑰,並且這是一個不可逆的過程。接著,公鑰進一步編碼,變成有效的位址,相對應的私鑰則能夠簽署基於該位址的有效交易,而外人根據位址與公鑰,可以輕易證明交易的有效性;另外,透過對一則訊息的簽名,在不公開私鑰的前提之下,能夠證明擁有所對應的公鑰以及其位址。

這樣的曲線與初始點,加上質數的選擇,可以產生許多不同的組合。舉比特幣區塊鏈為例子,他選擇了其中的一組參數,稱為 SECP256K1;其意義是,這是一個基於 256 位元 (256) 質數 (P, Prime) 場域的 Koblitz 橢圓曲線 (K, Koblitz) 的加密演算法 (SEC, Standards for Efficient Cryptography)。因此定義出了這條曲線,初始點,以及其質數場域如下:

# 曲線:y^2 = x^3 + ax + b (mod p), 其中
● a = 0;  
● b = 7;  
● p = 2^256 − 2^32 − 2^9 − 2^8 − 2^7 − 2^6 − 2^4 − 1 = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFC2F;

# 初始點 G,  
● G(x) = 0x79BE667EF9DCBBAC55A06295CE870B07029BFCDB2DCE28D959F2815B16F81798;
● G(y) = 0x483ADA7726A3C4655DA4FBFC0E1108A8FD17B448A68554199C47D08FFB10D4B8;

# 級數 n,  
● n = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141;

級數表示了在曲線上包含了無限遠在內所有點的數目總和。所以總共存在 a, b, p, G, n 等五個參數。

隨機選定一個私鑰 k 並且不能大於 n,令 1 <= k <= n-1,

則可以得到落在曲線上的一個點 (x1, y1) = k * G;  

其中對於 G 的乘法可以簡化成為『倍數』與『加法』的運算。詳情參照這篇

另外還牽涉到模反元素的運算,需要先進行初步理解。

這就是 ECDSA 的核心。

接下來是公鑰與位址的產生,簽名,與驗證。