ECDSA(橢圓曲線數(shù)字簽名算法)
AES(高級加密標(biāo)準(zhǔn)): =>對稱加密
? 對業(yè)務(wù)數(shù)據(jù)進(jìn)行加密,防止他人可以看見
ECDSA(橢圓曲線數(shù)字簽名算法):=>非對稱加密算法(公鑰和私鑰)
? 驗證數(shù)據(jù)的真實性,防止業(yè)務(wù)數(shù)據(jù)被篡改
SHA(安全哈希算法)=>哈希算法
1. 作用:
因為ECDSA橢圓曲線數(shù)字簽名算法獲得公鑰和私鑰對是一一對應(yīng)的,不存在"不同私鑰但是公鑰相同的情況"所有偽造ECDSA簽名是根本不可能的
2. 解釋ECDSA
ECDSA當(dāng)中有兩個詞要注意:Curve(曲線)和Algorithm(算法)=>意味著ECDSA基本上是基于數(shù)學(xué)的
1. 基本原理:
假設(shè)給定一條曲線Curve、一串隨機(jī)數(shù)Rand Num以及隨機(jī)在曲線上取原點(Origin Point)
Private_Key=Rand_Num
Public_Key=Magic_Math(Curve,Rand_Num,Origin_Point)
=> 接下來就是要好好理解這個魔法數(shù)學(xué)Magic_Math =>(看完以下的就知道這個Magic_Math其實就是一個在已知橢圓曲線和參考點G的前提下對G進(jìn)行以下運(yùn)算)
P
u
b
l
i
c
_
K
e
y
=
R
a
n
d
_
N
u
m
×
O
r
i
g
i
n
_
P
o
i
n
t
G
(
點
的
乘
法
)
Public\_Key=Rand\_Num \times Origin\_PointG (點的乘法)
Public_Key=Rand_Num×Origin_PointG(點的乘法)
3. 解釋Magic_Math:
1. 前提
ECDSA只使用整數(shù)數(shù)學(xué),沒有浮點數(shù)
=>整數(shù)范圍由簽名當(dāng)中所采用的位數(shù)決定的,更多的位數(shù)意味著更大的數(shù)字范圍,更高的安全性能
? why? 因為整數(shù)范圍越大,則表示的位數(shù)越大那么破解ECDSA所需要猜測的數(shù)字范圍也越大,那么破解所花費(fèi)的時間越長,那么安全性就越高
=>mod 模運(yùn)算:就是整數(shù)求除之后的余數(shù)
2. 橢圓曲線密碼學(xué)
基于以下方程:
y
2
=
(
x
3
+
a
?
x
+
b
)
m
o
d
p
y^2=(x^3+a*x+b) mod p
y2=(x3+a?x+b)modp
以上方程可以得知:
該方程所對應(yīng)的曲線:對于任意的x坐標(biāo)(只能取整數(shù)),你可以得到兩個y的值,且曲線關(guān)于x軸對稱。p是一個素數(shù),且確保所有得到的值在規(guī)定SHA的輸出長度所能夠表示的范圍之內(nèi).
綜上所述:經(jīng)過取模運(yùn)算之后結(jié)果只能在0-p-1之間,
總結(jié):
3. 橢圓曲線點加法的表示方法:
? 注釋:這是a=-4,b=0以后的橢圓曲線,P+Q點與R點對稱
P
=
(
x
1
,
y
1
)
P
+
Q
=
(
X
2
,
y
2
)
=
>
X
1
=
X
2
且
Y
1
=
?
Y
2
P=(x1,y1) \quad P+Q=(X2,y2)=>X1=X2且Y1=-Y2
P=(x1,y1)P+Q=(X2,y2)=>X1=X2且Y1=?Y2
? 所以對于橢圓曲線的點加法的定義是:在橢圓曲線上取兩點P和Q進(jìn)行加法運(yùn)算結(jié)果為P+Q 等價于 P和Q的連接的延長線交于橢圓曲線R點,R點的對稱點即P+Q
4. 橢圓曲線點乘法的表示方法:
k
?
P
可
以
定
義
為
P
對
自
身
進(jìn)
行
k
次
相
加
獲
得
點
k*P可以定義為P對自身進(jìn)行k次相加獲得點
k?P可以定義為P對自身進(jìn)行k次相加獲得點
5.橢圓曲線點乘法的單向陷門性
> 單向陷門函數(shù)的意思是:知道起點和終點不能求得乘數(shù)k,換句話說不知道怎么從起點開始做變換到達(dá)R點 正是這種單向陷門的性質(zhì)是ECDSA的安全性的基礎(chǔ)所在
4.ECDSA算法:
? 首先你需要知道你的橢圓曲線參數(shù)的含義
橢
圓
曲
線
的
數(shù)
學(xué)
表
示
:
y
2
=
(
x
3
+
a
×
x
+
b
)
?
m
o
d
?
p
橢圓曲線的數(shù)學(xué)表示:y^2=(x^3+a\times x+b)\,mod \,p
橢圓曲線的數(shù)學(xué)表示:y2=(x3+a×x+b)modp
其 中 a ? b ? p 是 橢 圓 曲 線 中 的 參 數(shù) , N 是 曲 線 面 上 符 合 該 橢 圓 曲 線 數(shù) 學(xué) 表 示 的 點 個 數(shù) , G 是 曲 線 上 的 任 意 一 點 作 為 起 點 其中a \ b \ p是橢圓曲線中的參數(shù),N是曲線面上符合該橢圓曲線數(shù)學(xué)表示的點個數(shù),G是曲線上的任意一點作為起點 其中a?b?p是橢圓曲線中的參數(shù),N是曲線面上符合該橢圓曲線數(shù)學(xué)表示的點個數(shù),G是曲線上的任意一點作為起點
橢圓曲線的參數(shù)是由**NIST(National Institute of Standards and Technology)和SECG(Standards for Efficient Cryptography Group)** 這兩個機(jī)構(gòu)提供的已知高效和安全的標(biāo)準(zhǔn)化參數(shù)即提供了 a,b,p,G這四個參數(shù)
總結(jié):綜上所述
私
鑰
d
A
是
一
串
隨
機(jī)
數(shù)
公
鑰
Q
a
是
私
鑰
d
A
×
G
獲
得
橢
圓
曲
線
終
點
即
Q
a
=
d
A
×
G
私鑰dA是一串隨機(jī)數(shù) \quad 公鑰Qa是私鑰dA\times G獲得橢圓曲線終點 即\quad Qa=dA\times G
私鑰dA是一串隨機(jī)數(shù)公鑰Qa是私鑰dA×G獲得橢圓曲線終點即Qa=dA×G
Go標(biāo)準(zhǔn)庫 crypto/ecdsa
//私鑰(或者說公私鑰對)
type PrivateKey struct {
PublicKey //所對應(yīng)的公鑰
D *big.Int //私鑰即隨機(jī)數(shù)
}
//公鑰
type PublicKey struct {
//生成該公鑰的橢圓曲線
elliptic.Curve
X, Y *big.Int //公鑰的(X,Y)
}
// GenerateKey generates a public and private key pair.
func GenerateKey(c elliptic.Curve, rand io.Reader) (*PrivateKey, error) {
//k通過randFieldElement方法生成隨機(jī)數(shù)作為私鑰
k, err := randFieldElement(c, rand)
if err != nil {
return nil, err
}
priv := new(PrivateKey)
//設(shè)置該公私鑰對是基于的橢圓曲線
priv.PublicKey.Curve = c
//私鑰
priv.D = k
//設(shè)置公鑰
priv.PublicKey.X, priv.PublicKey.Y = c.ScalarBaseMult(k.Bytes())
return priv, nil
}
綜上所述:
私鑰是數(shù),公鑰是點坐標(biāo),PrivateKey既可以認(rèn)為是私鑰也可以認(rèn)為是公私鑰對
5.ECDSA算法進(jìn)行數(shù)字簽名過程:
? 假設(shè)下面的哈希算法采用的是SHA1那么輸出的長度為20字節(jié),那么簽名(R,S)中每個分量都是20字節(jié)
-
問題:如何對一個文件或一個消息進(jìn)行簽名呢?
過程:已知橢圓曲線參考點G、私鑰dA以及產(chǎn)生一個隨機(jī)數(shù)K
1. P = k × G ( × 是 橢 圓 曲 線 上 的 點 乘 ) 1. P=k \times G (\times 是橢圓曲線上的點乘) 1.P=k×G(×是橢圓曲線上的點乘)
2. P 點 的 x 坐 標(biāo) 作 為 R ( 20 字 節(jié) ) 2. P點的x坐標(biāo)作為R(20字節(jié)) 2.P點的x坐標(biāo)作為R(20字節(jié))
3. 對 消 息 M s g : z = S H A 1 ( M s g ) ( z 為 20 字 節(jié) ) 3.對消息Msg:z=SHA1(Msg) (z為20字節(jié)) 3.對消息Msg:z=SHA1(Msg)(z為20字節(jié))
4. S = k ? 1 ( z + d A × R ) ? m o d ? p ( k ? 1 是 k 的 模 的 乘 法 逆 元 ) 4. S=k^{-1}(z+dA\times R)\ mod \ p \quad (k^{-1}是k的模的乘法逆元) 4.S=k?1(z+dA×R)?mod?p(k?1是k的模的乘法逆元)
最 終 的 輸 出 的 是 兩 元 數(shù) 組 ( R , S ) 最終的輸出的是兩元數(shù)組(R,S) 最終的輸出的是兩元數(shù)組(R,S)
-
問題:如何驗證簽名的合法性?
過程:已知(R,S),公鑰Qa,參考點G以及消息msg
z = S H A ( m s g ) z=SHA(msg) z=SHA(msg)P = S ? 1 × z × G + S ? 1 × R × Q a ( 第 1 , 2 個 是 橢 圓 曲 線 上 的 點 乘 算 法 ) P=S^{-1}\times z \times G+S^{-1} \times R \times Qa (第1,2個是橢圓曲線上的點乘算法) P=S?1×z×G+S?1×R×Qa(第1,2個是橢圓曲線上的點乘算法)
然后判斷P的x坐標(biāo)是否于R相等,如果相等則這個簽名有效,否則是無效的
有效的含義即這個Msg認(rèn)為是真實且可信的
總結(jié)
- 私鑰是一個隨機(jī)數(shù),公鑰是一個點.
- 利用橢圓曲線上點乘是一個單向陷門函數(shù)特有的性質(zhì),作為ECDSA的安全性保證,使得生成公鑰.
- 參數(shù)a,b,p,G可以由NIST和SECG提供.
- 了解數(shù)字簽名和驗證簽名的過程,可以明白真正隨機(jī)數(shù)的重要性.
參考文獻(xiàn)
知乎之?dāng)?shù)海拾荒文章來源:http://www.zghlxwxcb.cn/news/detail-782981.html
孫榮燕,蔡昌曙,周洲,趙燕杰,楊金銘.國密SM2數(shù)字簽名算法與ECDSA算法對比分析研究[J].網(wǎng)絡(luò)安全技術(shù)與應(yīng)用,2013(02):60-62.文章來源地址http://www.zghlxwxcb.cn/news/detail-782981.html
到了這里,關(guān)于算法2_非對稱加密算法之ECDSA(橢圓曲線數(shù)字簽名算法)的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!