最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Python 實現(xiàn)國產(chǎn)SM3加密算法的示例代碼

 更新時間:2020年09月21日 11:40:00   作者:薔薇  
這篇文章主要介紹了Python 實現(xiàn)國產(chǎn)SM3加密算法的示例代碼,幫助大家更好的理解和學(xué)習(xí)密碼學(xué),感興趣的朋友可以了解下

SM3是中華人民共和國政府采用的一種密碼散列函數(shù)標(biāo)準(zhǔn),由國家密碼管理局于2010年12月17日發(fā)布。主要用于報告文件數(shù)字簽名及驗證。

Python3代碼如下:

from math import ceil

##############################################################################
#
#              國產(chǎn)SM3加密算法
#
##############################################################################

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 CF(V_i, B_i):
  W = []
  for i in range(16):
    weight = 0x1000000
    data = 0
    for k in range(i * 4, (i + 1) * 4):
      data = data + B_i[k] * weight
      weight = int(weight / 0x100)
    W.append(data)

  for j in range(16, 68):
    W.append(0)
    W[j] = P_1(W[j - 16] ^ W[j - 9] ^ (rotate_left(W[j - 3], 15))) ^ (rotate_left(W[j - 13], 7)) ^ W[j - 6]
    str1 = "%08x" % W[j]
  W_1 = []
  for j in range(0, 64):
    W_1.append(0)
    W_1[j] = W[j] ^ W[j + 4]
    str1 = "%08x" % W_1[j]

  A, B, C, D, E, F, G, H = V_i
  """
  print "00",
  out_hex([A, B, C, D, E, F, G, H])
  """
  for j in range(0, 64):
    SS1 = rotate_left(((rotate_left(A, 12)) + E + (rotate_left(T_j[j], j))) & 0xFFFFFFFF, 7)
    SS2 = SS1 ^ (rotate_left(A, 12))
    TT1 = (FF_j(A, B, C, j) + D + SS2 + W_1[j]) & 0xFFFFFFFF
    TT2 = (GG_j(E, F, G, j) + H + SS1 + W[j]) & 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

  V_i_1 = []
  V_i_1.append(A ^ V_i[0])
  V_i_1.append(B ^ V_i[1])
  V_i_1.append(C ^ V_i[2])
  V_i_1.append(D ^ V_i[3])
  V_i_1.append(E ^ V_i[4])
  V_i_1.append(F ^ V_i[5])
  V_i_1.append(G ^ V_i[6])
  V_i_1.append(H ^ V_i[7])
  return V_i_1


def hash_msg(msg):
  # print(msg)
  len1 = len(msg)
  reserve1 = len1 % 64
  msg.append(0x80)
  reserve1 = reserve1 + 1
  # 56-64, add 64 byte
  range_end = 56
  if reserve1 > range_end:
    range_end = range_end + 64

  for i in range(reserve1, range_end):
    msg.append(0x00)

  bit_length = (len1) * 8
  bit_length_str = [bit_length % 0x100]
  for i in range(7):
    bit_length = int(bit_length / 0x100)
    bit_length_str.append(bit_length % 0x100)
  for i in range(8):
    msg.append(bit_length_str[7 - i])

  # print(msg)

  group_count = round(len(msg) / 64)

  B = []
  for i in range(0, group_count):
    B.append(msg[i * 64:(i + 1) * 64])

  V = []
  V.append(IV)
  for i in range(0, group_count):
    V.append(CF(V[i], B[i]))

  y = V[i + 1]
  result = ""
  for i in y:
    result = '%s%08x' % (result, i)
  return result


def str2byte(msg): # 字符串轉(zhuǎn)換成byte數(shù)組
  ml = len(msg)
  msg_byte = []
  msg_bytearray = msg # 如果加密對象是字符串,則在此對msg做encode()編碼即可,否則不編碼
  for i in range(ml):
    msg_byte.append(msg_bytearray[i])
  return msg_byte


def byte2str(msg): # byte數(shù)組轉(zhuǎn)字符串
  ml = len(msg)
  str1 = b""
  for i in range(ml):
    str1 += b'%c' % msg[i]
  return str1.decode('utf-8')


def hex2byte(msg): # 16進(jìn)制字符串轉(zhuǎn)換成byte數(shù)組
  ml = len(msg)
  if ml % 2 != 0:
    msg = '0' + msg
  ml = int(len(msg) / 2)
  msg_byte = []
  for i in range(ml):
    msg_byte.append(int(msg[i * 2:i * 2 + 2], 16))
  return msg_byte


def byte2hex(msg): # byte數(shù)組轉(zhuǎn)換成16進(jìn)制字符串
  ml = len(msg)
  hexstr = ""
  for i in range(ml):
    hexstr = hexstr + ('%02x' % msg[i])
  return hexstr


