The Elliptic Curve Digital Signature Algorithm(ECDSA)學習之路 - 簽名驗籤流程
前言
本文件主要基於規範<ANSI-X962-2005>
進行學習理解。該標準主要定義了使用ECDSA演算法對資料進行保護的數字簽名的產生和驗證方法。
ECDSA應該與某個已經驗證過的Hash函式結合一起使用,如SHA-1、SHA-224、SHA-256、SHA-384、SHA-512
該標準不僅提供了生成公私鑰對的方法,同時也提供了使用這些金鑰的流程。該標準同樣也提供了產生橢圓曲線引數的方法和演算法中安全使用這些橢圓曲線引數的流程。
安全級別
ECDSA的每種加密都有一定範圍的安全級別。安全級別按照BIT計量,ECDSA只識別那些論證過的安全級別,當前可識別的安全級別有:80 112 128 192 和 256 bit
ECDSA的所有元件應該使用同樣的安全級別,但是也可以有所不同。ECDSA的使用者和使用者應該保證使用的安全級別可以滿足應用程式需要。
Hash函式
ECDSA中的hash函式被用來計算簽名或驗簽過程中用於計算訊息的摘要值。
Hash函式還被用於隨機橢圓曲線引數域的產生和驗證;也可以在橢圓曲線私鑰的隨機數產生器中被使用。
HASH函式的安全級別應該滿足ECDSA的整體要求。
ECDSA
簽名者按照簽名規則對某些資料進行操作,得到簽名值;
驗證者收到簽名值和資料之後,使用驗證規則檢查簽名的正確性。
簽名過程
簽名者通過以下過程簽名訊息:
輸入:
a)簽名訊息M
b)橢圓曲線引數域
c)Hash函式
d
操作流程:
a):使用A.4中的方法產生一個與橢圓曲線引數相關的金鑰對
(k,R)
,其中R=(Xr,Yr)
b):將
Xr
轉換成整數 j
c):設定
r=j mod n
,如果 r= 0
回到步驟ad):使用選擇的hash函式,計算
H=hash(M)
e):按照以下規則從H 中產生e值:
1):如果
⎡log2n⎤ ≥ hashlen
,設定E=H
;否則E=H的最左⎡log2n⎤ bits
2):將bit字串
E
轉換成整數e
f):計算
s = k-1 (e + dr) mod n
,如果s為0 ,回到步驟a
輸出:
(r,s)
驗簽過程
公鑰驗籤
輸入:
a)訊息 M
b) 簽名值由( r',s')
c)橢圓曲線引數域
d)Hash函式
e)公鑰
Q
操作流程:
a):如果 r'
和 s'
不在範圍 [1, n –1]
內,報錯;
b):計算H'= Hash (M')
c):從H'
獲取整數 e'
1)如果 ⎡log2n⎤ ≥ hashlen
,E'= H'
;否則E'= the leftmost ⎡log2n⎤ bits of H'.
2)將bit串 E'
轉換成整數e'
d):計算 u1 = e' (s')–1 modn
,u2 = r'(s')–1 mod n
e):計算R = (xR,yR) = u1G+ u2Q
,如果R是無窮大點,報錯
f):將xR
按照一定的方式轉換成j
g) :計算v = j modn.
h) :比較 v
和 r'
. 如果 v = r
',輸出成功,否則失敗
私鑰驗籤
輸入:
a)訊息 M
b) 簽名值由( r',s')
組成
c)橢圓曲線引數域
d)Hash函式
e)公鑰Q
f)私鑰d
操作流程:
a):如果 r'
和 s'
不在範圍 [1, n –1]
內,報錯;
b):計算H'= Hash (M')
c):從H'
獲取整數 e'
1)如果 ⎡log2n⎤ ≥ hashlen
,E'= H'
;否則E'= the leftmost ⎡log2n⎤ bits of H'.
2)將bit串 E'
轉換成整數e'
d):計算u1 =e' (s')–1 mod n
,u2 = r'(s')–1 mod n
.
e):計算 k'= u1+ u2d mod n.
f):計算R = (xR,yR) = k'G
;如果R
為無窮大點報錯
g):將xR
按照一定的方式轉換成j
h) :計算v = j modn.
i) :比較 v
和 r'
. 如果 v = r
',輸出成功,否則失敗
附錄
素數檢查
如果n是一個大的正整數,則下列的方法決定了n是一個素數還是合數;(素數又稱質數。一個大於1的自然數,除了1和它自身外,不能被其他自然數整除的數叫做質數;否則稱為合數(規定1既不是質數也不是合數))
輸入:
大奇數n
,正整數T
輸出:“素數” or “合數”
a):計算滿足一對整數v、w,
其中v為非負,w為奇數,使得
b):選擇j
,j
在1
到T
範圍內迴圈:
1):使用可驗證的隨機數產生器,在[2, n – 1]
之間產生一個整數a
2):
3)如果 b = 1
或者 b = n-1
,進入步驟 6
4)選擇i
在1
到v-1
之間迴圈
i): `b=b*b mod n`
ii):如果 `b= n-1`, ,去到步驟6
iii) 如果b =1,輸出“合數”,退出
iv):i++,再次迴圈
5)輸出“合數”,退出
6)j
加1迴圈
C):輸出“素數”。