当前位置: 首页 > news >正文

基于AnolisOS 8.6安装GmSSL 3.1.1及easy_gmssl库测试国密算法

测试环境

Virtual Box,AnolisOS-8.6-x86_64-minimal.iso,4 vCPU, 8G RAM, 60 vDisk。最小化安装。需联网。

系统环境

关闭防火墙
systemctl stop firewalld
systemctl disable firewalld
systemctl status firewalld
selinux关闭
cat /etc/selinux/config

安装Python39

dnf install -y python39 python39-pip

配置国内pip源

mkdir -p ~/.pip
touch ~/.pip/pip.conf
vi ~/.pip/pip.conf

[global]
trusted-host=mirrors.aliyun.com
index-url=http://mirrors.aliyun.com/pypi/simple/

安装easy_gmssl

安装依赖
dnf install -y gcc cmake
安装easy_gmssl库
pip3 install easy_gmssl

安装GmSSL 3.1.1

tar -zxvf GmSSL-3.1.1.tar.gz

cd GmSSL-3.1.1
mkdir build
cd build
cmake ..
make
make install

vi /etc/ld.so.conf,添加一行:
/usr/local/lib
加载动态链接
ldconfig

验证版本
gmssl version

生成公钥和私钥
gmssl sm2keygen -pass 123456 -out sm2_private.pem -pubout sm2_public.pem

基于easy_gmssl国密算法的加解密验签小脚本

from easy_gmssl import EasySM2SignKey, EasySM2VerifyKey, EasySm4CBC, EasySM3Digest
import os
import logging# 配置日志
logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(levelname)s - %(message)s')def sm4_encrypt(key, iv, plaintext):"""使用SM4算法进行加密:param key: 密钥,长度为16字节:param iv: 初始化向量,长度为16字节:param plaintext: 明文数据:return: 加密后的密文"""sm4 = EasySm4CBC(key, iv, True)ciphertext = sm4.Update(plaintext) + sm4.Finish()return ciphertextdef sm4_decrypt(key, iv, ciphertext):"""使用SM4算法进行解密:param key: 密钥,长度为16字节:param iv: 初始化向量,长度为16字节:param ciphertext: 密文数据:return: 解密后的明文"""sm4 = EasySm4CBC(key, iv, False)plaintext = sm4.Update(ciphertext) + sm4.Finish()return plaintextdef sm3_hash(data):"""使用SM3算法进行哈希计算:param data: 待哈希的数据:return: 哈希值"""sm3 = EasySM3Digest()sm3.UpdateData(data)hash_value, _, _ = sm3.GetHash()return hash_value.hex()def sm2_sign(private_key_path, password, data):"""使用SM2算法生成数字签名:param private_key_path: 私钥文件路径:param password: 私钥文件的密码:param data: 待签名的数据:return: 数字签名"""sm2_signer = EasySM2SignKey(pem_private_key_file=private_key_path, password=password)sm2_signer.UpdateData(data)signature = sm2_signer.GetSignValue()return signature.hex()def sm2_verify(public_key_path, data, signature):"""使用SM2算法验证数字签名:param public_key_path: 公钥文件路径:param data: 待验证的数据:param signature: 数字签名:return: 验证结果,True表示验证通过,False表示验证失败"""sm2_verifier = EasySM2VerifyKey(pem_public_key_file=public_key_path)sm2_verifier.UpdateData(data)return sm2_verifier.VerifySignature(bytes.fromhex(signature))def encrypt_file(input_file_path, output_file_path, key, iv):"""加密文件:param input_file_path: 待加密文件路径:param output_file_path: 加密后文件输出路径:param key: SM4算法密钥:param iv: SM4算法初始化向量"""with open(input_file_path, 'rb') as f:plaintext = f.read()ciphertext = sm4_encrypt(key, iv, plaintext)with open(output_file_path, 'wb') as f:f.write(ciphertext)logging.info(f"文件加密完成,输出路径:{output_file_path}")def decrypt_file(input_file_path, output_file_path, key, iv):"""解密文件:param input_file_path: 待解密文件路径:param output_file_path: 解密后文件输出路径:param key: SM4算法密钥:param iv: SM4算法初始化向量"""with open(input_file_path, 'rb') as f:ciphertext = f.read()plaintext = sm4_decrypt(key, iv, ciphertext)with open(output_file_path, 'wb') as f:f.write(plaintext)logging.info(f"文件解密完成,输出路径:{output_file_path}")def sign_file(private_key_path, password, input_file_path, output_file_path):"""对文件生成数字签名:param private_key_path: SM2算法私钥文件路径:param password: 私钥文件的密码:param input_file_path: 待签名文件路径:param output_file_path: 数字签名输出路径"""with open(input_file_path, 'rb') as f:data = f.read()sign = sm2_sign(private_key_path, password, data)with open(output_file_path, 'w') as f:f.write(sign)logging.info(f"数字签名生成完成,输出路径:{output_file_path}")def verify_file_signature(public_key_path, input_file_path, sign_file_path):"""验证文件的数字签名:param public_key_path: SM2算法公钥文件路径:param input_file_path: 待验证文件路径:param sign_file_path: 数字签名文件路径:return: 验证结果"""with open(input_file_path, 'rb') as f:data = f.read()with open(sign_file_path, 'r') as f:sign = f.read()result = sm2_verify(public_key_path, data, sign)return resultdef check_file_integrity(input_file_path):"""检查文件的完整性:param input_file_path: 待检查文件路径:return: 文件的SM3哈希值"""with open(input_file_path, 'rb') as f:data = f.read()hash_value = sm3_hash(data)return hash_valueif __name__ == "__main__":# 示例使用input_file_path = 'example.txt'  # 待处理文件路径encrypted_file_path = 'encrypted_example.enc'  # 加密后文件路径decrypted_file_path = 'decrypted_example.txt'  # 解密后文件路径sign_file_path = 'sign_example.txt'  # 数字签名文件路径key = b'\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f\x10'  # SM4算法密钥iv = b'\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f\x10'  # SM4算法初始化向量private_key_path = '/root/sm2_private.pem'  # SM2算法私钥文件路径public_key_path = '/root/sm2_public.pem'    # SM2算法公钥文件路径password = "123456"  # 私钥文件的密码# 加密文件encrypt_file(input_file_path, encrypted_file_path, key, iv)# 解密文件decrypt_file(encrypted_file_path, decrypted_file_path, key, iv)# 生成数字签名sign_file(private_key_path, password, input_file_path, sign_file_path)# 验证数字签名verify_result = verify_file_signature(public_key_path, input_file_path, sign_file_path)logging.info(f"数字签名验证结果:{verify_result}")# 检查文件完整性hash_value = check_file_integrity(input_file_path)logging.info(f"文件的SM3哈希值:{hash_value}")

