import json
import requests
from gmssl.sm4 import CryptSM4, SM4_ENCRYPT, SM4_DECRYPT
import base64
# 密钥(16字节)
key = bytes.fromhex('6D89DFB9A5E789079804C9193C7C5C1E') # 必须是16字节
# IV(16字节)
iv = bytes.fromhex('9A5E789079804C9193C7C5C1E631471B') # 必须是16字节
def sm4_encrypt_cbc(plaintext: str, key: bytes, iv: bytes) -> str:
"""SM4 CBC 模式加密(自动 PKCS7 填充)"""
# 将字符串转换为字节
plaintext_bytes = plaintext.encode('utf-8')
crypt_sm4 = CryptSM4()
crypt_sm4.set_key(key, SM4_ENCRYPT)
ciphertext = crypt_sm4.crypt_cbc(iv, plaintext_bytes) # 传递字节数据
return base64.b64encode(ciphertext).decode('utf-8')
def sm4_decrypt_cbc(ciphertext_b64: str, key: bytes, iv: bytes) -> str:
"""SM4 CBC 模式解密(自动去除 PKCS7 填充)"""
ciphertext = base64.b64decode(ciphertext_b64)
crypt_sm4 = CryptSM4()
crypt_sm4.set_key(key, SM4_DECRYPT)
plaintext_bytes = crypt_sm4.crypt_cbc(iv, ciphertext) # 在这里传递IV
# 将字节解码为字符串
return plaintext_bytes.decode('utf-8')
# 测试
if __name__ == '__main__':
original_data = {
"dataItems": [
{
"name": "陈清流",
"sex": "男",
'taoist_monastic_name': '青主',
"identity": "斩龙人",
},
]
}
# print("原文:", json.dumps(original_data, ensure_ascii=False, indent=2))
# 将字典转换为JSON字符串
plaintext_str = json.dumps(original_data, ensure_ascii=False)
# 加密
encrypted = sm4_encrypt_cbc(plaintext_str, key, iv)
print("\n密文 (Base64):", encrypted)
# 解密
decrypted_str = sm4_decrypt_cbc(encrypted, key, iv)
print("\n解密后字符串:", decrypted_str)
# 将解密后的字符串解析为JSON
decrypted_data = json.loads(decrypted_str)
print("\n解密后数据:", json.dumps(decrypted_data, ensure_ascii=False, indent=2))
运行结果:
密文 (Base64): 78JJ93ReTmDPEwz7C35znmhADWlfpjsPIGtVXyHh73oCTqMR2Sxns10V5HfqMzJuLyJeluPIFftXrSLtpHgoTRxlQ3fvSPpJdaethDKK1RKKOEwpFQkr68SkF4nvdbfAvBqkcOQIfmFUKR9nK46GOw==
解密后字符串: {"dataItems": [{"name": "陈清流", "sex": "男", "taoist_monastic_name": "青主", "identity": "斩龙人"}]}
解密后数据: {
"dataItems": [
{
"name": "陈清流",
"sex": "男",
"taoist_monastic_name": "青主",
"identity": "斩龙人"
}
]
}