Python gmssl.SM4使用案例

       摘要:在异构计算系统验证中,通常会有数据加解密的要求,例如用户数据、权重参数等,本文将详细介绍在UVM验证环境中,调用Python的gmssl库,用SM4实现加解密的验证方案。

一、Python gmssl 库介绍

       gmssl 是一个开源的、纯Python实现的国密算法库。它的最大特点是不依赖任何底层C库(如OpenSSL),这使得它在各种环境中部署和使用都非常方便,尤其适合作为算法行为级参考模型(Golden Model/Oracle)。

1.1 主要功能和支持的算法:

  1. SM2 (非对称加密和签名): 基于椭圆曲线的公钥密码算法,用于加密通信、数字签名和密钥交换。
  2. SM3 (哈希算法): 密码杂凑算法,输出256位的哈希值,功能类似于SHA-256。
  3. SM4 (对称加密): 分组密码算法,分组长度和密钥长度都是128位,用于数据加密,功能类似于AES-128。
  4. ZUC (祖冲之序列密码): 用于移动通信4G/5G网络的对称加密和完整性保护。

1.2 为什么在验证中选择 gmssl

  • 纯Python实现:易于安装和部署,pip install gmssl 即可,避免了复杂的编译和环境依赖问题。
  • 代码可读性高:可以直接阅读其Python源码来理解算法标准,非常适合作为学习和开发的参考。
  • 易于集成:可以非常方便地与UVM验证环境通过DPI-C进行桥接,构建强大的参考模型。

二、gmssl 库用法示例

首先,安装gmssl库:

pip install gmssl

1. SM4 对称加密示例 (最常用于RTL验证)

       SM4是分组密码,处理数据时需要指定模式(Mode)填充(Padding)。这里以常用的CBC (Cipher Block Chaining)模式为例。

# sm4_example.py
from gmssl.sm4 import Sm4, SM4_ENCRYPT, SM4_DECRYPT# 密钥和初始化向量(IV)都必须是128位 (16字节)
key = b'\x01\x23\x45\x67\x89\xab\xcd\xef\xfe\xdc\xba\x98\x76\x54\x32\x10'
iv = b'\x01\x23\x45\x67\x89\xab\xcd\xef\xfe\xdc\xba\x98\x76\x54\x32\x10'# 待加密的明文,这里是128位 (16字节)
# 在RTL验证中,我们通常处理一个或多个完整的数据块,可以不使用padding
plaintext = b'\x01\x23\x45\x67\x89\xab\xcd\xef\xfe\xdc\xba\x98\x76\x54\x32\x10'# 1. 初始化SM4加密器
crypt_sm4 = Sm4()
crypt_sm4.set_key(key, SM4_ENCRYPT) # 设置为加密模式# 2. 加密
# 使用CBC模式进行加密,输入为bytes,输出也为bytes
ciphertext = crypt_sm4.crypt_cbc(iv, plaintext)print("--- SM4 CBC Mode ---")
print(f"Key        : {key.hex()}")
print(f"IV         : {iv.hex()}")
print(f"Plaintext  : {plaintext.hex()}")
print(f"Ciphertext : {ciphertext.hex()}")# 3. 解密过程
crypt_sm4.set_key(key, SM4_DECRYPT) # 切换为解密模式
decrypted_text = crypt_sm4.crypt_cbc(iv, ciphertext)print(f"Decrypted  : {decrypted_text.hex()}")# 4. 验证结果
assert decrypted_text == plaintext
print("\nEncryption and Decryption successful!")

2. SM3 哈希算法示例

# sm3_example.py
from gmssl.sm3 import sm3_hash# 待计算哈希的数据 (bytes)
data_to_hash = b'hello world'# 计算哈希值,输入为bytes,输出也为bytes (32字节, 256位)
hash_value = sm3_hash(list(data_to_hash)) # gmssl的sm3_hash接收一个byte列表print("--- SM3 Hash ---")
print(f"Data       : {data_to_hash.decode()}")
print(f"Hash Value : {hash_value.hex()}") # 以十六进制字符串输出

3. SM2 非对称加密示例

# sm2_example.py
from gmssl.sm2 import sm2_crypt# 1. 生成SM2密钥对 (公钥和私钥)
sm2_key = sm2_crypt.gen_key()
private_key = sm2_key.private_key.hex()
public_key = sm2_key.public_key.hex()print("--- SM2 Asymmetric Encryption ---")
print(f"Private Key: {private_key}")
print(f"Public Key : {public_key}")# 2. 使用公钥加密
data_to_encrypt = b'this is a secret message'
encryptor = sm2_crypt.Sm2Crypt(public_key=public_key)
ciphertext = encryptor.encrypt(data_to_encrypt)print(f"\nPlaintext  : {data_to_encrypt.decode()}")
print(f"Ciphertext : {ciphertext.hex()}")# 3. 使用私钥解密
decryptor = sm2_crypt.Sm2Crypt(private_key=private_key)
decrypted_text = decryptor.decrypt(ciphertext)print(f"Decrypted  : {decrypted_text.decode()}")assert decrypted_text == data_to_encrypt
print("\nSM2 Encryption and Decryption successful!")

