SM2國(guó)密算法公鑰解壓縮
SM2一般用到的或者第三方提供的公鑰都是壓縮過(guò)的,長(zhǎng)度為66個(gè)長(zhǎng)度,既33字節(jié)。
格式如下,保密期間秘鑰內(nèi)容用*代替了,從02到....3F3B共33字節(jié)。66個(gè)長(zhǎng)度
06:028736002931F****************43986E66********D4FF11E9936A6CB9A3F3B
14:03017459D79C*****************88D6E6D********DDF979E40170F61308FAB
15:0286933F6EF6*****************C306FCD7545CEB4DDD214049001657D1C0DE
17:02D5795D52E******************48F282DCAD5EEF129ED2DF1D8FF806626FC0
但是封裝后的接口如:
int SM2_do_verify(unsigned char* message, int len, unsigned char* xA, unsigned char* yA, unsigned char* r, unsigned char* s)
那么如何調(diào)用呢?
壓縮公鑰中,哪個(gè)是xA? 哪個(gè)是yA? xA和yA不應(yīng)該有32個(gè)字節(jié)嗎?怎么提供的壓縮公鑰是33字節(jié)?
以下解答這些疑問(wèn)。
前面的 06: ,17:為公鑰的索引。且為16機(jī)制的。 0x17 == 23
提供的33字節(jié)的壓縮公鑰,最面前的02和03不是公鑰的內(nèi)容,因此排除第一個(gè)字節(jié),后面的32字節(jié)才是真正的壓縮公鑰。
壓縮公鑰如何解壓出xA和yA呢?其實(shí)xA沒(méi)有壓縮,排除前面的02或03,后面的32字節(jié)就是xA. yA是根據(jù)xA算出來(lái)的。
調(diào)用以下接口即可:
int SM2_get_Py(unsigned char y0, unsigned char Px[],unsigned char Py[])
這個(gè)y0參數(shù)傳啥?是個(gè)什么意思?
y0代表公鑰y坐標(biāo)的最后一位。有兩個(gè)取值,是0還是1 。
如果公鑰X壓縮碼為02,則這個(gè)取值傳0.如果公鑰X壓縮碼為03,則這個(gè)值取1.
y0取0或取1涉及算法內(nèi)部的一些翻轉(zhuǎn)操作,不能傳錯(cuò)。
這樣調(diào)用key_get_y(&pubkeyX[1], 32, pubkeyY, 32, bc) 就獲取到了y坐標(biāo)公鑰啦。
其實(shí)y公鑰就是從X獲取到的。X是誰(shuí)呢,就是那串壓縮公鑰,原封不動(dòng)。
至于內(nèi)部具體怎么解壓的,看代碼,能看出點(diǎn)兒端倪。
SM2的曲線方程為y2 = x3 + ax + b,其中知道了x當(dāng)然就能求出y。這里的x就是提供的壓縮公鑰。
r,s為數(shù)字簽名(r, s),相當(dāng)于這個(gè)公式里的a和b吧。
只不過(guò)里面涉及了大數(shù)運(yùn)算,要不是有大數(shù)運(yùn)算,應(yīng)該很好理解吧。用上了大數(shù)運(yùn)算,就得借助openssl或miral大數(shù)庫(kù)了。
Function: SM2_get_Py
Description: SM2 public key decompress to get Py
Input: public key Px,y0(Py last right bit)
Output: pubKey y // pubKey=[priKey]G
Return: 0: sucess
————————————————
int SM2_get_Py(unsigned char y0, unsigned char Px[],unsigned char Py[]) { big x_3; big x,y; big tmp; big y2; miracl *mip=mirsys(10000,16); mip->IOBASE=16; SM2_Init(); x_3=mirvar(0); x=mirvar(0); y=mirvar(0); y2=mirvar(0); tmp=mirvar(0); bytes_to_big(SM2_NUMWORD,Px,x); //printf(x); power (x, 3, p, x_3); //x_3=x^3 mod p multiply (x, a,x); //x=a*x divide (x, p, tmp); //x=a*x mod p , tmp=a*x/p add(x_3,x,x); //x=x^3+ax add(x,b,x); //x=x^3+ax+b divide(x,p,tmp); //x=x^3+ax+b mod p if(!sqroot(x, p, y)) { return 1; } big_to_bytes(SM2_NUMWORD,y,Py, TRUE); if( ( y0 & 0x01) != (Py[31] & 0x01) ) { //y0 = 0; subtract(p, y, y2); big_to_bytes(SM2_NUMWORD,y2,Py, TRUE); printf("-----------------------------------------------------------------py key step 2\n"); } return 0; }
SM2對(duì)應(yīng)RSA, SM4對(duì)應(yīng) AES或 3DES,SM3對(duì)應(yīng)SHA或MD5哈希算法。
其實(shí)SM2 和3和4 功能和作用和RSA,3DES,SHA等是一樣的,只是實(shí)現(xiàn)了國(guó)產(chǎn)化替代。
SM1則貌似沒(méi)有公開(kāi)或者要求只能由硬件實(shí)現(xiàn),資料很少。算法安全保密強(qiáng)度及相關(guān)軟硬件實(shí)現(xiàn)性能與 AES 相當(dāng),該算法不公開(kāi),僅以 IP 核的形式存在于芯片中。
以下內(nèi)容,摘自網(wǎng)絡(luò),感興趣的可以了解下算法原理。
作者:島叔
鏈接:https://www.zhihu.com/question/290243441/answer/469697191
來(lái)源:知乎
在金融領(lǐng)域目前主要使用公開(kāi)的SM2、SM3、SM4三類算法,分別是非對(duì)稱算法、哈希算法和對(duì)稱算法。
SM2算法:SM2橢圓曲線公鑰密碼算法是我國(guó)自主設(shè)計(jì)的公鑰密碼算法,包括SM2-1橢圓曲線數(shù)字簽名算法,SM2-2橢圓曲線密鑰交換協(xié)議,SM2-3橢圓曲線公鑰加密算法,分別用于實(shí)現(xiàn)數(shù)字簽名密鑰協(xié)商和數(shù)據(jù)加密等功能。SM2算法與RSA算法不同的是,SM2算法是基于橢圓曲線上點(diǎn)群離散對(duì)數(shù)難題,相對(duì)于RSA算法,256位的SM2密碼強(qiáng)度已經(jīng)比2048位的RSA密碼強(qiáng)度要高。
SM3算法:SM3雜湊算法是我國(guó)自主設(shè)計(jì)的密碼雜湊算法,適用于商用密碼應(yīng)用中的數(shù)字簽名和驗(yàn)證消息認(rèn)證碼的生成與驗(yàn)證以及隨機(jī)數(shù)的生成,可滿足多種密碼應(yīng)用的安全需求。為了保證雜湊算法的安全性,其產(chǎn)生的雜湊值的長(zhǎng)度不應(yīng)太短,例如MD5輸出128比特雜湊值,輸出長(zhǎng)度太短,影響其安全性SHA-1算法的輸出長(zhǎng)度為160比特,SM3算法的輸出長(zhǎng)度為256比特,因此SM3算法的安全性要高于MD5算法和SHA-1算法。
SM4算法:SM4分組密碼算法是我國(guó)自主設(shè)計(jì)的分組對(duì)稱密碼算法,用于實(shí)現(xiàn)數(shù)據(jù)的加密/解密運(yùn)算,以保證數(shù)據(jù)和信息的機(jī)密性。要保證一個(gè)對(duì)稱密碼算法的安全性的基本條件是其具備足夠的密鑰長(zhǎng)度,SM4算法與AES算法具有相同的密鑰長(zhǎng)度分組長(zhǎng)度128比特,因此在安全性上高于3DES算法。
SM2、SM3及SM4加密標(biāo)準(zhǔn)
轉(zhuǎn)自:https://wenku.baidu.com/view/108aad77710abb68a98271fe910ef12d2bf9a945.html
概述
SM2橢圓曲線公鑰密碼算法加密標(biāo)準(zhǔn)
SM2算法就是ECC橢圓曲線密碼機(jī)制,但在簽名、密鑰交換方面不同于ECDSA、ECDH等國(guó)際標(biāo)準(zhǔn),而是采取了更為安全的機(jī)制。SM2-1橢圓曲線數(shù)字簽名算法,SM2-2橢圓曲線密鑰交換協(xié)議,SM2-3橢圓曲線公鑰加密算法,分別用于實(shí)現(xiàn)數(shù)字簽名密鑰協(xié)商和數(shù)據(jù)加密等功能。SM2算法與RSA算法不同的是,SM2算法是基于橢圓曲線上點(diǎn)群離散對(duì)數(shù)難題,相對(duì)于RSA算法,256位的SM2密碼強(qiáng)度已經(jīng)比2048位的RSA密碼強(qiáng)度要高。
橢圓曲線算法公鑰密碼所基于的曲線性質(zhì):橢圓曲線多倍點(diǎn)運(yùn)算構(gòu)成一個(gè)單向函數(shù)。在多倍點(diǎn)運(yùn)算中,已知多倍點(diǎn)與基點(diǎn),求解倍數(shù)的問(wèn)題稱為橢圓曲線離散對(duì)數(shù)問(wèn)題。對(duì)于一般橢圓曲線的離散對(duì)數(shù)問(wèn)題,目前只存在指數(shù)級(jí)計(jì)算復(fù)雜度的求解方法。與大數(shù)分解問(wèn)題及有限域上離散對(duì)數(shù)問(wèn)題相比,橢圓曲線離散對(duì)數(shù)問(wèn)題的求解難度要大得多。因此,在相同安全程度要求下,橢圓曲線密碼較其他公鑰密碼所需的秘鑰規(guī)模要小得多。
SM3哈希算法加密標(biāo)準(zhǔn)
SM3是一種密碼散列函數(shù)標(biāo)準(zhǔn)。密碼散列函數(shù)是散列函數(shù)的一種。它被認(rèn)為是一種單向函數(shù),也就是說(shuō)極其難以由散列函數(shù)輸出的結(jié)果,回推輸入的數(shù)據(jù)是什么。這種散列函數(shù)的輸入數(shù)據(jù),通常被稱為消息,而它的輸出結(jié)果,經(jīng)常被稱為消息摘要。
SM3適用于商用密碼應(yīng)用中的數(shù)字簽名和驗(yàn)證消息認(rèn)證碼的生成與驗(yàn)證以及隨機(jī)數(shù)的生成,可滿足多種密碼應(yīng)用的安全需求。為了保證雜湊算法的安全性,其產(chǎn)生的雜湊值的長(zhǎng)度不應(yīng)太短,例如MD5輸出128比特雜湊值,輸出長(zhǎng)度太短,影響其安全性SHA-1算法的輸出長(zhǎng)度為160比特,SM3算法的輸出長(zhǎng)度為256比特,因此SM3算法的安全性要高于MD5算法和SHA-1算法。
一個(gè)理想的密碼散列函數(shù)應(yīng)該有這些特性:對(duì)于任何一個(gè)給定的消息,它都很容易就能運(yùn)算出散列數(shù)值;難以由一個(gè)已知的散列數(shù)值,去推算出原始的消息;在不更動(dòng)散列數(shù)值的前提下,修改消息內(nèi)容是不可行的;對(duì)于兩個(gè)不同的消息,它不能給與相同的散列數(shù)值。
SM4分組密碼算法加密標(biāo)準(zhǔn)
SM4算法是一個(gè)分組對(duì)稱密鑰算法,明文、密鑰、密文都是16字節(jié),加密和解密密鑰相同。加密算法與密鑰擴(kuò)展算法都采用32輪非線性迭代結(jié)構(gòu)。解密過(guò)程與加密過(guò)程的結(jié)構(gòu)相似,只是輪密鑰的使用順序相反。
SM4用于實(shí)現(xiàn)數(shù)據(jù)的加密/解密運(yùn)算,以保證數(shù)據(jù)和信息的機(jī)密性。要保證一個(gè)對(duì)稱密碼算法的安全性的基本條件是其具備足夠的密鑰長(zhǎng)度,SM4算法與AES算法具有相同的密鑰長(zhǎng)度分組長(zhǎng)度128比特,因此在安全性上高于3DES算法。
SM2加密標(biāo)準(zhǔn)
SM2基本原理
基礎(chǔ)參數(shù)
SM2的曲線方程為y2 = x3 + ax + b,其中:
a: 0xFFFFFFFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000FFFFFFFFFFFFFFFC
b: 0x28E9FA9E9D9F5E344D5A9E4BCF6509A7F39789F515AB8F92DDBCBD414D940E93
c: 0xFFFFFFFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000FFFFFFFFFFFFFFFF
私鑰長(zhǎng)度:32字節(jié)
公鑰長(zhǎng)度:SM2非壓縮公鑰格式字節(jié)串長(zhǎng)度為65字節(jié),壓縮格式長(zhǎng)度為33字節(jié),若公鑰y坐標(biāo)最后一位為0,則首字節(jié)為0x02,否則為0x03。非壓縮格式公鑰首字節(jié)為0x04。
簽名長(zhǎng)度:64字節(jié)
密鑰對(duì)生成
SM2密鑰生成是指生成SM2算法的密鑰對(duì)的過(guò)程,該密鑰對(duì)包括私鑰和與之對(duì)應(yīng)的公鑰。
輸入:一個(gè)有效的Fq(q=p且p為大于3的素?cái)?shù),或q=2m)上橢圓曲線系統(tǒng)參數(shù)的集合。
輸出:與橢圓曲線系統(tǒng)參數(shù)相關(guān)的一個(gè)密鑰對(duì)(d, P)
k: SM2PrivateKey,SM2私鑰
Q: SM2PublicKey,SM2公鑰
用隨機(jī)數(shù)發(fā)生器產(chǎn)生整數(shù) d∈[1, n-2];
G為基點(diǎn),計(jì)算點(diǎn)P=(xP, yP)=[d]G
密鑰對(duì)是(d, P),其中d為私鑰,P為公鑰
簽名算法
預(yù)處理1
預(yù)處理1指使用簽名方的用戶身份標(biāo)識(shí)和簽名方公鑰,通過(guò)運(yùn)算得到Z值的過(guò)程,Z值用于預(yù)處理2。
輸入:ID 字符串,用戶身份標(biāo)識(shí);Q SM2PublicKey,用戶的公鑰。
輸出:Z 字節(jié)串,預(yù)處理1的輸出。
計(jì)算公式:Z=SM3(ENTL||ID||a||b||xG||yG||xA||yA)
參數(shù)說(shuō)明:
ENTL: 由兩個(gè)字節(jié)標(biāo)識(shí)的ID的比特長(zhǎng)度;
ID: 用戶身份標(biāo)識(shí),一般情況下,其長(zhǎng)度為16字節(jié),默認(rèn)值從左至右依次是:0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38。
a, b: 為系統(tǒng)曲線參數(shù);
xG, yG為基點(diǎn);xA, yA為用戶的公鑰。
預(yù)處理2
預(yù)處理2是指使用Z值和待簽名消息,通過(guò)SM3運(yùn)算得到雜湊值H的過(guò)程。雜湊值H用戶SM2數(shù)字簽名。
輸入:Z 字節(jié)串;M 字節(jié)串,待簽名消息
輸出:H 字節(jié)串,雜湊值
計(jì)算公式:H=SM3(Z||M)
生成簽名
SM2簽名是指使用預(yù)處理2的結(jié)果和簽名者的私鑰,通過(guò)簽名計(jì)算得到簽名結(jié)果的過(guò)程。
輸入:d: SM2PrivateKey,簽名者私鑰;H 字節(jié)串,預(yù)處理2的結(jié)果
輸出:sign: SM2Signature,簽名值
設(shè)待簽名的消息為M,為了獲取消息M的數(shù)字簽名(r,s)(r,s)(r,s),作為簽名者的用戶A應(yīng)實(shí)現(xiàn)以下運(yùn)算步驟:
置M’=ZA||M;計(jì)算e=Hv(M’),將e的數(shù)據(jù)類型轉(zhuǎn)化為整數(shù);用隨機(jī)數(shù)發(fā)生器產(chǎn)生隨機(jī)數(shù)k∈[1, n-1];計(jì)算橢圓曲線點(diǎn)(x1, y1)=[k]G,將x1的數(shù)據(jù)類型轉(zhuǎn)化為整數(shù);計(jì)算r=(e+x1)mod n,若r=0或r+k=n則返回第3步;計(jì)算s=((1+dA)-1*(k-r*dA))mod n,若s=0則返回第3步;將r, s轉(zhuǎn)化為字節(jié)串。消息M的簽名為(r, s)。
簽名驗(yàn)證
輸入:H:字節(jié)串,預(yù)處理2的結(jié)果;sign:SM2Signature,簽名值;Q:PublicKey,簽名者的公鑰
輸出:為真表示驗(yàn)證通過(guò),為假表示驗(yàn)證不通過(guò)。
為了檢驗(yàn)收到的消息 M及其數(shù)字簽名(r, s),作為驗(yàn)證者的用戶B應(yīng)實(shí)現(xiàn)以下運(yùn)算步驟:
檢驗(yàn)r∈[1,n-1],是否成立,若不成立則驗(yàn)證不通過(guò);
檢驗(yàn)s∈[1,n-1],是否成立,若不成立則驗(yàn)證不通過(guò);
置M’=ZA||M;
計(jì)算e=Hv(M’),將e的數(shù)據(jù)類型轉(zhuǎn)化為整數(shù);
將r,s的數(shù)據(jù)類型轉(zhuǎn)化為整數(shù),計(jì)算t=(r+s)mod n,若t=0,則驗(yàn)證不通過(guò);
計(jì)算橢圓曲線點(diǎn)(x1, y1)=[s]G+[t]PA;
將x1的數(shù)據(jù)類型轉(zhuǎn)化為整數(shù),計(jì)算R=(e+x1)mod n,檢驗(yàn)R=r是否成立,若成立則驗(yàn)證通過(guò);否則驗(yàn)證不通過(guò)。
SM2的應(yīng)用
SM2在固件安全中的應(yīng)用:
固件控制著整個(gè)存儲(chǔ)系統(tǒng)的正常運(yùn)行,倘若非法人員可以隨意導(dǎo)入固件、修改固件,那么數(shù)據(jù)也將完全暴露,因此保護(hù)數(shù)據(jù)存儲(chǔ)安全的首要一點(diǎn)就是要確保固件在導(dǎo)入、保存和執(zhí)行過(guò)程中的安全。
在固件導(dǎo)入過(guò)程中使用SM2算法進(jìn)行驗(yàn)簽,其中用到的公鑰保存在主控芯片內(nèi)部,私鑰由受信用的固件廠商保存。對(duì)于要導(dǎo)入的固件,需要使用私鑰對(duì)其進(jìn)行簽名,將簽名和固件一起導(dǎo)入到盤片,帶有簽名的固件下載到緩存RAM后,再用公鑰進(jìn)行SM2驗(yàn)簽。只有使用合法私鑰簽名的固件才能通過(guò)驗(yàn)簽,成功導(dǎo)入,沒(méi)有簽名或者使用非法私鑰簽名的固件無(wú)法通過(guò)驗(yàn)簽而被丟棄。如此,擁有合法私鑰的用戶才擁有固件的導(dǎo)入權(quán)限,從源頭上確保了盤片內(nèi)部固件的合法性。
對(duì)比SM2與同類型算法
RSA算法數(shù)學(xué)原理簡(jiǎn)單,在工程應(yīng)用中比較易于實(shí)現(xiàn),但它的單位安全強(qiáng)度相對(duì)較低。目前國(guó)際上公認(rèn)的對(duì)于RSA算法最有效的攻擊方法,即一般數(shù)域篩方法去破譯和攻擊RSA算法,它的破譯或求解難度是亞指數(shù)級(jí)的。
SM2算法的數(shù)學(xué)理論非常深?yuàn)W復(fù)雜,在工程應(yīng)用中比較難于實(shí)現(xiàn),但它的單位安全強(qiáng)度相對(duì)較高。用國(guó)際上公認(rèn)的對(duì)于SM2算法最有效的攻擊方法Pollard rho去破譯攻擊SM2算法,它的破譯或求解難度基本上是指數(shù)級(jí)的。SM2算法的單位安全強(qiáng)度高于RSA算法。一般認(rèn)為當(dāng)SM2密碼體制的密鑰長(zhǎng)度為160比特時(shí),其安全性相當(dāng)于RSA使用1024比特密鑰長(zhǎng)度,密鑰短意味著更短的處理時(shí)間和密鑰存儲(chǔ)空間。
SM2具有安全性能更高、計(jì)算量小、處理速度快、存儲(chǔ)空間占用小、帶寬要求低和便于密碼管理等優(yōu)點(diǎn),能在整體上提高加密過(guò)程中的速度與安全性。
SM3加密標(biāo)準(zhǔn)
SM3基本原理
對(duì)長(zhǎng)度為l(l < 2^64) 比特的消息m, SM3雜湊算法經(jīng)過(guò)填充和迭代壓縮,生成雜湊值,雜湊值長(zhǎng)度為256比特。
填充
假設(shè)消息m 的長(zhǎng)度為l 比特。首先將比特“1”添加到消息的末尾,再添加k 個(gè)“0”, k是滿足l + 1 + k ≡ 448mod512 的最小的非負(fù)整數(shù)。然后再添加一個(gè)64位比特串,該比特串是長(zhǎng)度l的二進(jìn)制表示。填充后的消息m’的比特長(zhǎng)度為512的倍數(shù)。
迭代
將填充后的消息m’按512比特進(jìn)行分組:m’=B(0)B(1)…B(n-1),其中n=(l+k+65)/512。對(duì)m’按下列方式迭代:
FOR i=0 TO n-1
V(i+1)=CF(V(i), B(i))
ENDFOR
其中CF是壓縮函數(shù),V(0)為256比特初始值IV,B(i)為填充后的消息分組,迭代壓縮的結(jié)果為V(n)。
消息擴(kuò)展
將消息分組B(i)按以下方法擴(kuò)展生成132個(gè)字W0, W1,…, W67 , W0’, W1’, …, W63’,用于壓縮函數(shù)CF:
將消息分組B(i)劃分為16個(gè)字W0, W1, …, W15
FOR j=16 TO 67
Wj?P1(Wj-16⊕Wj-9⊕(Wj-3<<<15))⊕(Wj-13<<<7)⊕Wj-6
ENDFOR
FOR j=0 TO 63
W’j=Wj⊕Wj+4
ENDFOR
壓縮函數(shù)
令A(yù),B,C,D,E,F,G,H為字寄存器,SS1,SS2,TT1,TT2為中間變量,壓縮函數(shù)Vi+1=CF(V(i), B(i)), 0<=i<=n-1,計(jì)算過(guò)程如下:
FOR j=0 TO 63
SS1?((A<<<12)+E+(Tj<<<j))<<<7
SS2?SS1⊕(A<<<12)
TT1?FFj(A,B,C)+D+SS2+W’j
TT2?GGj(E,F,G)+H+SS1+Wj
D?C
C?B<<<9
B?A
A?TT1
H?G
G?F<<<19
F?E
E?P0(TT2)
ENDFOR
V(i+1)?ABCDEFGH⊕V(i)
雜湊值
ABCDEFGH?V(n)
輸出256比特的雜湊值y=ABCDEFGH。
SM3的應(yīng)用
SM3在芯片中的應(yīng)用:
芯片中有sm3函數(shù)的入口,每次只能輸入8個(gè)字節(jié)(64位)的16進(jìn)制數(shù),所以要把文件拆分成N*8字節(jié),并轉(zhuǎn)為16進(jìn)制,需要執(zhí)行sm3函數(shù)N次
前面N-1次和最后一次執(zhí)行函數(shù)所用的報(bào)文不同,前面N-1次中報(bào)文的p1=01(沒(méi)有返回雜湊值,但是函數(shù)中記錄下迭代中間結(jié)果,作為下一次迭代輸入,不輸出),最后一次報(bào)文的p1=02,(結(jié)合上面迭代中間值,輸出最終雜湊值)。
對(duì)比SM3與同類型算法
摘要函數(shù)在密碼學(xué)中具有重要的地位,被廣泛應(yīng)用在數(shù)字簽名,消息認(rèn)證,數(shù)據(jù)完整性檢測(cè)等領(lǐng)域。摘要函數(shù)通常被認(rèn)為需要滿足三個(gè)基本特性:碰撞穩(wěn)固性,原根穩(wěn)固性和第二原根穩(wěn)固性。2005年,Wang等人給出了MD5算法和SHA-1算法的碰撞攻擊方法,現(xiàn)今被廣泛應(yīng)用的MD5算法和SHA-1算法不再是安全的算法。
SM3算法適用于商用密碼應(yīng)用中的數(shù)字簽名和驗(yàn)證,是在SHA-256基礎(chǔ)上改進(jìn)實(shí)現(xiàn)的一種算法。SM3算法采用Merkle-Damgard結(jié)構(gòu),消息分組長(zhǎng)度為512位,摘要值長(zhǎng)度為256位。SM3算法的壓縮函數(shù)與SHA-256的壓縮函數(shù)具有相似的結(jié)構(gòu),但是SM3算法的設(shè)計(jì)更加復(fù)雜,比如壓縮函數(shù)的每一輪都使用2個(gè)消息字。SM3的安全性相對(duì)較高。
SM4加密標(biāo)準(zhǔn)
SM4基本原理
參數(shù)產(chǎn)生
字節(jié)由8位二進(jìn)制數(shù)表示,字由32位二進(jìn)制數(shù)表示;S盒為固定的8比特輸入和輸出置換;加密密鑰長(zhǎng)度為128bit,表示為MK=(MK0,MK1,MK2,MK3),其中MKi (i=0,1,2,3)為字。輪密鑰表示為rki(i=0,1,2.....,31)為字。FK=(FK0,FK1,FK2,FK3)為系統(tǒng)參數(shù),CK=(CK0,CK1,.....,CK31)為固定參數(shù),都為字。
輪函數(shù)
整體的加密函數(shù)為:
Xi+4=F(Xi, Xi+1, Xi+2, Xi+3, rki)=Xi⊕T(Xi+1⊕Xi+2⊕Xi+3⊕rki)
其中T為一個(gè)合成置換,由非線性變換和線性變換復(fù)合而成。
非線性變換由4個(gè)平行的S盒構(gòu)成,S盒的數(shù)據(jù)均采用16進(jìn)制。
線性變換公式如下,其中B為非線性變換得到的字
C=L(B)=B⊕(B<<2)⊕(B<<10)⊕(B<<18)⊕(B<<24)
密鑰擴(kuò)展
已知加密密鑰MK=(MK0,MK1,MK2,MK3),系統(tǒng)參數(shù)FK=(FK0,FK1,FK2,FK3),固定參數(shù)CK=(CK0,CK1,.....,CK31)。rki為輪密鑰,輪密鑰由加密密鑰生成。
首先(K0, K1, K2, K3)=(MK0⊕FK0, MK1⊕FK1, MK2⊕FK2, MK3⊕FK3),然后對(duì)i=0,1,2,…,31:rki=Ki+4=Ki⊕T’(Ki+1⊕Ki+2⊕Ki+3⊕CKi),該變換與加密中的T變換基本相同,只是將其中的線性變換改為:L’(B)=B⊕(B<<13) ⊕(B<<23),由于系統(tǒng)參數(shù)個(gè)固定參數(shù)是已知的,輪密鑰即可求得。
加密解密過(guò)程
加密最后一輪變換時(shí),輸出為:
(Y0, Y1, Y2, Y3)=R(X32, X33, X34, X35)=(X35, X34, X33, X32)
最后輸出是加密的反序,解密時(shí)只是將輪密鑰的使用順序進(jìn)行逆向進(jìn)行。
SM4的應(yīng)用
SM4在數(shù)據(jù)安全中的應(yīng)用:
以固態(tài)硬盤為例,若用戶數(shù)據(jù)的明文直接保存在存儲(chǔ)介質(zhì)上,那么只要拿到存儲(chǔ)數(shù)據(jù)的存儲(chǔ)介質(zhì),就能以一定的途徑獲取到其中存儲(chǔ)的用戶數(shù)據(jù),比如換上其它的主控芯片、對(duì)存儲(chǔ)介質(zhì)上的電平進(jìn)行分析等。我們可以在數(shù)據(jù)讀寫路徑上加上一道門鎖——SM4加解密:數(shù)據(jù)由主機(jī)傳輸?shù)骄彺鍾AM的過(guò)程中,使用SM4 算法加密,寫入到緩存上的就是密文,并最終以密文的形式保存在存儲(chǔ)介質(zhì)Flash上;讀取數(shù)據(jù)時(shí)再解密出明文返回給主機(jī)。
以上所述的加密過(guò)程對(duì)用戶是完全透明的,用戶完全感知不到加解密過(guò)程的存在。為確保明文數(shù)據(jù)只對(duì)授權(quán)用戶可見(jiàn),需要對(duì)加解密數(shù)據(jù)的密鑰——介質(zhì)密鑰(MKey)進(jìn)行保護(hù),將其與授權(quán)用戶關(guān)聯(lián)起來(lái)。一種簡(jiǎn)單的關(guān)聯(lián)方式如下圖所示,一方面使用SM3算法對(duì)用戶口令進(jìn)行雜湊生成口令摘要,保存口令摘要用于身份鑒權(quán);另一方面,對(duì)用戶口令進(jìn)行派生構(gòu)造加密密鑰(EKey),對(duì)介質(zhì)密鑰進(jìn)行加密保存。
對(duì)比SM4與同類型算法
國(guó)際的DES算法和國(guó)產(chǎn)的SM4算法的目的都是為了加密保護(hù)靜態(tài)儲(chǔ)存和傳輸信道中的數(shù)據(jù)。從算法上看,國(guó)產(chǎn)SM4算法在計(jì)算過(guò)程中增加非線性變換,理論上能大大提高其算法的安全性,并且由專業(yè)機(jī)構(gòu)進(jìn)行了密碼分析,民間也對(duì)21輪SM4進(jìn)行了差分密碼分析,安全性較高。
參考文獻(xiàn)
[1] 國(guó)密算法在數(shù)據(jù)存儲(chǔ)中的安全應(yīng)用
[2] 國(guó)密標(biāo)準(zhǔn)文檔
————————————————
版權(quán)聲明:本文為CSDN博主「特立獨(dú)行的貓a」的原創(chuàng)文章,遵循CC 4.0 BY-SA版權(quán)協(xié)議,轉(zhuǎn)載請(qǐng)附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/yyz_1987/article/details/105271859
*博客內(nèi)容為網(wǎng)友個(gè)人發(fā)布,僅代表博主個(gè)人觀點(diǎn),如有侵權(quán)請(qǐng)聯(lián)系工作人員刪除。