國密sm4
sm4 算法是一個分組算法,用於無線局域網產品。該算法的分組長度為128比特,密鑰長度為128比特。加密算法與密鑰擴展算法都采用32輪非線性迭代結構。解密算法與加密算法的結構相同,只是輪密鑰的使用順序相反,解密輪密鑰是加密輪密鑰的逆序。
gmssl
gmssl是一個開源的加密包的python實現,支持SM2/SM3/SM4等國密(國家商用密碼)算法、項目采用對商業應用友好的類BSD開源許可證,開源且可以用於閉源的商業應用。
Python實現sm4
#!/usr/bin/env python # -*- coding:utf-8 -*- """ ------------------------------------------------------------- Creator : Wang Date : 2022-05-06 Project : PyService FileName : sm4.py Description : ------------------------------------------------------------- """ ############################################################################## # # # 國產SM4加密,分組加密算法,可用於傳輸數據加密 # # # ############################################################################## from gmssl import sm4 class SM4(): """ 國產加密算法: sm4加解密 """ def __init__(self): self.gmsm4 = sm4.CryptSM4() # 實例化 def encryptSM4(self, encrypt_key, value): """ 國密sm4加密 :param encrypt_key: sm4加密key(十六進制字符) :param value: 待加密的字符串 :return: sm4加密后的十六進制字符 """ gmsm4 = self.gmsm4 gmsm4.set_key(bytes.fromhex(encrypt_key), sm4.SM4_ENCRYPT) # 設置密鑰,將十六進制字符Key轉為十六進制字節 data_str = str(value) encrypt_value = gmsm4.crypt_ecb(data_str.encode()) # ecb模式開始加密,encode():普通字符轉為字節 return encrypt_value.hex() # 返回十六進制字符 def decryptSM4(self, decrypt_key, encrypt_value): """ 國密sm4解密 :param decrypt_key:sm4加密key(十六進制字符) :param encrypt_value: 待解密的十六進制字符 :return: 原字符串 """ gmsm4 = self.gmsm4 gmsm4.set_key(bytes.fromhex(decrypt_key), sm4.SM4_DECRYPT) # 設置密鑰,將十六進制字符Key轉為十六進制字節 decrypt_value = gmsm4.crypt_ecb(bytes.fromhex(encrypt_value)) # ecb模式開始解密。bytes.fromhex():十六進制字符轉為十六進制字節 return decrypt_value.decode() if __name__ == '__main__': key = "D3CD18A35052492AA729A0D40AFEEBF4" # 密鑰 strData = "123456789" # 明文 SM4 = SM4() print("原字符", strData) encData = SM4.encryptSM4(key, strData) # 加密后的數據 print("sm4加密結果", encData) decData = SM4.decryptSM4(key, encData) print("sm4解密結果", decData) # 解密后的數據
效果截圖:
至此。轉載請注明出處,記得掃碼打賞支持哦,謝謝!