python国密SM4加解密

复制代码
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": "斩龙人"

}

]

}

相关推荐
默_笙2 天前
🍙 给每个请求过安检:FastAPI 是怎么把校验写进类型注解的
python
qq_426003962 天前
启动playwright录制codegen生成自动化测试脚本
python·自动化
虎头金猫2 天前
4K 视频总卡在公网带宽?用 N1 + OpenList 把网盘播放链路重新理顺
运维·服务器·网络·python·容器·beautifulsoup·pandas
长沙三为智能科技2 天前
家政小程序开发从0到上线:五阶段交付流程与验收清单
python
伞伞悦读2 天前
【第38期】Python 模块与包详解:import、from、模块搜索路径、包结构和 __init__
开发语言·python
只睡四小时3 天前
Canvas 弹道联机实战:700 行 + 固定时间步长
python·websocket·html5·游戏开发·canvas
奇思妙想聪明勤奋的小羊3 天前
DeepAgents第5章:子Agent 与上下文隔离—让 Agent学会委派
人工智能·python·学习·语言模型
lpfasd1233 天前
2026年第38周GitHub趋势周报
python·科技·github
IZero073 天前
Jev 与 Laya
python·语言模型