密碼學 - 橢圓曲線
橢圓曲線是一系列滿足如下方程的點:
y^2 = x^3 + ax + b
並且
4a^3 + 27b^2 != 0
特性
- 封閉性:因爲橢圓曲線上的點相加,還是橢圓曲線上的點。
- 結合律:P+(Q+R) = (P+Q)+R = 0
- 單位元: 單位元是0, 即 P+0 = P
- 逆元: 一個橢圓曲線上的點P的逆元,是相對x座標的對稱點
- 交換律:P+Q = Q+P
標量乘法
nP = P + P + P + ... +P
- 計算標量乘法,最簡單的方法是一個個P點相加
- 有個快速的計算方法:double後相加. "Double"主要是依次獲得某個位對應的變量的結果。如果該位是1,就加到最後的結果中:
生成一個公鑰
通常使用橢圓曲線算法,先選擇曲線,計算橢圓曲線的階,然後在這條曲線上找到最大的子羣。找子羣,就是尋找子羣對應的生成元(G
)。
從一個密鑰(形式上是一個隨機生成的數字k)開始,我們將它與曲線上預定義的點相乘,可以得到曲線上的另一個點,這就是相應的公鑰K,而這個預定義的點叫作生成點G。生成點是作爲secp256k1標準的一部分定義的,對於比特幣而言,其所有密鑰均使用相同G點。
K=kG
k是密鑰,G是生成點,K是生成的公鑰,也是橢圓曲線上的一個點
找到生成點G的倍數kG。也就是G相加k次
在橢圓曲線中,一個點與其自身相加等同於在這個點上畫一條切線,找到切斜與曲線相交的點,相交點相對x軸對稱的點就是我們要找的點
演示G在橢圓曲線上被整數k相乘
兩大系列
- NIST系列曲線
- 美國國家標準與技術研究院(National Institute of Standards and Technology, NIST)
- 目前廣泛使用
- 代表:
secp256k1
- 25519系列曲線
- 著名密碼學家Daniel J. Bernstein在2006年獨立設計的橢圓曲線加密/簽名/密鑰交換算法
- 目前最快
- 代表:
ed25519
ED25519曲線
Curve25519/Ed25519/X25519 是著名密碼學家Daniel J. Bernstein在2006年獨立設計的橢圓曲線加密/簽名/密鑰交換算法,與現有的任何橢圓曲線算法完全獨立,其中Ed25519用於簽名。
25519系列曲線自2006年發表以來,除了學術界無人問津,2013年愛德華·斯諾登曝光棱鏡計劃後,該算法突然大火,OpenSSH迅速增加了對25519系列的支持,RFC增加了SSL/TLS對X25519密鑰交換協議的支持。
ed25519
的橢圓曲線方程如下:
y^2=x^3+486662x^2+x,modulop=2^255-19
25519算法的特點如下
- 完全開放設計。算法各參數非常明確,沒有任何可疑之處,而目前廣泛使用的橢圓曲線是NIST,係數有來歷不明的隨機種子, 如:
secp256k1
- 安全性高。 實踐上最安全的加密算法
- 速度快。25519系列曲線是目前最快的橢圓曲線加密算法,性能遠遠超過NIST系列。
參考:
https://mp.weixin.qq.com/s/-Pws7J_9DOvwxXJ-Ma9mig
http://mathworld.wolfram.com/EllipticCurve.html