#SM3
IV =[0x7380166F,0x4914B2B9,0x172442D7,0xDA8A0600,0xA96F30BC,0x163138AA,0xE38DEE4D,0xB0FB0E4E]
T =[0x79cc4519,0x7a879d8a]defROL(X,i):
i = i %32return((X<<i)&0xFFFFFFFF)|((X&0xFFFFFFFF)>>(32-i))defFF(X,Y,Z,j):if j>=0and j<=15:return X ^ Y ^ Z
else:return((X & Y)|(X & Z)|(Y & Z))defGG(X,Y,Z,j):if j>=0and j<=15:return X ^ Y ^ Z
else:return((X & Y)|(~X & Z))defP0(X):return X^ROL(X,9)^ROL(X,17)defP1(X):return X^ROL(X,15)^ROL(X,23)defT_(j):if j>=0and j<=15:return T[0]else:return T[1]defFill(message):
m =bin(int(message,16))[2:]iflen(m)!=len(message)*4:
m ='0'*(len(message)*4-len(m))+ m
l =len(m)
l_bin ='0'*(64-len(bin(l)[2:]))+bin(l)[2:]
m = m +'1'
m = m +'0'*(448-len(m)%512)+ l_bin
m =hex(int(m,2))[2:]print("填充后的消息为:",m)return m
defGroup(m):
n =len(m)/128
M =[]for i inrange(int(n)):
M.append(m[0+128*i:128+128*i])return M
defExpand(M,n):
W =[]
W_ =[]for j inrange(16):
W.append(int(M[n][0+8*j:8+8*j],16))for j inrange(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 inrange(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_
defCF(V,M,i):
A,B,C,D,E,F,G,H = V[i]
W,W_ = Expand(M,i)for j inrange(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 = C
C = ROL(B,9)
B = A
A = TT1
H = G
G = ROL(F,19)
F = E
E = 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_
defIterate(M):
n =len(M)
V =[]
V.append(IV)for i inrange(n):
V.append(CF(V,M,i))return V[n]if __name__ =='__main__':
message ='61626364616263646162636461626364616263646162636461626364616263646162636461626364616263646162636461626364616263646162636461626364'
m = Fill(message)#填充后消息
M = Group(m)#数据分组
Vn=Iterate(M)#迭代
result =''for x in Vn:
result +=(hex(x)[2:]+' ')print("杂凑值:",result)