SM4,ECB,CBC

from gmssl.sm4 import CryptSM4, SM4_ENCRYPT, SM4_DECRYPT
import binascii
from heapq import heappush, heappop
from collections import OrderedDict
class SM4():
    def __init__(self,key,mode):
        self.key=key.encode('utf-8')
        self.mode=mode
        self.iv = 'adsqqwertyuioplk'.encode('utf-8')
        self.crypt_sm4 = CryptSM4()
    def str_to_hexStr(self, hex_str):

        hex_data = hex_str.encode('utf-8')
        str_bin = binascii.unhexlify(hex_data)
        return str_bin.decode('utf-8')
    def encrypt(self,value):
        if self.mode=='ECB':
            crypt_sm4 = self.crypt_sm4
            crypt_sm4.set_key(self.key, SM4_ENCRYPT)
            encrypt_value = crypt_sm4.crypt_ecb(value.encode('utf-8')) #  bytes类型

        elif self.mode=='CBC':
            crypt_sm4 = self.crypt_sm4
            crypt_sm4.set_key(self.key, SM4_ENCRYPT)
            encrypt_value = crypt_sm4.crypt_cbc(self.iv , value.encode('utf-8')) #  bytes类型
        return encrypt_value.hex()

    def decrypt(self,encrypt_value):
        if self.mode=='ECB':
            crypt_sm4 = self.crypt_sm4
            crypt_sm4.set_key(self.key, SM4_DECRYPT)
            decrypt_value = crypt_sm4.crypt_ecb(bytes.fromhex(encrypt_value)) #  bytes类型

        elif self.mode=='CBC':
            crypt_sm4 = self.crypt_sm4
            crypt_sm4.set_key(self.key, SM4_DECRYPT)
            decrypt_value = crypt_sm4.crypt_cbc(self.iv , bytes.fromhex(encrypt_value)) #  bytes类型

        return self.str_to_hexStr(decrypt_value.hex())

str_data = "1234567890QWERTY"
key="3l5butlj26hvv313"
print("请输入加密模式")
mode=input()
SM4 = SM4(key,mode)
print("待加密内容:", str_data)
encoding = SM4.encrypt(str_data)
print("国密sm4加密后的结果:", encoding)
print("国密sm4解密后的结果:", SM4.decrypt(encoding))

上一篇:C1-任务04 JavaScript编程


下一篇:3des加解密 cbc方法 数据填充