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

}

]

}

相关推荐
斯特凡今天也很帅4 分钟前
python测试SFTP连通性
开发语言·python·ftp
sunywz7 分钟前
【JVM】(4)JVM对象创建与内存分配机制深度剖析
开发语言·jvm·python
wheelmouse77889 分钟前
如何设置VSCode打开文件Tab页签换行
java·python
0思必得016 分钟前
[Web自动化] Selenium基础介绍
前端·python·selenium·自动化·web自动化
2501_9311624344 分钟前
大疆相机:空中影像新境界
python
测试19981 小时前
Web自动化测试入门
自动化测试·软件测试·python·功能测试·selenium·测试工具·测试用例
予枫的编程笔记1 小时前
【论文解读】DLF:以语言为核心的多模态情感分析新范式 (AAAI 2025)
人工智能·python·算法·机器学习
lbb 小魔仙1 小时前
【Python】零基础学 Python 爬虫:从原理到反爬,构建企业级爬虫系统
开发语言·爬虫·python
黄河里的小鲤鱼1 小时前
拯救草台班子-战略
人工智能·python·信息可视化
Dr.Alex Wang1 小时前
Google Firebase 实战教学 - Streamlit、Bucket、Firebase
数据库·python·安全·googlecloud