Python实现SM4国密算法
importosfromgmsslimportsm4classSecureSM4:def__init__(self,hex_key:str):self.key_bytesbytes.fromhex(hex_key)# 验证密钥长度必须为 16 字节 (128位)iflen(self.key_bytes)!16:raiseValueError(SM4 密钥必须为 128 位 (32位十六进制字符))def_pkcs7_padding(self,data:bytes)-bytes:标准 PKCS7 填充确保明文长度是 16 的整数倍padding_len16-(len(data)%16)returndatabytes([padding_len]*padding_len)def_pkcs7_unpadding(self,data:bytes)-bytes:移除标准 PKCS7 填充padding_lendata[-1]returndata[:-padding_len]defencrypt_cbc(self,plain_text:str)-str: 国密 SM4 CBC 模式加密 (工业标准) # 1. 每次加密都生成一个全新的、随机的 16 字节 IV (初始化向量)iv_bytesos.urandom(16)# 2. 实例化并设置密钥与运行模式crypt_sm4sm4.CryptSM4()crypt_sm4.set_key(self.key_bytes,sm4.SM4_ENCRYPT)# 3. 对明文进行标准编码与填充padded_dataself._pkcs7_padding(plain_text.encode(utf-8))# 4. 执行 CBC 加密cipher_bytescrypt_sm4.crypt_cbc(iv_bytes,padded_data)# 5. 安全规范必须将 IV 和 密文 拼在一起返回否则解密方无法解密# 拼接后的前 32 个十六进制字符是 IV后面的是真正的密文returniv_bytes.hex()cipher_bytes.hex()defdecrypt_cbc(self,mixed_hex_data:str)-str: 国密 SM4 CBC 模式解密 mixed_bytesbytes.fromhex(mixed_hex_data)# 前 16 字节是 IV后面的是密文iv_bytesmixed_bytes[:16]cipher_bytesmixed_bytes[16:]crypt_sm4sm4.CryptSM4()crypt_sm4.set_key(self.key_bytes,sm4.SM4_DECRYPT)# 解密并移除填充decrypted_paddedcrypt_sm4.crypt_cbc(iv_bytes,cipher_bytes)plain_bytesself._pkcs7_unpadding(decrypted_padded)returnplain_bytes.decode(utf-8)if__name____main__:# 你的 128 位合规密钥HEX_KEYD3CD18A35052492AA729A0D40AFEEBF4cipherSecureSM4(HEX_KEY)raw_data123456789# 每次加密由于随机 IV 的存在生成的十六进制密文都会不同但都能正确解密极度安全encryptedcipher.encrypt_cbc(raw_data)print(安全加密含IV前缀:,encrypted)decryptedcipher.decrypt_cbc(encrypted)print(解密还原数据:,decrypted)