相关文章:

基于AnolisOS 8.6安装GmSSL 3.1.1及easy_gmssl库测试国密算法

测试环境 Virtual Box,AnolisOS-8.6-x86_64-minimal.iso,4 vCPU, 8G RAM, 60 vDisk。最小化安装。需联网。 系统环境 关闭防火墙 systemctl stop firewalld systemctl disable firewalld systemctl status firewalld selinux关闭 cat /etc/selinux/co…...

vue3 实际应用 将一个日期使用 moment.js 实现星期 今天 明天 ...

数据源 ["2025-01-23","2025-01-24","2025-01-25","2025-01-28","2025-01-26","2025-01-27" ] 后端给返回了一个这样的数据 日期数据 实际应用中实现的是这样的显示效果 日期需要这样显示的tabs 栏 我们需要…...

LLM幻觉(Hallucination)缓解技术综述与展望

LLMs 中的幻觉问题(LLM 幻觉:现象剖析、影响与应对策略)对其可靠性与实用性构成了严重威胁。幻觉现象表现为模型生成的内容与事实严重不符,在医疗、金融、法律等对准确性要求极高的关键领域,可能引发误导性后果&#x…...

Unity入门2 背景叠层 瓦片规则

切割场景 瓦片调色盘 放在Assets里面新建瓦片地图,palettes tile 瓦片 palettes调色板 上下窗口是分开的 拖进这个格子窗 瓦片太碎,要封装 装好之后,只是把瓦片放上去了,但是还没有画布,显示是这样的 no valid target 新建“…...

docker-制作镜像gcc添加jdk运行java程序

最近的项目需要使用java调用c的链接库,.OS文件,一开始准备在jdk的镜像下去安装c的环境,不过安装的内容很多,比较复杂也容易缺很多的包,经过实验,我们决定使用gcc的镜像安装jdk来正确的运行java程序。 基础镜…...

HashTable, HashMap, ConcurrentHashMap 之间的区别

一、HashTable 只是将关键方法加上了锁(synchronized关键字)。 缺点:1.如果多线程访问同一个HashTable就回直接造成锁冲突。 2.HashTable的size属性也是通过 synchronized来控制同步的,效率比较低。 3.在扩容时会涉及大量的拷贝…...

vue2和vue3组件之间的通信方式差异

