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": "斩龙人"

}

]

}

相关推荐
兵慌码乱5 小时前
基于 MediaPipe 与 PySide2 的手势交互音乐控制系统实现:轻量化视觉交互全流程解析
python·opencv·计算机视觉·人机交互·手势识别·mediapipe·pyside2
luckdewei8 小时前
FastAPI 资产管理系统实战:复杂 ORM 关联、Alembic 迁移与 N+1 查询优化
python
aqi0014 小时前
15天学会AI应用开发(八)使用向量数据库实现RAG功能
人工智能·python·大模型·ai编程·ai应用
Csvn15 小时前
`functools.lru_cache` —— 一行代码搞定缓存加速
后端·python
金銀銅鐵1 天前
[Python] 从《千字文》中随机挑选汉字
后端·python
cup111 天前
[技术复盘] Windows Python 打包实战:Nuitka 环境踩坑总结与 CI 自动化构建全指南
python·ai·环境变量·ci·nuitka·skill
aqi002 天前
15天学会AI应用开发(七)有了大模型为什么还要引入RAG
人工智能·python·大模型·ai编程·ai应用
金銀銅鐵2 天前
用 Python 实现 Take-Away 游戏
python·游戏