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

}

]

}

相关推荐
天才测试猿10 分钟前
如何封装自动化测试框架?
自动化测试·软件测试·python·selenium·测试工具·职场和发展·测试用例
overmind24 分钟前
oeasy Python 102 集合_运算_交集_并集_差集_对称差集
开发语言·python
爱吃提升42 分钟前
Python自动驾驶图像识别完整实战教程(OpenCV+YOLOv8,附可直接运行源码)
python·opencv·自动驾驶
statistican_ABin1 小时前
2026 FIFA 世界杯比赛与球队数据探索性分析
人工智能·python·数据挖掘·数据分析
qetfw1 小时前
yt-dlp:下载公开视频、字幕、封面和音频的实用命令
python·音视频·开源项目·效率工具
QH_ShareHub1 小时前
GPU 完整运行过程:驱动、CUDA Toolkit、Conda、Python PyTorch 与 R torch
pytorch·python·conda
AbsoluteLogic1 小时前
Python——必学内置模块 Sys
python
开源量化GO1 小时前
最新AI量化学习路径,从交易想法走到条件和动作
人工智能·python
香蕉鼠片2 小时前
图像处理经典脚本
图像处理·python·opencv
用户298698530142 小时前
Python 一键导出 Excel 中的图表和形状为图片
后端·python·excel