奇妙的安全旅行之ECC算法
hi,大家好,我是開發者FTD。今天我們來介紹一下非對稱加密算法的ECC算法。
ECC 算法簡介
ECC 是 Elliptic Curves Cryptography 的縮寫,意為橢圓曲線密碼編碼學。和RSA算法一樣,ECC算法也屬于公開密鑰算法。最初由 Koblitz 和 Miller 兩人于1985年提出,其數學基礎是利用橢圓曲線上的有理點構成Abel加法群上橢圓離散對數的計算困難性。
ECC 算法的數學理論非常深奧和復雜,在工程應用中比較難于實現,但它的單位安全強度相對較高,它的破譯或求解難度基本上是指數級的,黑客很難用通常使用的暴力破解的方法來破解。RSA算法的特點之一是數學原理相對簡單,在工程應用中比較易于實現,但它的單位安全強度相對較低。因此,ECC算法的可以用較少的計算能力提供比RSA加密算法更高的安全強度,有效地解決了“提高安全強度必須增加密鑰長度”的工程實現問題。
ECC 算法工作原理
近年來,人們對ECC的認識已經不再處于研究階段,開始逐步進入實際應用,如國家密碼管理局頒布的SM2算法就是基于ECC算法的。下面我們來認識一下ECC的工作原理。
密碼學中的橢圓曲線
定義
在有限域 Fp 中定義一個橢圓曲線,常用
y2=x3+ax+by^2 = x^3 + ax + b y2=x3+ax+b
Fp 中只有p個元素,p為素數
Fp 中,
a+b≡c(modp),a×b≡c(modp),a/b≡c(modp)a+b≡c (mod \quad p),a×b≡c (mod \quad p),a/b≡c (mod \quad p) a+b≡c(modp),a×b≡c(modp),a/b≡c(modp)
4a3+27b2≠0(modp)4a^3 + 27b^2 ≠0 (mod\quad p) 4a3+27b2?=0(modp)
a,b是小于p的非負整數
x,y 屬于0到p-1間的證書,曲線標記為 Ep(a,b)
階:橢圓曲線上一點P,存在正整數n,使得nP=O∞,則n為P的階,若n不存在,則P是無限階的,有限域上定義的橢圓曲線上所有點的階都存在。
橢圓曲線難題
K=kGK = kG K=kG
其中K,G為Ep(a,b)上的點,k為小于n的整數,n是點G的階,給定k和G,計算K容易,但是給定K和G,求k就很難了!
因此,設K為公鑰,k為私鑰,G為基點。
ECC 算法加密過程
A選定一條橢圓曲線Ep(a,b),并取曲線上一點作為基點G
A選擇一個私鑰k,并生成公鑰K=kG
A將Ep(a,b)和k,G發送給B
B收到后將明文編碼到Ep(a,b)上一點M,并產生一個隨機數r
B計算點C1=M+rK,C2=rG
B將C1,C2傳給A
A計算C1-kC2=M+rkG-krG=M
A對M解碼得到明文
攻擊者只能得到Ep(a,b),G,K,C1,C2,沒有k就無法得到M。
ECC 算法簽名驗簽流程
A選定一條橢圓曲線Ep(a,b),并取曲線上一點作為基點G
A選擇一個私鑰k,并生成公鑰K=kG
A產生一個隨機數r,計算R(x,y)=rG
A計算Hash=SHA(M),M‘=M(modp)
A計算S=(Hash+M’k)/r(modp)
B獲得S和M’,Ep(a,b),K,R(x,y)
B計算Hash=SHA(M),M’=M(modp)
B計算R’=(Hash*G+M’K)/S=(HashG+M’*kG)*r/(Hash+M’k)=rG=R(x,y),若R’=R,則驗簽成功。
以上加解密和簽名驗簽流程只是一個例子,具體應用時可以利用K=kG這一特性變幻出多種加解密方式。
ECC 算法實現
定義橢圓曲線上的點(x,y):
class Pare {long x;long y;public Pare() {super();}public Pare(long x, long y) {super();this.x = x;this.y = y;}//加法public Pare add(Pare pare) {if (this.x == Integer.MAX_VALUE) {//為無窮大時O+P=Preturn pare;}Pare res = new Pare();if (this.y == pare.y && this.x == pare.x) {//相等時long d = moddivision(3 * this.x * this.x + EccUtil.e.a, EccUtil.e.p, 2 * this.y);res.x = d * d - 2 * this.x;res.x = mod(res.x, EccUtil.e.p);res.y = d * (this.x - res.x) - this.y;res.y = mod(res.y, EccUtil.e.p);} else if (pare.x - this.x != 0) {long d = moddivision(pare.y - this.y, EccUtil.e.p, pare.x - this.x);res.x = d * d - this.x - pare.x;res.x = mod(res.x, EccUtil.e.p);res.y = d * (this.x - res.x) - this.y;res.y = mod(res.y, EccUtil.e.p);} else {//P Q互逆,返回無窮大res.x = Integer.MAX_VALUE;res.y = Integer.MAX_VALUE;}return res;}//減法public Pare less(Pare p) {p.y *= -1;return add(p);}//乘法public Pare multiply(long num) {Pare p = new Pare(this.x, this.y);for (long i = 1; i < num; i++) {p = p.add(this);}return p;}//求余,解決負號問題public long mod(long a, long b) {a = a % b;while (a < 0) {a += b;}return a;}//求余取商(a mod b)/c/*public long moddivision(long a, long b, long c) {a = mod(a,b);while(a%c != 0) {a += b;}a = a/c;return a;}*/public long moddivision(long a, long b, long c) {a = mod(a, b);c = mod(c, b);a = a * EccMath.exgcd(c, b);return mod(a, b);}@Overridepublic String toString() {return EccTools.obox(EccTools.long2hexStr(this.x), 4) + " " + EccTools.obox(EccTools.long2hexStr(this.y), 4);} }加密:
//加密 public Message encryption(Pare g, Pare pbk, Pare word) {pbk = g.multiply(privatekey);//公鑰int d = new Random().nextInt(1024);//隨機數Pare dg = g.multiply(d);Pare dp = pbk.multiply(d);Pare send = word.add(dp);return new Message(dg, send); }解密:
//解密 public Pare decryption(Message m) {Pare pab = m.pa.multiply(this.privatekey);Pare result = m.pb.less(pab);return result; }查看完整代碼請訪問:
https://github.com/ForTheDevelopers/JavaSecurity
ECC 算法優勢:
-
更適合于移動互聯網:ECC 加密算法的密鑰長度很短(256位),意味著占用更少的存儲空間,更低的CPU開銷和占用更少的帶寬。目前手機已經越來越普及,隨著越來越多的用戶使用移動設備來完成各種網上活動,ECC 加密算法為移動互聯網安全提供更好的客戶體驗。
-
更好的安全性:ECC 加密算法提供更強的保護,比目前的其他加密算法能更好的防止攻擊,使你的網站和基礎設施比用傳統的加密方法更安全,為移動互聯網安全提供更好的保障。
-
更好的性能: ECC 加密算法可以用較短的密鑰長度來提供更好的安全。例如,256 位的 ECC 密鑰加密強度等同于 3072 位 RSA 密鑰的水平(目前普通使用的 RSA 密鑰長度是 2048 位)。其結果是你以更低的計算能力代價得到了更高的安全性。經國外有關權威機構測試,在 Apache 和 IIS 服務器采用 ECC 算法,Web服務器響應時間比 RSA 快十幾倍。
-
更大的IT投資回報:ECC 可幫助保護您的基礎設施的投資,提供更高的安全性,并快速處理爆炸增長的移動設備的安全連接。 ECC 的密鑰長度增加速度比其他的加密方法都慢(一般按 128 位增長,而 RSA則是倍數增長,如:1024 – 2048 - 4096),將延長您現有硬件的使用壽命,讓您的投資帶來更大的回報。
總結
由于ECC加密算法在安全性、實現代價和應用效率上較RSA算法都有明顯的優勢,目前已經被多家國際標準組織所接受,ECC加密算法替代RSA加密算法,成為行業或組織的公鑰密碼標準的趨勢已經形成,并已有國家(美國、日本、韓國和歐洲一些國家)在國家密碼標準中采用了ECC算法體系。我國的國密算法SM2就是基于ECC算法的。
本文初步介紹了ECC算法的基本原理和實現步驟,由于本人水平有限,如有紕漏,還請指正。
參考
1,ECC算法介紹
2,解讀ECC加密算法
關于作者
-
GitHub:https://github.com/ForTheDevelopers
-
掘金:https://juejin.cn/user/1204720472953022/posts
-
CSDN:https://blog.csdn.net/ForTheDevelopers
-
segmentfault:https://segmentfault.com/u/for_the_developers
聯系作者
-
微信號:ForTheDeveloper
-
公眾號:ForTheDevelopers
總結
以上是生活随笔為你收集整理的奇妙的安全旅行之ECC算法的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python socket出现ip已经使
- 下一篇: D3DLOCK写纹理遇到的问题