資源簡介
利用python3實現了國密SM3和國密SM4算法,一共有兩個文件SM3.py和sm4.py

代碼片段和文件信息
IV=[0x7380166f0x4914b2b90x172442d70xda8a0600
????0xa96f30bc0x163138aa0xe38dee4d0xb0fb0e4e]
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
#輸入為32比特,分為4塊,每塊為8比特的數
#輸出為32比特輸入對應的大整數
def?hex2int_32(key_data):
????tmp_data?=?int((key_data[0]?<24)?|?(key_data[1]?<16)?|?(key_data[2]?<8)?|?(key_data[3]))
????return?tmp_data
def?str2byte(msg):?#?字符串轉換成byte數組
????ml?=?len(msg)
????msg_byte?=?[]
????msg_bytearray?=?msg.encode(‘utf-8‘)
????for?i?in?range(ml):
????????msg_byte.append(msg_bytearray[i])
????return?msg_byte
def?byte2str(msg):?#?byte數組轉字符串
????ml?=?len(msg)
????str1?=?b““
????for?i?in?range(ml):
????????str1?+=?b‘%c‘?%?msg[i]
????return?str1.decode(‘utf-8‘)
def?hex2byte(msg):?#?16進制字符串轉換成byte數組
????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數組轉換成16進制字符串
????ml?=?len(msg)
????hexstr?=?““
????for?i?in?range(ml):
????????hexstr?=?hexstr?+?(‘%02x‘%?msg[i])#‘%02x‘%?msg[i]表示將msg[i]用兩位十六進制數表示
????return?hexstr
#輸入為96比特,三個分組,每個32比特
#輸出為32比特
def?FF(XYZj):
????if?j<=15:
????????return?X^Y^Z
????else:
????????return?(X&Y)|(X&Z)|(Y&Z)
def?GG(XYZj):
????if?j<=15:
????????return?X^Y^Z
????else:
????????return?(X&Y)|(~X&Z)
#輸入為一個32比特的整數
#輸出為循環左移n比特后的32比特整數
def?SHL(x?n):
????n?=?n?%?32
????xx?=?int(int(x?<????return?xx
def?ROTL(x?n):
????n?=?n?%?32
????xx?=?SHL(x?n)
????yy?=?xx?|?int((x?>>?(32?-?n))?&?0xffffffff)
????return?yy
#輸入為32比特的字,輸出也為32比特
def?P_0(X):
????return?X^(ROTL(X9))^(ROTL(X17))
def?P_1(X):
????return?X^(ROTL(X15))^(ROTL(X23))
#對原始消息msg做填充,使其二進制表示的長度為512的倍數
#msg的元素為8比特整數,
def?sm3_padding(msg):
????M=msg
????len1=len(msg)
????reserve1=len1?%?64
????M.append(0x80)
????reserve1?=?reserve1?+?1
????range_end?=?56
????if?reserve1?>?range_end:
????????range_end?=?range_end?+?64
????for?i?in?range(reserve1?range_end):
????????M.append(0x00)
#上述過程,在二進制表示下,含義為先添加了一個‘1’,又添加了一些0
????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):
????????M.append(bit_length_str[7-i])
#上述過程的含義是,添加msg長度的二進制表示
????return?M
#定義壓縮函數CFCF的輸入分為兩塊,第一部分為256比特,分為32塊,每塊為8比特整數
#第二部分為512比特,分為64塊,每塊為8比特整數
#輸出為256比特,分為32塊,每塊為8比特整數
def?CF(V_iB_i):
????W=[]
????for?i?in?range(16):
????????data=0
????????tmp_data?=?int((B_i[4*i]?<24)?|?(B_i[4*i+1]?<16)?|?(B_i[4*i+2]?<8)?|?(B_i[4*i+3]))
????????W.append(tmp_data)
????for?j?in?range(1668):
????????W.append(0)
????????W[j]=P_1(W[j-16]^W[j-9]^(ROTL(W[j-3]15)))^(ROTL(W[j-13]7))^W[j-6]
????W1=[]
????for?k?in?range(64):
????????W1.append(0)
????
?屬性????????????大小?????日期????時間???名稱
-----------?---------??----------?-----??----
?????文件???????4976??2018-12-25?17:00??python實現sm3sm4\sm3.py
?????文件???????4982??2018-12-23?10:03??python實現sm3sm4\sm4.py
?????目錄??????????0??2018-12-27?15:14??python實現sm3sm4
-----------?---------??----------?-----??----
?????????????????9958????????????????????3
評論
共有 條評論