Vue2 vs Vue3 组件通信方法对比 1. 父子组件通信 1.1 Props 传递 Vue2 <!-- 父组件 --> <template><child-component :message"message"></child-component> </template><script> export default {data() {return {message:…...

报错:MC1000未知的生成错误Invalid number of sections declared in PE header

报错&#xff1a;MC1000未知的生成错误Invalid number of sections declared in PE header 报错问题&#xff1a; MC1000未知的生成错误Invalid number of sections declared in PE header 开发环境&#xff1a;vs2022&#xff0c;编译C#工程时报错, 解决办法&#xff1a;重新…...

FPGA实现任意角度视频旋转(二)视频90度/270度无裁剪旋转

本文主要介绍如何基于FPGA实现视频的90度/270度无裁剪旋转&#xff0c;旋转效果示意图如下&#xff1a; 为了实时对比旋转效果&#xff0c;采用分屏显示进行处理&#xff0c;左边代表旋转前的视频在屏幕中的位置&#xff0c;右边代表旋转后的视频在屏幕中的位置。 分屏显示的…...

Linux(Centos 7.6)命令详解:wc

1.命令作用 打印文件的行数、单词数、字节数&#xff0c;如果指定了多个文件&#xff0c;还会打印以上三种数据的总和(Print newline, word, and byte counts for each FILE, and a total line if more than one FILE is specified) 2.命令语法 Usage: wc [OPTION]... [FIL…...

centos7执行yum操作时报错Could not retrieve mirrorlist http://mirrorlist.centos.org解决

**原因&#xff1a;**CentOS 7 的官方仓库在 2024 年 6 月 30 日之后已经停止维护&#xff0c;不需要再去检查什么网络、DNS等乱七八糟的&#xff0c;因为这玩意都停止维护了&#xff0c;就算其他配置正常也照样不通。 **解决&#xff1a;**将CentOS-Base.repo文件替换成下面的…...

C语言程序设计:算法程序的灵魂

文章目录 C语言程序设计&#xff1a;算法程序的灵魂算法数据结构程序数据结构算法数值运算算法非数值运算算法 简单的算法举例【例2.1】求12345【例2.2】有50个学生&#xff0c;要求输出成绩在80分以上的学生的学号和成绩 简单的算法举例【例2.3】判定2000—2500年中的每一年是…...

openlayer getLayerById 根据id获取layer图层

背景&#xff1a; 在项目中使用getLayerById获取图层&#xff0c;这个getLayerById()方法不是openlayer官方文档自带的&#xff0c;而是自己封装的一个方法&#xff0c;这个封装的方法的思路是&#xff1a;遍历所有的layer&#xff0c;根据唯一标识【可能是id&#xff0c;也可能…...

在 vscode + cmake + GNU 工具链的基础上配置 JLINK

安装 JLINK JLINK 官网链接 下载安装后找到安装路径下的可执行文件 将此路径添加到环境变量的 Path 中。 创建 JFlash 项目 打开 JFlash&#xff0c;选择新建项目 选择单片机型号 在弹出的窗口中搜索单片机 其他参数根据实际情况填写 新建完成&#xff1a; 接下来设置…...

react antd点击table单元格文字下载指定的excel路径

在使用 Ant Design (antd) 的 Table 组件时&#xff0c;如果想点击表格单元格中的文字来触发下载指定路径的 Excel 文件&#xff0c;可以通过以下步骤实现&#xff1a; 1. 确保有一个可供下载的 Excel 文件&#xff1a;需要有一个服务器端点或者一个可以直接访问的 URL&#xf…...

01-AD工具使用

01-AD工具使用 AD工程创建1.创建Project工程2.创建原理图&&PCB文件3.保存活动和整个文档 创建新元件的能力导入已有素材:元件库的能力创建各种类型元器件的方法元器件TYPE-C 3.1 母头 16P插头AMS1117-3.3电源芯片STM32F103的IC芯片C2-104电容R4-1K电阻D1发光二极管 原理…...

centos7 配置国内镜像源安装 docker

使用国内镜像源&#xff1a;由于 Docker 的官方源在国内访问可能不稳定&#xff0c;你可以使用国内的镜像源&#xff0c;如阿里云的镜像源。手动创建 /etc/yum.repos.d/docker-ce.repo 文件&#xff0c;并添加以下内容&#xff1a; [docker-ce-stable] nameDocker CE Stable -…...

Java设计模式 十八 状态模式 (State Pattern)

状态模式 (State Pattern) 状态模式是一种行为型设计模式&#xff0c;它允许对象在其内部状态改变时改变其行为。状态模式让一个对象在其状态改变时&#xff0c;其行为也随之改变&#xff0c;看起来就像是改变了对象的类。通过将状态的变化封装到不同的状态对象中&#xff0c;…...

PyTorch张量操作reshape view permute transpose

1. reshape() 和 view() view和reshape都用于改变张量的shape view是reshape的一个特例&#xff0c;view要求张量在内存中是连续的&#xff0c;否则会抛出错误&#xff0c;view只能用于contiguous的张量 reshape会自动处理contiguous的情况&#xff0c;如果张量是contiguous…...

RabbitMQ5-死信队列

目录 死信的概念 死信的来源 死信实战 死信之TTl 死信之最大长度 死信之消息被拒 死信的概念 死信&#xff0c;顾名思义就是无法被消费的消息&#xff0c;一般来说&#xff0c;producer 将消息投递到 broker 或直接到queue 里了&#xff0c;consumer 从 queue 取出消息进…...

macOS使用LLVM官方发布的tar.xz来安装Clang编译器

之前笔者写过一篇博文ubuntu使用LLVM官方发布的tar.xz来安装Clang编译器介绍了Ubuntu下使用官方发布的tar.xz包来安装Clang编译。官方发布的版本中也有MacOS版本的tar.xz&#xff0c;那MacOS应该也是可以安装的。 笔者2015款MBP笔记本&#xff0c;CPU是intel的&#xff0c;出厂…...

【算法学习】归并排序算法思想的应用—求逆序对数量

Hey&#xff0c;大家好&#xff01;&#x1f44b; 今天我们来聊聊一个有趣的话题——如何在归并排序的基础上&#xff0c;高效解决求逆序对数量的问题。如果你对算法感兴趣&#xff0c;或者正在准备算法面试&#xff0c;这篇文章一定会对你有所帮助&#xff01;&#x1f680; …...

一组开源、免费、Metro风格的 WPF UI 控件库

前言 今天大姚给大家分享一个开源、免费、Metro风格的 WPF UI 控件库&#xff1a;MahApps.Metro。 项目介绍 MahApps.Metro 是一个开源、免费、Metro风格的 WPF UI 控件库&#xff0c;提供了现代化、平滑和美观的控件和样式&#xff0c;帮助开发人员轻松创建具有现代感的 Win…...

Spring Security 应用详解

Spring Security 应用详解 集成SpringBootSpring Boot 介绍创建maven工程spring 容器配置Servlet Context配置安全配置测试 工作原理结构总览认证流程认证流程AuthenticationProviderUserDetailsServicePasswordEncoder 授权流程授权流程授权决策 自定义认证自定义登录页面认证…...

业务对象和对象的区别

"业务对象"和"对象"这两个术语在日常编程和软件工程中经常被使用&#xff0c;但它们之间存在一些区别&#xff0c;主要体现在它们的目的、范围和抽象层次上。 ### 对象&#xff08;Object&#xff09; 1. **定义**&#xff1a; - 对象是面向对象编程&#…...

81,【5】BUUCTF WEB [b01lers2020]Life on Mars

进入靶场 怎莫颠颠的&#xff0c;一下子就想到展博了 先把左边的挨个点一遍 在最后一个有点收获 不过也没其他收获了 这种进去给个正常网页的题目&#xff0c;基本都靠url获取信息了 抓包看看有没有其他信息 竟然没有任何信息 自闭了 看别人的wp去咯 为什么别人抓到的包里…...

华硕笔记本装win10哪个版本好用分析_华硕笔记本装win10专业版图文教程

华硕笔记本装win10哪个版本好用&#xff1f;华硕笔记本还是建议安装win10专业版。Win分为多个版本&#xff0c;其中家庭版&#xff08;Home&#xff09;和专业版&#xff08;Pro&#xff09;是用户选择最多的两个版本。win10专业版在功能以及安全性方面有着明显的优势&#xff…...

Linux进程 -fork(初识),进程状态和进程优先级

目录 一、通过系统调用创建进程-fork 1.fork的介绍 2.fork的理解 3.fork常规用法 4.fork的三个问题 5.创建多个子进程 二、进程状态 &#xff08;1&#xff09;Linux内核源代码 &#xff08;2&#xff09;进程的状态 R运行状态(运行态&#xff09; S 睡眠状态&…...

数据从前端传到后端入库过程分析

数据从前端传到后端入库过程分析 概述 积累了一些项目经验&#xff0c;成长为一个老程序员了&#xff0c;自认为对各种业务和技术都能得心应手的应对了&#xff0c;殊不知很多时候我们借助了搜索引擎的能力&#xff0c;当然现在大家都是通过AI来武装自己。 今天要分析的话题是…...

macOS如何进入 Application Support 目录(cd: string not in pwd: Application)

错误信息 cd: string not in pwd: Application 表示在当前目录下找不到名为 Application Support 的目录。可能的原因如下&#xff1a; 拼写错误或路径错误&#xff1a;确保你输入的目录名称正确。目录名称是区分大小写的&#xff0c;因此请确保使用正确的大小写。正确的目录名…...