三、gmssl 数据与 SystemVerilog 验证环境交互

       在UVM等SystemVerilog验证环境中,与Python脚本交互的最佳实践是通过DPI-C接口。这形成了一个稳定且高效的三层架构:UVM <-> C <-> Python。下面以SM4加密为例,展示一个完整的交互流程。

步骤 1: 创建Python脚本作为Oracle (gmssl_oracle.py)

这个脚本通过命令行接收指令和数据,并从标准输出返回结果。这是解耦的关键。

# gmssl_oracle.py
import sys
from gmssl.sm4 import Sm4, SM4_ENCRYPT, SM4_DECRYPTdef main():# 命令行参数: gmssl_oracle.py <encrypt|decrypt> <key_hex> <iv_hex> <data_hex>if len(sys.argv) != 5:print("Error: Invalid arguments.", file=sys.stderr)sys.exit(1)mode, key_hex, iv_hex, data_hex = sys.argv[1:]try:key = bytes.fromhex(key_hex)iv = bytes.fromhex(iv_hex)data = bytes.fromhex(data_hex)except ValueError as e:print(f"Error: Invalid hex string. {e}&

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/news/913196.shtml
繁体地址,请注明出处:http://hk.pswp.cn/news/913196.shtml
英文地址,请注明出处:http://en.pswp.cn/news/913196.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

迅为高情性6TOPS算力的RK3576开发板NPU rknn-model-zoo例程演示

迅为iTOP-3576开发板采用瑞芯微RK3576高性能、低功耗的应用处理芯片&#xff0c;集成了4个Cortex-A72和4个Cortex-A53核心&#xff0c;以及独立的NEON协处理器。它适用于ARM PC、边缘计算、个人移动互联网设备及其他多媒体产品。支持INT4/INT8/INT16/FP16/BF16/TF32混合运算&am…

rsync 命令详解

