引用块内容
参考原始python 2 版本
http://co63oc.blog.51cto.com/904636/954086
修改为python3 版本,主要区别是python2-3中struct.pack的返回值的类型不同,python3的返回为byte类型,python2为str 类型。
import struct
IV="7380166f 4914b2b9 172442d7 da8a0600 a96f30bc 163138aa e38dee4d b0fb0e4e"
IV = int(IV.replace(" ", ""), 16)
a = []
for i in range(0, 8):
a.append(0)
a[i] = (IV >> ((7 - i) * 32)) & 0xFFFFFFFF
IV = a
def out_hex(list1):
for i in list1:
print ("%08x" % i)
print ("\n")
def rotate_left(a, k):
k = k % 32
return ((a << k) & 0xFFFFFFFF) | ((a & 0xFFFFFFFF) >> (32 - k))
T_j = []
for i in range(0, 16):
T_j.append(0)
T_j[i] = 0x79cc4519
for i in range(16, 64):
T_j.append(0)
T_j[i] = 0x7a879d8a
def FF_j(X, Y, Z, j):
if 0 <= j and j < 16:
ret = X ^ Y ^ Z
elif 16 <= j and j < 64:
ret = (X & Y) | (X & Z) | (Y & Z)
return ret
def GG_j(X, Y, Z, j):
if 0 <= j and j < 16:
ret = X ^ Y ^ Z
elif 16 <= j and j < 64:
#ret = (X | Y) & ((2 ** 32 - 1 - X) | Z)
ret = (X & Y) | ((~ X) & Z)
return ret
def P_0(X):
return X ^ (rotate_left(X, 9)) ^ (rotate_left(X, 17))
def P_1(X):
return X ^ (rotate_left(X, 15)) ^ (rotate_left(X, 23))
def hash_msg(msg):
len1 = len(msg)
reserve1 = len1 % 64
msg1 = msg.encode() + struct.pack("B",128)
reserve1 = reserve1 + 1
for i in range(reserve1, 56):
msg1 = msg1 + struct.pack("B",0)
bit_length = (len1) * 8
bit_length_string = struct.pack(">Q", bit_length)
msg1 = msg1 + bit_length_string
print (len(msg1) )
group_count = int(len(msg1) / 64 )
print(group_count)
m_1 = B = []
for i in range(0, group_count):
B.append(0)
B[i] = msg1[i*64:(i+1)*64]
V = []
V.append(0)
V[0] = IV
for i in range(0, group_count):
V.append(0)
V[i+1] = CF(V[i], B[i])
return V[i+1]
print ("abc")
y = hash_msg("abc")
print ("result: ")
out_hex(y)
"""
66c7f0f4 62eeedd9 d1f2d46b dc10e4e2 4167c487 5cf2f7a2 297da02b 8f4ba8e0
"""