def KDF(Z, klen): # Z為16進(jìn)制表示的比特串(str),klen為密鑰長度(單位byte)
  klen = int(klen)
  ct = 0x00000001
  rcnt = ceil(klen / 32)
  Zin = hex2byte(Z)
  Ha = ""
  for i in range(int(rcnt)):
    msg = Zin + hex2byte('%08x' % ct)
    # print(msg)
    Ha = Ha + hash_msg(msg)
    # print(Ha)
    ct += 1
  return Ha[0: klen * 2]


def sm3_hash(msg, Hexstr=0):
  """
  封裝方法,外部調(diào)用
  :param msg: 二進(jìn)制流(如若需要傳入字符串,則把str2byte方法里msg做encode()編碼一下,否則不編碼)
  :param Hexstr: 0
  :return: 64位SM3加密結(jié)果
  """
  if (Hexstr):
    msg_byte = hex2byte(msg)
  else:
    msg_byte = str2byte(msg)
  return hash_msg(msg_byte)


if __name__ == '__main__':
  print(sm3_hash(b'SM3Test'))# 打印結(jié)果:901053b4681483b737dd2dd9f9a7f56805aa1b03337f8c1abb763a96776b8905

以上就是Python 實現(xiàn)國產(chǎn)SM3加密算法的示例代碼的詳細(xì)內(nèi)容,更多關(guān)于Python 實現(xiàn)國產(chǎn)SM3加密算法的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • Django模板中變量的運(yùn)算實現(xiàn)

    Django模板中變量的運(yùn)算實現(xiàn)

    這篇文章主要介紹了Django模板中變量的運(yùn)算,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-04-04
  • Python中將文件從一個服務(wù)器復(fù)制到另一個服務(wù)器的4種方法

    Python中將文件從一個服務(wù)器復(fù)制到另一個服務(wù)器的4種方法

    Python中將文件從一個服務(wù)器復(fù)制到另一個服務(wù)器通常涉及到網(wǎng)絡(luò)傳輸,這個過程可以通過多種方式實現(xiàn),本文主要為大家介紹了4種常用方法,需要的可以參考下
    2024-10-10
  • 使用Python制作一個惡意軟件刪除工具

    使用Python制作一個惡意軟件刪除工具

    這篇文章主要為大家詳細(xì)介紹了如何使用Python制作一個惡意軟件刪除工具,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2024-02-02
  • Pycharm無法顯示動態(tài)圖片的解決方法

    Pycharm無法顯示動態(tài)圖片的解決方法

    今天小編就為大家分享一篇Pycharm無法顯示動態(tài)圖片的解決方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-10-10
  • python繪制地震散點圖

    python繪制地震散點圖

    這篇文章主要為大家詳細(xì)介紹了python繪制地震散點圖的相關(guān)方法,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-06-06
  • python正則分析nginx的訪問日志

    python正則分析nginx的訪問日志

    最近工作中遇到一個需求,是要分析nginx的訪問日志,覺著利用python來實現(xiàn)比較合適,所以下面這篇文章主要介紹了利用python正則如何分析nginx的訪問日志,需要的朋友可以參考借鑒,下面來一起看看吧。
    2017-01-01
  • 如何解決import torchvision報錯問題 DLL:找不到模塊

    如何解決import torchvision報錯問題 DLL:找不到模塊

    這篇文章主要介紹了如何解決import torchvision報錯問題 DLL:找不到模塊,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-01-01
  • python中使用urllib2偽造HTTP報頭的2個方法

    python中使用urllib2偽造HTTP報頭的2個方法

    這篇文章主要介紹了python中使用urllib2偽造HTTP報頭的2個方法,即偽造http頭信息,需要的朋友可以參考下
    2014-07-07
  • Python代碼中如何讀取鍵盤錄入的值

    Python代碼中如何讀取鍵盤錄入的值

    在本篇文章里小編給大家分享的是關(guān)于Python代碼中讀取鍵盤錄入值的方法,需要的朋友們可以參考下。
    2020-05-05
  • 使用Python的Flask框架來搭建第一個Web應(yīng)用程序

    使用Python的Flask框架來搭建第一個Web應(yīng)用程序

    Flask框架是一個以輕量級著稱的Web開發(fā)框架,近兩年來在Web領(lǐng)域獲得了極高的人氣,這里我們就來看如何使用Python的Flask框架來搭建第一個Web應(yīng)用程序
    2016-06-06

最新評論

甘泉县| 宁强县| 黄山市| 囊谦县| 洪洞县| 阳曲县| 江陵县| 台湾省| 砚山县| 芜湖县| 肥城市| 沂源县| 漳平市| 益阳市| 逊克县| 南皮县| 大名县| 莒南县| 霞浦县| 峨边| 汤原县| 银川市| 平凉市| 林芝县| 临海市| 赤城县| 宜宾市| 微山县| 东莞市| 龙泉市| 灵璧县| 体育| 隆安县| 平武县| 西宁市| 夏津县| 成安县| 乌拉特中旗| 兴宁市| 黔南| 闽侯县|