sm3 算法java_国密SM3杂凑算法与实现
國密辦已于去年公布國產商密算法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);
程序運行結果與標準文檔的測試數據比較完全一致,證明實現正確。
總結
以上是生活随笔為你收集整理的sm3 算法java_国密SM3杂凑算法与实现的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 数字图像处理课程设计
- 下一篇: 高等数学张宇18讲 第十八讲 第二型曲线