目录 rsync 传输备份工作原理详解一、核心算法:差异传输二、传输流程三、关键技术四、与cp/scp复制的本质区别rsync的使用基本语法常用选项常用组合案例1. **本地目录同步**2. **远程同步(SSH协议)**3. **删除目标端多余文件**4. **排除特定文件**5. **限速传输(避免占用带…

【MySQL进阶】错误日志,二进制日志,mysql系统库

目录 一.错误日志 1.1 配置错误日志 1.1.1 Windows的默认错误日志路径 1.1.2 Unix和Linux系统的默认错误日志路径 1.2 错误日志中事件的字段 1.2.1 核心错误事件字段 1.2.2.MySQL 错误消息的两种不同输出渠道 1.2.3 可选错误事件字段 1.3. 刷新错误日志文件和重命名 二…

day45-nginx复杂跳转与https

1. ✅nginx复杂跳转 客户端ip不是内网(172.16/192.168)ip时&#xff0c;维护文件存在时&#xff0c;返回503或者错误页面 1.1. &#x1f4dd;修改配置文件 server {listen 80;server_name re.linux.cn; root /app/code/re/;set $flag 0;if ( $remote_addr !~* "^172…

基于pcl点云库实现激光雷达数据采集

基于pcl点云库实现倍加福R2000激光雷达数据采集 一、项目介绍二、开发详情三、显示效果展示四、说明 一、项目介绍 最近用pcl库实现了倍加福R2000激光雷达的数据采集&#xff0c;并实时在viewer上实时更新显示。软件的开发是基于vs2019qt插件pcl库实现&#xff0c;可以完成如下…

微信小程序61~70

1.组件wxml的slot-插槽 在使用基础组件时&#xff0c;可以在组件中间写子节点&#xff0c;从而将子节点内容展示到页面中&#xff0c;自定义组件也可以接收子节点但是要在组件模板中定义节点&#xff0c;承载组件中间的子节点需要使用多个插槽时&#xff0c;要在组件.js中声明…

03_性能优化:让软件呼吸更顺畅

引言 在用户对软件响应速度近乎苛刻的今天&#xff0c;性能已成为产品竞争力的核心指标。据Google研究&#xff0c;页面加载时间每增加1秒&#xff0c;转化率就会下降20%。本文将从前端、后端、移动端三个维度&#xff0c;揭示性能优化的核心策略与实战技巧&#xff0c;帮助你打…

LangChain4j 框架模仿豆包实现智能对话系统:架构与功能详解

系统整体架构设计基于 LangChain4j 框架构建的智能对话系统采用 "前后端分离 大模型中枢" 的三层架构设计&#xff0c;实现了与豆包类似的智能交互体验。系统架构图如下所示&#xff1a;┌────────────────────────────────────…

基于uni-app的书法学习管理小程序的设计与实现

一、设计的目的 书法是中华民族传统文化的瑰宝&#xff0c;更是人类文明的宝贵财富&#xff0c;具有深远的意义和实价值。在当今数字化时代&#xff0c;随着信息技术的飞速发展&#xff0c;传统书法学习模式面临着诸多挑战和需要解决的问题。为推动书法学习的现代化转型&#…

NumPy 函数库在数学建模中的基本使用方法

一、引言 在数学建模的世界里,我们常常需要处理大量的数据和进行复杂的数值计算。Python 中的 NumPy 库就像是一位得力的助手,它为我们提供了强大的多维数组对象和丰富的数学函数,让我们能够高效地完成各种数值计算任务。接下来,我们将深入探讨 NumPy 在数学建模中的基本使…

模块三:现代C++工程实践(4篇)第一篇《C++模块化开发:从Header-only到CMake模块化》

引言&#xff1a;现代C工程化的核心挑战&#xff08;终极扩展版&#xff09; 在云计算与物联网时代&#xff0c;C项目规模呈指数级增长。传统Header-only开发模式暴露出编译效率低下、依赖管理混乱、版本冲突频发等致命问题。本文通过CMake 3.22Conan 2.0工具链的深度集成&…

uniapp启动图被拉伸问题

记录下&#xff1a; 安卓手机有不同的规格&#xff0c;很难所有规格都去适配。如果不适配所有机型&#xff0c;那么就会导致部分机型的启动图被拉伸。 安卓提供了.9.png图片格式&#xff0c;允许标注部分拉伸&#xff0c;这样启动图中间的logo就不会被拉伸。 下面2张图是没有…

stm32的三种开发方式

以下是针对STM32F103RC实现LED闪烁&#xff08;PC13引脚&#xff09;的三种开发方式示例代码&#xff0c;每种方式均保持相同的核心逻辑&#xff1a; 1. 寄存器开发方式&#xff08;直接操作寄存器&#xff09; #include "stm32f10x.h"int main(void) {// 1. 开启G…

SpringBoot问卷调查系统设计与实现

概述 基于SpringBoot开发的问卷调查系统&#xff0c;该系统集成了问卷管理、题目管理等多种功能模块。 主要内容 核心功能模块&#xff1a; ​​个人信息管理​​&#xff1a; 修改密码个人信息修改 ​​问卷管理​​&#xff1a; 问卷新增问卷修改问卷删除 ​​题目管理​…

Linux进程管理:从基础到实战

在 Linux 系统编程中&#xff0c;进程&#xff08;Process&#xff09; 是操作系统进行资源分配和调度的基本单位。理解进程的概念是掌握系统编程、多任务处理、并发编程的基础。 目录 一、什么是进程&#xff1f; 定义&#xff1a; 二、进程的生命周期 示例&#xff1a;查…

工业物联网中的 Modbus:传感器与网关通信实战(二)

四、实战案例解析 4.1 项目背景与目标 某智能工厂致力于提升生产过程的自动化和智能化水平&#xff0c;对生产线上的各种设备进行实时监控和数据分析。在该工厂的一个生产车间中&#xff0c;存在着大量的传感器&#xff0c;用于监测设备的运行状态、环境参数等信息。这些传感…

飞算 JavaAI 智控引擎:全链路开发自动化新图景

免责声明: 此文章的所有内容皆是本人实验测评&#xff0c;并非广告推广&#xff0c;并非抄袭。如有侵权&#xff0c;请联系&#xff0c;谢谢! 文章目录&#x1f4dd;前言一、飞算 Java AI 智能开发助手简介1.1何为飞算 Java AI智能助手&#xff1f;2.2 飞算Java AI 直击开发全场…

MYSQL数据库(九)MVCC-多版本并发控制

目录 一 前景导入 1 当前读 2 快照读 二 MVCC 1 隐藏字段 2 UndoLog 回滚日志 (1 UndoLog日志 (2 UndoLog版本链 3 Read View 面试八股 介绍一下MVCC 一 前景导入 1 当前读 可使当前事务读取的是最新版本的数据&#xff0c;读取时还要保证其他并发事务不能修改当中…

[Pytest] [Part 2]增加 log功能

开始实现需求之前先做个log类&#xff0c;可以给其他模块使用&#xff0c;也方便以后修改log类的功能和属性。 使用的是python中的logging包来进行简单的封装&#xff0c;具体代码如下 import logging import sysclass TefLogger:def __init__(self, logger_nameTEST_FRAMEWOR…

NeighborGeo:基于邻居的IP地理定位(三)

NeighborGeo:基于neighbors的IP地理定位 X. Wang, D. Zhao, X. Liu, Z. Zhang, T. Zhao, NeighborGeo: IP geolocation based on neighbors, Comput. Netw. 257 (2025) 110896, 3. NeighborGeo 本文提出NeighborGeo,利用图结构学习和有监督对比学习来建立可靠的地标-目标关…