q789321 发表于 2018-8-9 08:14:13

python 编写SM3算法

  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 = (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 = 0x79cc4519
  for i in range(16, 64):
  T_j.append(0)
  T_j = 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 CF(V_i, B_i):
  W = []
  for j in range(0, 16):
  W.append(0)
  unpack_list = struct.unpack(">I", B_i)
  W = unpack_list
  for j in range(16, 68):
  W.append(0)
  W = P_1(W ^ W ^ (rotate_left(W, 15))) ^ (rotate_left(W, 7)) ^ W
  str1 = "%08x" % W
  W_1 = []
  for j in range(0, 64):
  W_1.append(0)
  W_1 = W ^ W
  str1 = "%08x" % W_1
  A, B, C, D, E, F, G, H = V_i
  """
  print "00",
  out_hex()
  """
  for j in range(0, 64):
  SS1 = rotate_left(((rotate_left(A, 12)) + E + (rotate_left(T_j, j))) & 0xFFFFFFFF, 7)
  SS2 = SS1 ^ (rotate_left(A, 12))
  TT1 = (FF_j(A, B, C, j) + D + SS2 + W_1) & 0xFFFFFFFF
  TT2 = (GG_j(E, F, G, j) + H + SS1 + W) & 0xFFFFFFFF
  D = C
  C = rotate_left(B, 9)
  B = A
  A = TT1
  H = G
  G = rotate_left(F, 19)
  F = E
  E = P_0(TT2)
  A = A & 0xFFFFFFFF
  B = B & 0xFFFFFFFF
  C = C & 0xFFFFFFFF
  D = D & 0xFFFFFFFF
  E = E & 0xFFFFFFFF
  F = F & 0xFFFFFFFF
  G = G & 0xFFFFFFFF
  H = H & 0xFFFFFFFF
  """
  str1 = "%02d" % j
  if str1 == "0":
  str1 = ' ' + str1
  print str1,
  out_hex()
  """
  V_i_1 = []
  V_i_1.append(A ^ V_i)
  V_i_1.append(B ^ V_i)
  V_i_1.append(C ^ V_i)
  V_i_1.append(D ^ V_i)
  V_i_1.append(E ^ V_i)
  V_i_1.append(F ^ V_i)
  V_i_1.append(G ^ V_i)
  V_i_1.append(H ^ V_i)
  return V_i_1
  def hash_msg(msg):
  len1 = len(msg)
  reserve1 = len1 % 64
  msg = msg + chr(0x80)
  reserve1 = reserve1 + 1
  for i in range(reserve1, 56):
  msg = msg + chr(0x00)
  bit_length = (len1) * 8
  bit_length_string = struct.pack(">Q", bit_length)
  msg = msg + bit_length_string
  #print len(msg)
  group_count = len(msg) / 64
  m_1 = B = []
  for i in range(0, group_count):
  B.append(0)
  B = msg
  V = []
  V.append(0)
  V = IV
  for i in range(0, group_count):
  V.append(0)
  V = CF(V, B)
  return V
  print "abc"
  y = hash_msg("abc")
  print "result: ",
  out_hex(y)
  print "abcd" * 16
  y = hash_msg("abcd" * 16)
  print "result: ",
  out_hex(y)
页: [1]
查看完整版本: python 编写SM3算法