密码学 SM3算法 Python实现
生活随笔
收集整理的這篇文章主要介紹了
密码学 SM3算法 Python实现
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
密碼學 SM3算法 Python實現(xiàn)
#SM3IV = [0x7380166F, 0x4914B2B9, 0x172442D7, 0xDA8A0600, 0xA96F30BC, 0x163138AA, 0xE38DEE4D, 0xB0FB0E4E] T = [0x79cc4519, 0x7a879d8a]def ROL(X,i):i = i % 32return ((X<<i)&0xFFFFFFFF) | ((X&0xFFFFFFFF)>>(32-i)) def FF(X,Y,Z,j):if j>=0 and j<=15:return X ^ Y ^ Zelse:return ((X & Y) | (X & Z) | (Y & Z)) def GG(X,Y,Z,j):if j>=0 and j<=15:return X ^ Y ^ Zelse:return ((X & Y) | (~X & Z)) def P0(X):return X^ROL(X,9)^ROL(X,17) def P1(X):return X^ROL(X,15)^ROL(X,23) def T_(j):if j>=0 and j<=15:return T[0]else:return T[1] def Fill(message):m = bin(int(message,16))[2:]if len(m) != len(message)*4:m = '0'*(len(message)*4-len(m)) + ml = len(m)l_bin = '0'*(64-len(bin(l)[2:])) + bin(l)[2:]m = m + '1'm = m + '0'*(448-len(m)%512) + l_binm = hex(int(m,2))[2:]print("填充后的消息為:",m)return m def Group(m):n = len(m)/128M = []for i in range(int(n)):M.append(m[0+128*i:128+128*i])return M def Expand(M,n):W = []W_ = []for j in range(16):W.append(int(M[n][0+8*j:8+8*j],16))for j in range(16,68):W.append(P1(W[j-16]^W[j-9]^ROL(W[j-3],15))^ROL(W[j-13],7)^W[j-6])for j in range(64):W_.append(W[j]^W[j+4])Wstr = ''W_str = ''for x in W:Wstr += (hex(x)[2:] + ' ')for x in W_:W_str+= (hex(x)[2:] + ' ')print("第{}個消息分組 擴展后消息:".format(n+1))print("W:",Wstr)print("W':",W_str)return W,W_def CF(V,M,i):A,B,C,D,E,F,G,H = V[i]W,W_ = Expand(M,i)for j in range(64):SS1 = ROL((ROL(A,12)+E+ROL(T_(j),j%32))%(2**32),7)SS2 = SS1 ^ ROL(A,12)TT1 = (FF(A,B,C,j)+D+SS2+W_[j])%(2**32)TT2 = (GG(E,F,G,j)+H+SS1+W[j])%(2**32)D = CC = ROL(B,9)B = AA = TT1H = GG = ROL(F,19)F = EE = P0(TT2)print("j={}:".format(j))print(hex(A),hex(B),hex(C),hex(D),hex(E),hex(F),hex(G),hex(H))a,b,c,d,e,f,g,h = V[i]V_ = [a^A,b^B,c^C,d^D,e^E,f^F,g^G,h^H]return V_def Iterate(M):n = len(M)V = []V.append(IV)for i in range(n):V.append(CF(V,M,i))return V[n]if __name__ == '__main__':message = '61626364616263646162636461626364616263646162636461626364616263646162636461626364616263646162636461626364616263646162636461626364'm = Fill(message) #填充后消息M = Group(m) #數(shù)據(jù)分組Vn=Iterate(M) #迭代result = ''for x in Vn:result += (hex(x)[2:]+' ')print("雜湊值:",result)總結(jié)
以上是生活随笔為你收集整理的密码学 SM3算法 Python实现的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Altium Designer软件绘图
- 下一篇: Linux c/c++开发常用头文件