國密辦已於去年公布國產商密演算法SM3,http://www.oscca.gov.cn/News/201012/News_1199.htm,這給其應用和開發帶來了方便,也見網上有許多實現的例子,出於一個項目開發需要,也試試其實現。
實現思路:完全從頭來寫不太適合如今開發時代,尤其是開原始碼的大量使用。密碼演算法實現比較有名的就是:openssl,其體系龐大,使用也方便。但從學習與研究上來看,還是需要實現一個簡化的代碼,要小,適用於移植與嵌入。那就看看有沒有更簡潔的原始碼庫。在網上搜尋一下,還找到個比較好的演算法庫,也不大,就是:Xyssl,好像是個法國人開發,管他是誰好用就行。
Xyssl實現了常用雜湊演算法MD2,MD4,MD5,SHA1,SHA2,SHA4等,並且代碼簡潔,適用於擴充,瞭解其實現機制外,那就看看我們的SM3演算法吧。
SM3演算法結果為256位,其大體上與SHA256相同,其演算法過程如下:
1、填充
SM3對訊息長度小於為2^64位進行運算,其填充方法與SHA256的相同,假設訊息m 的長度為l 位元。首先將位元“1”添加到訊息的末尾,再添加k 個“0”,k是滿足l + 1 + k = 448mod512 的最小的非負整數。然後再添加一個64位位元串,該位元串是長度l的二進位表示。填充後的訊息m′ 的位元長度為512的倍數。
2、迭代壓縮
這個過程與其他HASH演算法類似,先進行訊息擴充,之後迭代與壓縮,其詳細過程可參考標準文檔。其擴充與壓縮計算以迴圈移位為主,並有異或計算。
在演算法開發中碰到一個很有趣的事:使用VC6進行開發,在訊息擴充使用,計算式比較長:
W[j] = P1( W[j-16] ^ W[j-9] ^ ROTL(W[j-3],15)) ^ ROTL(W[j - 13],7 ) ^ W[j-6];
其運行結果為:VC6的debug版運行與標準說明的相同,而release版結果不同,變化很大,據分析可能原因是:VC6的編譯最佳化上可能有些不夠造成的,而用VC++2008 就不會出現debug和release計算結果不同的現象。
後來將這複雜算式改為多步計算,問題就沒了,哈哈,管他呢,解決問題是硬道理啊。
填充的訊息經擴充後在進行64輪迭代,最後就算出雜湊結果。
SS1 = ROTL((ROTL(A,12) + E + ROTL(T[j],j)), 7);
SS2 = SS1 ^ ROTL(A,12);
TT1 = FF0(A,B,C) + D + SS2 + W1[j];
TT2 = GG0(E,F,G) + H + SS1 + W[j];
D = C;
C = ROTL(B,9);
B = A;
A = TT1;
H = G;
G = ROTL(F,19);
F = E;
E = P0(TT2);
程式運行結果與標準文檔的測試資料比較完全一致,證明實現正確。
為了便於大家學習請到 http://download.csdn.net/detail/goldboar/3751538 下載,使用VC6開發,全部工程代碼,並附帶有SM3-HMAC演算法。