sm3 算法java_国密SM3杂凑算法与实现
國密辦已于去年公布國產(chǎn)商密算法SM3,http://www.oscca.gov.cn/News/201012/News_1199.htm,這給其應(yīng)用和開發(fā)帶來了方便,也見網(wǎng)上有許多實(shí)現(xiàn)的例子,出于一個項(xiàng)目開發(fā)需要,也試試其實(shí)現(xiàn)。
實(shí)現(xiàn)思路:完全從頭來寫不太適合如今開發(fā)時(shí)代,尤其是開源代碼的大量使用。密碼算法實(shí)現(xiàn)比較有名的就是:openssl,其體系龐大,使用也方便。但從學(xué)習(xí)與研究上來看,還是需要實(shí)現(xiàn)一個簡化的代碼,要小,適用于移植與嵌入。那就看看有沒有更簡潔的源代碼庫。在網(wǎng)上搜索一下,還找到個比較好的算法庫,也不大,就是:Xyssl,好像是個法國人開發(fā),管他是誰好用就行。
Xyssl實(shí)現(xiàn)了常用雜湊算法MD2,MD4,MD5,SHA1,SHA2,SHA4等,并且代碼簡潔,適用于擴(kuò)展,了解其實(shí)現(xiàn)機(jī)制外,那就看看我們的SM3算法吧。
SM3算法結(jié)果為256位,其大體上與SHA256相同,其算法過程如下:
1、填充
SM3對消息長度小于為2^64位進(jìn)行運(yùn)算,其填充方法與SHA256的相同,假設(shè)消息m 的長度為l 比特。首先將比特“1”添加到消息的末尾,再添加k 個“0”,k是滿足l + 1 + k?= 448mod512 的最小的非負(fù)整數(shù)。然后再添加一個64位比特串,該比特串是長度l的二進(jìn)制表示。填充后的消息m′ 的比特長度為512的倍數(shù)。
2、迭代壓縮
這個過程與其他HASH算法類似,先進(jìn)行消息擴(kuò)展,之后迭代與壓縮,其詳細(xì)過程可參考標(biāo)準(zhǔn)文檔。其擴(kuò)展與壓縮計(jì)算以循環(huán)移位為主,并有異或計(jì)算。
在算法開發(fā)中碰到一個很有趣的事:使用VC6進(jìn)行開發(fā),在消息擴(kuò)展使用,計(jì)算式比較長:
W[j] = P1( W[j-16] ^ W[j-9] ^ ROTL(W[j-3],15)) ^ ROTL(W[j - 13],7 ) ^ W[j-6];
其運(yùn)行結(jié)果為:VC6的debug版運(yùn)行與標(biāo)準(zhǔn)說明的相同,而release版結(jié)果不同,變化很大,據(jù)分析可能原因是:VC6的編譯優(yōu)化上可能有些不夠造成的,而用VC++2008? 就不會出現(xiàn)debug和release計(jì)算結(jié)果不同的現(xiàn)象。
后來將這復(fù)雜算式改為多步計(jì)算,問題就沒了,哈哈,管他呢,解決問題是硬道理啊。
填充的消息經(jīng)擴(kuò)展后在進(jìn)行64輪迭代,最后就算出雜湊結(jié)果。
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);
程序運(yùn)行結(jié)果與標(biāo)準(zhǔn)文檔的測試數(shù)據(jù)比較完全一致,證明實(shí)現(xiàn)正確。
總結(jié)
以上是生活随笔為你收集整理的sm3 算法java_国密SM3杂凑算法与实现的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 数字图像处理课程设计
- 下一篇: 高等数学张宇18讲 第十八讲 第二型曲线