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

}

]

}

相关推荐
北斗落凡尘19 小时前
LangGraph 入门实战(2)
python·langchain
ttod_qzstudio19 小时前
Java 常用语法极简通关(五):类与对象——字段、方法、构造器、this 与 static
java·开发语言·python
jufeng130720 小时前
【系列:手搓自主 AI Agent:Hermes 架构原理剖析 · 第 1 篇】
人工智能·python·架构·agent
月光船幽幽21 小时前
影子模式下保护 logits 不被修改
人工智能·python·算法
_oP_i1 天前
python 后缀 mjs文件
开发语言·python
北斗落凡尘1 天前
如何使用LangGraph(1)
python·langchain
Livia要学习1 天前
Python装饰器
开发语言·python
大模型丫丫1 天前
LangChain4j:Java 生态的 AI 应用开发利器
java·人工智能·python
circuitsosk1 天前
向量数据库选型与性能压测:Milvus、Pinecone、Chroma在真实业务下的对比
数据库·python·pinecone·milvus·向量数据库·chroma
雾时之林1 天前
python--字符串
开发语言·python