參考bolg:https://www.cnblogs.com/blankicefire/p/9129202.html
SM1 為對稱加密。其加密強度與AES相當。該算法不公開,調用該算法時,需要通過加密芯片的接口進行調用。
SM2 非對稱加密算法,基於ECC。該算法已公開。由於該算法基於ECC,故其簽名速度與秘鑰生成速度都快於RSA。ECC 256位(SM2采用的就是ECC 256位的一種)安全強度比RSA 2048位高,但運算速度快於RSA。
SM3 消息摘要。可以用MD5作為對比理解。該算法已公開。校驗結果為256位。
SM4 無線局域網標准的分組數據算法。對稱加密,密鑰長度和分組長度均為128位。
SM2算法
SM2算法:SM2橢圓曲線公鑰密碼算法是我國自主設計的公鑰密碼算法,包括SM2-1橢圓曲線數字簽名算法,SM2-2橢圓曲線密鑰交換協議,SM2-3橢圓曲線公鑰加密算法,分別用於實現數字簽名密鑰協商和數據加密等功能。SM2算法與RSA算法不同的是,SM2算法是基於橢圓曲線上點群離散對數難題,相對於RSA算法,256位的SM2密碼強度已經比2048位的RSA密碼強度要高
學習sm2算法,首先學習ECC算法
ECC算法描述:
1、用戶A選定一條適合加密的橢圓曲線Ep(a,b)(如:y2=x3+ax+b),並取橢圓曲線上一點,作為基點G。
2、用戶A選擇一個私有密鑰k,並生成公開密鑰(公鑰PB)K=kG。
3、用戶A將Ep(a,b)和點(公鑰)K,G傳給用戶B。
4、用戶B接到信息后 ,將待傳輸的明文(M)編碼到Ep(a,b)上一點M,並產生一個隨機整數r(r<n)。加密開始
5、用戶B計算點C1=M+rK;C2=rG。
6、用戶B將C1、C2傳給用戶A。
7、用戶A接到信息后,計算C1-kC2,結果就是點M。因為C1-kC2=M+rK-k(rG)=M+rK-r(kG)=M
再對點M進行解碼就可以得到明文。
密碼學中,描述一條Fp上的橢圓曲線,常用到六個參量:
T=(p,a,b,G,n,h)。
(p 、a 、b 用來確定一條橢圓曲線,G為基點,n為點G的階,h 是橢圓曲線上所有點的個數m與n相除的整數部分)
這幾個參量取值的選擇,直接影響了加密的安全性。參量值一般要求滿足以下幾個條件:
1、p 當然越大越安全,但越大,計算速度會變慢,200位左右可以滿足一般安全要求;
2、p≠n×h;
3、pt≠1 (mod n),1≤t<20;
4、4a3+27b2≠0 (mod p);
5、n 為素數;
6、h≤4。
SM2算法就是ECC橢圓曲線密碼機制,但在簽名、密鑰交換方面不同於ECDSA、ECDH等國際標准,而是采取了更為安全的機制。另外,SM2推薦了一條256位的曲線作為標准曲線。
SM2標准包括總則,數字簽名算法,密鑰交換協議,公鑰加密算法四個部分,並在每個部分的附錄詳細說明了實現的相關細節及示例。
SM2算法主要考慮素域Fp和F2m上的橢圓曲線,分別介紹了這兩類域的表示,運算,以及域上的橢圓曲線的點的表示,運算和多倍點計算算法。然后介紹了編程語言中的數據轉換,包括整數和字節串,字節串和比特串,域元素和比特串,域元素和整數,點和字節串之間的數據轉換規則。
詳細說明了有限域上橢圓曲線的參數生成以及驗證,橢圓曲線的參數包括有限域的選取,橢圓曲線方程參數,橢圓曲線群基點的選取等,並給出了選取的標准以便於驗證。最后給橢圓曲線上密鑰對的生成以及公鑰的驗證,用戶的密鑰對為(s,sP),其中s為用戶的私鑰,sP為用戶的公鑰,由於離散對數問題從sP難以得到s,並針對素域和二元擴域給出了密鑰對生成細節和驗證方式。總則中的知識也適用於SM9算法。
在總則的基礎上給出了數字簽名算法(包括數字簽名生成算法和驗證算法),密鑰交換協議以及公鑰加密算法(包括加密算法和解密算法),並在每個部分給出了算法描述,算法流程和相關示例。
數字簽名算法,密鑰交換協議以及公鑰加密算法都使用了國家密管理局批准的SM3密碼雜湊算法和隨機數發生器。數字簽名算法,密鑰交換協議以及公鑰加密算法根據總則來選取有限域和橢圓曲線,並生成密鑰對。
SM2算法在很多方面都優於RSA算法(RSA發展得早應用普遍,SM2領先也很自然)
SM3算法
SM3算法:SM3雜湊算法是我國自主設計的密碼雜湊算法,適用於商用密碼應用中的數字簽名和驗證消息認證碼的生成與驗證以及隨機數的生成,可滿足多種密碼應用的安全需求。為了保證雜湊算法的安全性,其產生的雜湊值的長度不應太短,例如MD5輸出128比特雜湊值,輸出長度太短,影響其安全性SHA-1算法的輸出長度為160比特,SM3算法的輸出長度為256比特,因此SM3算法的安全性要高於MD5算法和SHA-1算法。
對長度為l(l<2^64)比特的消息m,SM3雜湊算法經過填充和迭代壓縮,生成雜湊值,雜湊值長度為256比特。
假設消息m的長度為l比特。首先將比特“1”添加到消息的末尾,再添加k個“0”,k是滿足l+1+k448mod512的最小的非負整數。然后再添加一個64位比特串,該比特串是長度l的二進制表示。
填充后的消息m′的比特長度為512的倍數。
例如:對消息01100001 01100010 01100011,其長度l=24,經填充得到比特串:
01100001 01100010 01100011 1 00...00(423比特)00...011000(64比特l的二進制表示)
下面的是實現了SM3的標准輸出
SM4
此算法是一個分組算法,用於無線局域網產品。該算法的分組長度為128比特,密鑰長度為128比特。加密算法與密鑰擴展算法都采用32輪非線性迭代結構。解密算法與加密算法的結構相同,只是輪密鑰的使用順序相反,解密輪密鑰是加密輪密鑰的逆序。
此算法采用非線性迭代結構,每次迭代由一個輪函數給出,其中輪函數由一個非線性變換和線性變換復合而成,非線性變換由S盒所給出。其中rki為輪密鑰,合成置換T組成輪函數。輪密鑰的產生與上圖流程類似,由加密密鑰作為輸入生成,輪函數中的線性變換不同,還有些參數的區別。
過程:
基本運算:SM4密碼算法使用模2加和循環移位作為基本運算。
基本密碼部件:SM4密碼算法使用了S盒、非線性變換τ、線性變換部件L、合成變換T基本密碼部件。
輪函數:SM4密碼算法采用對基本輪函數進行迭代的結構。利用上述基本密碼部件,便可構成輪函數。SM4密碼算法的輪函數是一種以字為處理單位的密碼函數。
加密算法:SM4密碼算法是一個分組算法。數據分組長度為128比特,密鑰長度為128比特。加密算法采用32輪迭代結構,每輪使用一個輪密鑰。
解密算法:SM4密碼算法是對合運算,因此解密算法與加密算法的結構相同,只是輪密鋁的使用順序相反,解密輪密鑰是加密輪密鑰的逆序。
密鑰擴展算法:SM4密碼算法使用128位的加密密鑰,並采用32輪法代加密結構,每一輪加密使用一個32位的輪密鑰,共使用32個輪密鑰。因此需要使用密鑰擴展算法,從加密密鑰產生出32個輪密鑰。
SM4的安全性:SM4密碼算法經過我國專業密碼機構的充分分析測試,可以抵抗差分攻擊、線性攻擊等現有攻擊,因此是安全的。