梁玉英
(廣東理工學(xué)院信息工程系,廣東 肇慶 526100)
ECC(Elliptic Curves Cryptography),橢圓曲線密碼編碼學(xué),該算法由華盛頓大學(xué)NealKoblitz和IBM的VictorM iller在1985年提出應(yīng)用在加密技術(shù)上,根據(jù)是有限域上的橢圓曲線上的點(diǎn)群中的離散對(duì)數(shù)問題ECDLP。在公鑰密碼體制中,ECC算法是目前已知的公鑰體制中對(duì)每比特所提供加密強(qiáng)度最高的一種加密機(jī)制。很多軟件的序列號(hào)通常都采用該算法,它在軟件注冊(cè)保護(hù)方面起到很大的作用[1]。
在歐美發(fā)達(dá)國(guó)家的一些公司,以及不少的密碼學(xué)研究小組都已實(shí)現(xiàn)了橢圓曲線密碼體制,最有名的ECC密碼技術(shù)公司是加拿大的Certicom。中國(guó)也有一些密碼學(xué)者做了相關(guān)的ECC加密研究,有不少的廠商已經(jīng)開發(fā)基于橢圓曲線的產(chǎn)品。國(guó)內(nèi)外對(duì)于ECC算法的研究也是方興未艾。
目前,C++、VB和Java都能解決數(shù)據(jù)加密的設(shè)計(jì)與實(shí)現(xiàn),其中Java是一款面向?qū)ο蟮某绦蛟O(shè)計(jì)語(yǔ)言,在2014至2017年的世界編程語(yǔ)言排行榜中,Java一直排名第一,由此可見Java語(yǔ)言應(yīng)用的廣泛性[2]。它具有跨平臺(tái)性、安全性、多線程和簡(jiǎn)單易用性,它提供了密鑰管理、認(rèn)證、加密、數(shù)字簽名和存取控制功能,利用Java程序設(shè)計(jì)語(yǔ)言能較好地實(shí)現(xiàn)對(duì)文件、數(shù)據(jù)的加密。
ECC是基于橢圓曲線離散對(duì)數(shù)問題的各種公鑰密碼體制,它是利用有限域上橢圓曲線的有限點(diǎn)群代替基于離散對(duì)數(shù)問題密碼體制中有限循環(huán)群所得到的一類密碼體制。在有限域Fp中定義一個(gè)橢圓曲線,常用y2=x3+ax+b;[3]
(1)Fp中只有p個(gè)元素,p為素?cái)?shù);
(2)Fp中,a+b≡c(mod p),a×b≡c(mod p),a/b≡c(mod p);
(3)4a3+27b2≠0 (mod p),a,b是小于p的非負(fù)整數(shù);
(4)x,y屬于0到p-1間的證書,曲線標(biāo)記為Ep(a,b);
階:橢圓曲線上一點(diǎn)P,存在正整數(shù)n,使得nP=O∞,則n為P的階,若n不存在,則P是無限階的,有限域上定義的橢圓曲線上所有點(diǎn)的階都存在[4]。
橢圓曲線難解性為:其中Q,G為Ep(a,b)上的點(diǎn),k為小于n的整數(shù),n是點(diǎn)G的階,給定k和G,計(jì)算Q容易,但是給定Q和G,求k就很難了。因此,設(shè)Q為公鑰,k為私鑰,G為基點(diǎn)[5]。
ECC算法的依據(jù)就是利用定義在橢圓曲線點(diǎn)群上的離散對(duì)數(shù)問題的難解性。要對(duì)明文信息m加密,首先必須把要發(fā)送的明文信息m編碼形成(x,y)的點(diǎn)Pm,并對(duì)點(diǎn)Pm進(jìn)行加密,然后對(duì)密文進(jìn)行解密。注意,不能簡(jiǎn)單地將信息編碼成點(diǎn)x坐標(biāo)或y坐標(biāo),因?yàn)椴⒉皇撬械淖鴺?biāo)都在Ep(a,b)[6]。具體的加密過程如下:
首先,用戶A選定一個(gè)大的整數(shù)p及橢圓曲線的參數(shù)a和b。由此可以定義出點(diǎn)的橢圓群Ep(a,b)。其次,在Ep(a,b)中挑選基點(diǎn)G=(xG,yG),G的階為一個(gè)非常大的數(shù)n。
接著用戶A選定一個(gè)私鑰k,并生成公鑰K=kG;若A將Ep(a,b)和k,G發(fā)送給用戶B,B收到后將明文編碼到Ep(a,b)上一點(diǎn)M,并產(chǎn)生一個(gè)隨機(jī)數(shù)r;然后B計(jì)算點(diǎn)C1=M+rK,C2=rG,B將C1,C2傳給A,A計(jì)算C1-kC2=M+rkG-krG=M,A對(duì)M解碼得到明文。
攻擊者只能得到Ep(a,b),G,K,C1,C2,沒有k就無法得到M。
簽名驗(yàn)證的過程如下:
用戶A選定一條橢圓曲線Ep(a,b),并取曲線上一點(diǎn)作為基點(diǎn)G;A選擇一個(gè)私鑰k,并生成公鑰K=kG;A產(chǎn)生一個(gè)隨機(jī)數(shù) r,計(jì)算 R(x,y)=rG;A 計(jì)算 Hash=SHA(M),M'=M(modp);A計(jì)算S=(Hash+M'k)/r(modp);B獲得S和M',Ep(a,b),K,R(x,y);B計(jì)算Hash=SHA(M),M'=M(modp);B計(jì)算R'=(Hash*G+M'*K)/S=(Hash*G+M'*kG)*r/(Hash+M'k)=rG=R(x,y),若R'=R,則驗(yàn)簽成功。
從上述的研究看,橢圓曲線離散對(duì)數(shù)問題比有限域上的離散對(duì)數(shù)問題更難以處理[7]。
(1)密鑰長(zhǎng)度短,占用帶寬少:ECC加密算法的密鑰長(zhǎng)度是256位,占用的存儲(chǔ)空間少,CPU開銷低,帶寬的占用也自然比較少。隨著移動(dòng)網(wǎng)絡(luò)技術(shù)的發(fā)展,ECC算法為移動(dòng)互聯(lián)網(wǎng)提供了更可靠、更安全的環(huán)境。
(2)性能更好,安全性更高:安全性能一般通過算法的抗擊強(qiáng)度來反映,ECC加密算法需要較短的密鑰長(zhǎng)度來提供更好的安全性,相對(duì)其他的公鑰算法,ECC算法能更好地防止攻擊。采用256位的ECC密鑰與3072位RSA密鑰的加密強(qiáng)度水平相同,目前公鑰加密應(yīng)用廣泛的RSA密鑰長(zhǎng)度是2048位,則210位ECC與2048位的RSA具有相同的安全強(qiáng)度。ECC算法采用更低的計(jì)算能力代價(jià)得到了更高的安全性[8]。
(3)延長(zhǎng)硬件使用壽命:ECC算法由于提供了更高的安全性,可以更好地保護(hù)投資的基礎(chǔ)設(shè)施。ECC的密鑰長(zhǎng)度增加度一般按128位增長(zhǎng),而RSA則是倍數(shù)增長(zhǎng),采用ECC加密算法將延長(zhǎng)計(jì)算機(jī)硬件的使用壽命。經(jīng)國(guó)外有關(guān)權(quán)威機(jī)構(gòu)測(cè)試,在Apache和IIS服務(wù)器采用ECC算法,Web服務(wù)器響應(yīng)時(shí)間比RSA快十幾倍[9]。
在jak 1.5后的版本中加入了ECC算法,采用ECC算法對(duì)文件加密的算法如下:
Java語(yǔ)言的安全性高,安全的類主要在java.security包中,實(shí)現(xiàn)ECC算法還需要導(dǎo)入包java.math、java.util、javax.crypto、sun.security?;贘ava語(yǔ)言的數(shù)字簽名密鑰生成、數(shù)字簽名和驗(yàn)證設(shè)計(jì)實(shí)現(xiàn)如下:
(1)密鑰對(duì)的生成實(shí)現(xiàn)
密鑰對(duì)的生成實(shí)現(xiàn)算法如下:
聲明公有的靜態(tài)字符串常量ALGORITHM="ECC";
聲明公有的靜態(tài)字符串常量PUBLIC_KEY="ECCPublicKey";
聲明公有的靜態(tài)字符串常量PRIVATE_KEY="ECCPrivateKey";
用私鑰解密:byte[]keyBytes=decryptBASE64(key);
取得私鑰,創(chuàng)建一個(gè)PKCS8EncodedKeySpec對(duì)象pkcs8KeySpec,使用PKCS#8標(biāo)準(zhǔn)作為密鑰規(guī)范管理的編碼格式來表示私鑰;
創(chuàng)建一個(gè)KeyFactory對(duì)象keyFactory;
用ECPrivateKdy類創(chuàng)建對(duì)象priKey,用ECPrivateKey-Spec類創(chuàng)建對(duì)象ecPrivateKeySpec;
對(duì)數(shù)據(jù)解密priKey.getParams();
Cipher類為加密和解密提供密碼功能,它構(gòu)成了Java Cryptographic Extension框架的核心。創(chuàng)建Cipher對(duì)象cipher,調(diào)用init函數(shù)進(jìn)行初始化數(shù)據(jù)。
(2)用公鑰加密
BASE64是用來將非ASCII字符的數(shù)據(jù)轉(zhuǎn)換成ASCII字符的一種方法,BASE64雖然不是安全領(lǐng)域下的加密解密算法,但它適合在http、m ime協(xié)議下快速傳輸數(shù)據(jù),常見于郵件、http加密。
取得公鑰byte[]keyBytes=decryptBASE64(private Key);
X509EncodedKeySpec類繼承EncodedKeySpec類,以編碼格式來表示公鑰,實(shí)例化X509EncodedKeySpec對(duì)象x509KeySpec;
利用KeyFactory類生成密鑰對(duì)象keyFactory;
創(chuàng)建EC公鑰對(duì)象pubKey;
利用函數(shù)generatePublic(x509KeySpec)生成相應(yīng)的密鑰規(guī)范公鑰對(duì)象;
利用ECPublicKeySpec類創(chuàng)建帶關(guān)聯(lián)參數(shù)的橢圓曲線公用密鑰ecPublicKeySpec;
利用函數(shù)pubKey.getParams()對(duì)數(shù)據(jù)加密;
創(chuàng)建Cipher類的加密/解密對(duì)象cipher。
(3)取得私鑰
聲明Key接口變量key;
利用keyMap.get(PRIVATE_KEY)取得私鑰;
返回encryptBASE64(key.getEncoded());
(4)取得公鑰
聲明Key接口變量key;
利用keyMap.get(PUBLIC_KEY)取得私鑰;返回encryptBASE64(key.getEncoded());
本文研究基于java語(yǔ)言的ECC算法的加密技術(shù),應(yīng)用了Java系統(tǒng)中的安全類,采用對(duì)稱密鑰封裝方法得到密文。研究得出,采用該方法進(jìn)行對(duì)文件加密,抗攻擊性好,加密性能好,具有較高的應(yīng)用價(jià)值,可以應(yīng)用在電子商務(wù)和電子政務(wù)等Web應(yīng)用中得。但如果想要獲得ECC算法實(shí)現(xiàn),需要調(diào)用硬件完成加密和解密,涉及Java Card領(lǐng)域、PKCS#13。上述的加密/解密算法使用CPU進(jìn)行,由于比較耗費(fèi)資源,效率較低。