rsa签名算法实现_国密算法在链化未来区块链中的运用
密碼學(xué)是區(qū)塊鏈的基礎(chǔ),區(qū)塊鏈中大量采用了密碼學(xué)算法,包括對(duì)稱加密,非對(duì)稱加密,單向散列算法,數(shù)字簽名等技術(shù)。
為了實(shí)現(xiàn)密碼學(xué)技術(shù)的自主可控,中國(guó)也定義了自己的國(guó)密標(biāo)準(zhǔn),2020年央行頒布的《金融分布式賬本技術(shù)安全規(guī)范》中,明確要求國(guó)內(nèi)的區(qū)塊鏈技術(shù)必須支持國(guó)密算法。鏈化未來(lái)區(qū)塊鏈現(xiàn)已完成對(duì)國(guó)密算法的支持,符合央行安全規(guī)范的全部要求。
本文首先介紹了對(duì)稱加密、非對(duì)稱加密和數(shù)字簽名的基本概念,然后重點(diǎn)講述了非對(duì)稱加密算法中的橢圓曲線密碼技術(shù),最后闡述了國(guó)密算法在鏈化未來(lái)區(qū)塊鏈中的運(yùn)用。針對(duì)openssl國(guó)密算法簽名驗(yàn)簽性能低下的問(wèn)題,鏈化未來(lái)對(duì)算法實(shí)現(xiàn)進(jìn)行了優(yōu)化,實(shí)現(xiàn)了3~4倍的性能提升,相關(guān)的優(yōu)化代碼已經(jīng)提交到openssl Github
(https://github.com/openssl/openssl/issues/11992)。
1、對(duì)稱加密與非對(duì)稱加密
1.1 對(duì)稱加密
對(duì)稱加密(symmetric cryptography)是指在加密和解密時(shí)使用相同密鑰的方式。對(duì)稱密鑰有很多別名,如公共密鑰密碼,傳統(tǒng)密碼,私鑰密碼,共享密鑰密碼等。圖1和圖2分別是對(duì)稱密碼加密,解密過(guò)程,加密和解密使用相同的密鑰,所以稱為對(duì)稱加密。圖1. 對(duì)稱密碼加密圖2. 對(duì)稱密碼解密1.2 非對(duì)稱加密
非對(duì)稱加密(asymmetric cryptography)在加密和解密時(shí)使用不同密鑰,非對(duì)稱加密也稱為公鑰加密(public-key cryptography)。它們通常是一對(duì)密鑰: 公鑰(public key)和私鑰(private key), 公鑰加密后的密文,私鑰可以解密;私鑰加密后的密文,公鑰可以解密。公鑰是由私鑰推導(dǎo)出來(lái)的,且公鑰是公開(kāi)的。非對(duì)稱加密解決了對(duì)稱加密過(guò)程中,加密密鑰的分發(fā)問(wèn)題。一般公鑰用于加密,私鑰用于解密。當(dāng)私鑰用于加密時(shí),本質(zhì)就是數(shù)字簽名(digital signature),即用公鑰解密可以驗(yàn)證信息確實(shí)為私鑰加密結(jié)果。公鑰密碼目前主要有如下幾種:- RSA(Ron Rivest, Adi Shamir和Leonard Adleman的姓氏的首字母組成),該算法利用大質(zhì)因數(shù)分解的困難度。
- EIGamal,由Taher EIGamal設(shè)計(jì),與RSA不同,它是利用mod N下求離散對(duì)數(shù)的困難度。
- Rabin,由M.O.Rabin設(shè)計(jì)的公鑰算法。Rabin方式求平方根的困難度
- 橢圓曲線密碼(Elliptic Curve Cryptography, ECC),
1.3 數(shù)字簽名
某天Alice向Bob發(fā)送郵件:“hi,Bob,給我打1 000 000元,賬號(hào)是6214 6576 8789 8987 賬號(hào)名Alice”。在現(xiàn)實(shí)生活中,Bob可能會(huì)打電話給Alice,確認(rèn)下郵件是否是偽造;還要確認(rèn)內(nèi)容有沒(méi)有被篡改,防止收款賬號(hào)和金額被惡意修改;當(dāng)然還有一種場(chǎng)景,Bob把錢打給了Alice,最后Alice卻否認(rèn)發(fā)過(guò)這封郵件。能夠防止上述偽造,篡改和否認(rèn)等威脅的技術(shù)就是前面提過(guò)的數(shù)字簽名。通常消息比較長(zhǎng),我們只對(duì)消息的散列值進(jìn)行簽名,所以Alice發(fā)送郵件的流程如下:2 橢圓曲線加密算法詳解
上面我們了解了對(duì)稱加密和非對(duì)稱加密的基本概念,本節(jié)我們主要講用于數(shù)字簽名的非對(duì)稱加密算法中的橢圓曲線技術(shù)。2.1 基本概念
2.1.1 阿貝爾群
在數(shù)學(xué)中,群是一種代數(shù)結(jié)構(gòu),有一個(gè)集合以及一個(gè)二元運(yùn)算+所組成,滿足以下條件:2.1.2 橢圓曲線方程
圖4. 橢圓曲線[1]在密碼學(xué)中,定義在素?cái)?shù)域GFp的橢圓曲線方程為:E: ?y2 = x3 + ax + b 其中, a,b∈GFp且(4a3 + 27b2) mod p != 0除了p,a,b定義了曲線之外,通常還需要x, y, n來(lái)確定一條橢圓曲線。所以,描述一條有限域上的橢圓曲線,有六個(gè)變量:T = (p, a, b, x, y, n).p - 素?cái)?shù)域內(nèi)點(diǎn)的個(gè)數(shù),p越大越安全,但是伴隨著計(jì)算量的增大a, b - 曲線系數(shù)x, y - G點(diǎn)的x, y軸坐標(biāo)n - 為素?cái)?shù),且是G點(diǎn)的階。橢圓曲線上一點(diǎn)P,存在著最小的正整數(shù),使得nP=0∞(原點(diǎn)或無(wú)窮遠(yuǎn)點(diǎn),以下無(wú)窮遠(yuǎn)點(diǎn)用0表示),則稱n為P的階;若n不存在,我們說(shuō)P是無(wú)限階。在素?cái)?shù)域上,橢圓曲線所有點(diǎn)的階都存在。2.1.3 橢圓曲線上點(diǎn)運(yùn)算
素?cái)?shù)域橢圓曲線上的點(diǎn)也是阿貝爾群。單位元是無(wú)窮遠(yuǎn)點(diǎn)0。橢圓曲線上點(diǎn)P的逆元是其x軸對(duì)稱的點(diǎn)。P和Q分別為素?cái)?shù)域GFp上橢圓曲線兩點(diǎn),它們的連線與橢圓曲線交于第三點(diǎn)R(見(jiàn)圖5中情況1),有P + Q + R = 0無(wú)窮遠(yuǎn)點(diǎn)。有幾種特殊情況,分別是下圖中的2,3,4。第2種情況,直線與Q相切,可以看成Q和Q兩點(diǎn)相連,與橢圓曲線相交于P點(diǎn),即Q + Q + P = 0;第三種P,Q兩點(diǎn)與y軸平行,因?yàn)閮蓷l平行線相交于無(wú)窮遠(yuǎn)點(diǎn),所以有P + Q + 0 = 0;第四種情況,P和P相連,相交于無(wú)窮遠(yuǎn)點(diǎn)。圖5. 橢圓曲線運(yùn)算[1]根據(jù)以上我們有如下結(jié)論:Q + Q + P = 0即Q + Q = -P, (Q + Q) + (Q + Q) = (-P) + (-P),即以P的對(duì)稱點(diǎn)-P做切線,以此類推,我們可以快速得到2n*Q點(diǎn), n∈[0, +∞)。在橢圓曲線用于加密中,私鑰就是一個(gè)大整數(shù),公鑰就是橢圓曲線上的點(diǎn)G與私鑰的乘積。我們通過(guò)私鑰的二進(jìn)制表示快速計(jì)算出公鑰。2.2 算法運(yùn)用
橢圓曲線主要用于數(shù)字簽名,以下是實(shí)現(xiàn)數(shù)字簽名和簽名驗(yàn)證的數(shù)學(xué)計(jì)算過(guò)程。2.2.1 數(shù)字簽名和簽名驗(yàn)證
數(shù)字簽名主要需要消息m的散列值(摘要)h,私鑰kA,生成最終的結(jié)果{r,s};簽名驗(yàn)證主要用到公鑰P,消息摘要h。以下是簽名生成和驗(yàn)簽的計(jì)算過(guò)程。- 生成簽名,即計(jì)算r和s的過(guò)程
- 簽名驗(yàn)證
- 證明為什么在驗(yàn)證簽名過(guò)程中有這個(gè)特性?
2.2.2 橢圓曲線與RSA技術(shù)對(duì)比優(yōu)勢(shì)
之前我們講過(guò)非對(duì)稱密碼RSA,國(guó)密推薦使用橢圓曲線加密,因?yàn)闄E圓曲線比RSA有一定優(yōu)勢(shì):- 更安全。橢圓曲線基于離散對(duì)數(shù)困難度,計(jì)算復(fù)雜度是指數(shù)級(jí)的,求解難度大。而RSA算法是大質(zhì)因數(shù)分解困難度,計(jì)算復(fù)雜度是亞指數(shù)級(jí)的。
- 更短的密鑰。同等安全程度要求下,橢圓曲線算法比其他公鑰算法需要的密鑰長(zhǎng)度小很多。128bit橢圓曲線算法擁有1024bit RSA算法相同的安全程度。
2.3 常用幾種橢圓曲線
- secp256k1. 在比特幣和以太坊網(wǎng)絡(luò)中,用的是secp256k1,p是256位的素?cái)?shù),k代表Koblitz。a=0,b=7。曲線方程即y2=x3+7。Koblitz橢圓曲線具有一些特殊屬性,可以更有效地實(shí)現(xiàn)組操作。
- secp256r1. secp256k1的姊妹曲線。p也是256位的素?cái)?shù),但值和secp256k1曲線是不一樣的,r代表隨機(jī)。"隨機(jī)"選擇的參數(shù)更安全,然而,有些人懷疑隨機(jī)系數(shù)可能已經(jīng)被選擇來(lái)提供后門。因此,比特幣網(wǎng)絡(luò)并沒(méi)有選擇它,而是選擇了更高效的secp256k1。
- SM2曲線。SM2是基于前人對(duì)ECC研究的基礎(chǔ)上,中國(guó)推薦的標(biāo)準(zhǔn)曲線。GB/T 35276-2017定義了SM2算法的具體實(shí)現(xiàn)。
3. 國(guó)密算法在鏈化未來(lái)中的運(yùn)用
鏈化未來(lái)區(qū)塊鏈對(duì)國(guó)密算法對(duì)支持,除了SM2橢圓曲線外,還應(yīng)用了SM3, SM4。- SM3 散列算法,生成256bit的散列值,主要用于替換SHA256算法。
- SM4 對(duì)稱加密算法,鏈化未來(lái)錢包公私鑰加密用SM4取代了aes128。
3.1 國(guó)密算法實(shí)現(xiàn)詳解
上面我們講解了橢圓曲線的原理,SM2曲線也是建立在其之上,但是也有自己的特點(diǎn):3.1.1 SM2中h值的計(jì)算
在secp256k1中,h就是消息的散列值,而在SM2中,計(jì)算h值更復(fù)雜,需要分兩步計(jì)算:Z=SM3(ENTL||ID||a||b||xG||yG||xA||yA)
ID: 用戶身份標(biāo)志的字符串
ENTL: 兩個(gè)字節(jié)表示的ID的比特長(zhǎng)度
a, b: 曲線參數(shù)
xG, yG:G點(diǎn)坐標(biāo)x,y軸
xA,yA:公鑰坐標(biāo)x,y軸
3.2 國(guó)密算法優(yōu)化
3.2.1 openssl SM2曲線性能問(wèn)題
我們基于openssl開(kāi)發(fā)SM2的實(shí)現(xiàn),但是使用過(guò)程中發(fā)現(xiàn)簽名和驗(yàn)證速度很慢,在Macbook Pro上,每10秒簽名22496次,每10秒驗(yàn)簽24374次。定位到EC_POINT_mul速度慢。查看openssl的源代碼,它沒(méi)有對(duì)2n*G, n∈[0, 256](私鑰是256bit長(zhǎng))這樣的點(diǎn)進(jìn)行預(yù)緩存。如私鑰二進(jìn)制為:1000 1100,它對(duì)于的公鑰就是27*G + 23*G + 22*G,而2*G,22*G,23*G...2256*G都是已知的,所以只需要橢圓曲線上3個(gè)點(diǎn)的+運(yùn)算,不需要每次重新計(jì)算。除此之外,有部分核心功能需要用匯編編寫(xiě),優(yōu)化后性能有3-4倍的提高,如下表。表1. 性能優(yōu)化前后對(duì)比
相應(yīng)的優(yōu)化代碼我們已經(jīng)提交到openssl Github。圖6. 優(yōu)化代碼提交到openssl Github
3.2.2 SM2簽名和消息無(wú)法recover公鑰
在secp256k1我們可以根據(jù)簽名{r,s}和消息恢復(fù)公鑰,但是SM2卻不能通過(guò)簽名和消息恢復(fù)公鑰,因?yàn)樵赟M2的h值計(jì)算過(guò)程中,我們用到了公鑰的坐標(biāo),所以必須知道公鑰了,和只有簽名和消息recover公鑰相矛盾。因?yàn)镾M2無(wú)法通過(guò)簽名和消息recover公鑰,所以在對(duì)交易驗(yàn)證的過(guò)程,我們都是取出公鑰然后驗(yàn)證。但是,在我們的系統(tǒng)里,一個(gè)賬號(hào)可以擁有幾個(gè)公鑰,所以需要遍歷賬號(hào)的公鑰驗(yàn)證交易,導(dǎo)致多公鑰賬號(hào)的交易執(zhí)行性能會(huì)低些。幸運(yùn)的是,我們統(tǒng)計(jì)系統(tǒng)中所有的賬號(hào),99%只有一對(duì)公私鑰,所以理論上不會(huì)對(duì)系統(tǒng)整體性能造成影響。4. 結(jié)論
本文首先介紹了對(duì)稱加密和非對(duì)稱加密的基本概念,然后詳細(xì)介紹了非對(duì)稱加密技術(shù)中的橢圓曲線加密技術(shù),最后闡述了鏈化未來(lái)區(qū)塊鏈對(duì)國(guó)密算法的支持,橢圓曲線加密部分的理解對(duì)數(shù)學(xué)基礎(chǔ)要求比較高。區(qū)塊鏈的去中心化信任建立密碼學(xué)之上,密碼學(xué)技術(shù)又建立在數(shù)學(xué)之上,所以說(shuō),In Math We Trust。參考文獻(xiàn):
[1]. https://encyclopedia.thefreedictionary.com/elliptic+curve總結(jié)
以上是生活随笔為你收集整理的rsa签名算法实现_国密算法在链化未来区块链中的运用的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: matlab中boxplot函数的参数设
- 下一篇: antd form rules字数限制_