基于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 ciphertext

def 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 plaintext

def 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 result

def 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_value

if __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}")

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/958344.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

通过 Visual Studio Code 启动 IPython

在Visual Studio Code 中,你可以使用内置的终端来启动 ipython,当然首先要安装好ipython。 安装ipython的方法是在cmd里面输入以下命令安装: pip install ipython 启动ipython的步骤如下: 打开 VSCode 终端: 在 VSCo…

网络(三) 协议

目录 1. IP协议; 2. 以太网协议; 3. DNS协议, ICMP协议, NAT技术. 1. IP协议: 1.1 介绍: 网际互连协议, 网络层是进行数据真正传输的一层, 进行数据从一个主机传输到另一个主机. 网络层可以将数据主机进行传送, 那么传输层保证数据可靠性, 一起就是TCP/IP协议. 路径选择: 确…

Qt基础项目篇——Qt版Word字处理软件

一、核心功能 本软件为多文档型程序,界面是标准的 Windows 主从窗口 拥有:主菜单、工具栏、文档显示区 和 状态栏。 所要实现的东西,均在下图了。 开发该软件,主要分为下面三个阶段 1)界面设计开发 多窗口 MDI 程序…

Python+langchain+通义千问qwen(大模型实现自己的聊天机器人)

Langchain langchain是一个用于开发由语言模型驱动的应用程序的框架,致力于简化AI模型应用的开发。简单来说,langchain就是一个(帮助开发者轻松完成AI模型应用开发的)框架,现在支持python和js两个版本,它集成多种大语…

FPGA中场战事

2023年10月3日,英特尔宣布由桑德拉里维拉(Sandra Rivera)担任“分拆”后独立运营的可编程事业部首席执行官。 从数据中心和人工智能(DCAI)部门总经理,转身为执掌该业务的CEO,对她取得像AMD掌门人苏姿丰博士类似的成功,无疑抱以厚望。 十年前,英特尔花费167亿美元真金白银…

【超详细】ELK实现日志采集(日志文件、springboot服务项目)进行实时日志采集上报

本文章介绍,Logstash进行自动采集服务器日志文件,并手把手教你如何在springboot项目中配置logstash进行日志自动上报与日志自定义格式输出给logstash。kibana如何进行配置索引模式,可以在kibana中看到采集到的日志 日志流程 logfile-> l…

探索Linux中的进程控制:从启动到退出的背后原理

个人主页:chian-ocean 文章专栏-Linux 前言: 进程控制是操作系统对进程的创建、运行、调度、中止等活动进行管理和协调的行为。它是操作系统中至关重要的一部分,保证多任务处理环境下的资源分配和系统稳定性。 进程创建 fork( ) fork() 调…

【ComfyUI】python调用生图API,实现批量出图

官方给的示例: https://github.com/comfyanonymous/ComfyUI/blob/master/script_examples/websockets_api_example.pyhttps://github.com/comfyanonymous/ComfyUI/blob/master/script_examples/websockets_api_example.pyhttps://github.com/comfyanonymous/ComfyU…

推箱子游戏

java小游戏2 一游戏介绍 二图像准备 墙、箱子、人、箱子目的地,人左边、人右边、人上边、人下边 三结构准备 地图是什么,我们把地图想象成一个网格,每个格子就是工人每次移动的步长,也是箱子移动的距离,设置一个二维数…

软件鉴定测试重要性和流程分享

在当今快速发展的数字时代,软件系统的可靠性和安全性变得至关重要。越来越多的企业意识到,进行专业的软件鉴定与测试不仅是保证产品质量的必要步骤,也是提升市场竞争力的重要手段。软件鉴定测试指通过对软件进行评估和验证,以确保…

Linux C\C++编程-建立文件和内存映射

【图书推荐】《Linux C与C一线开发实践(第2版)》_linux c与c一线开发实践pdf-CSDN博客 《Linux C与C一线开发实践(第2版)(Linux技术丛书)》(朱文伟,李建英)【摘要 书评 试读】- 京东图书 Linu…

15-spring整合mybatis方式一

spring整合mybatis 方式一【重要】 步骤: 1.导入相关jar包 junit mybatis mysql数据库 spring相关的 aop织入 mybatis-spring 【new】 junit junit 4.12 mysql mysql-connector-java 8.0.23 org.mybatis mybatis 3.5.2 org.springframework spring-webmvc 5…

基于深度学习的视觉检测小项目(十五) 用户的登录界面

用户管理离不开的是消息框(QMessageBox)和对话框(QDialog),比如对话框用于用户名和密码输入,消息框用于提示登录成功、密码错误。 • 基础知识:PySide6(PyQT5)的常用对话…

什么是COLLATE排序规则?

在当今数字化世界中,数据的整理、比较和排序是至关重要的。在数据库管理和编程语言中,我们经常需要对字符串进行排序,以展示或处理信息。为了实现这一点,各种系统和工具提供了排序规则,其中COLLATE排序规则就是其中的一…

Linux:信号的保存[2]

1.信号在内核中的表示 因为是三种内核的数据结构,操作系统就可以通过操作这些数据结构提供接口。 如果一个信号没有产生,并不妨碍它可以先被阻塞。 当同一时刻发送大量相同信号时,会丢失。 2.信号的捕捉(重点) 信号产…

顺序表和链表(详解)

线性表 线性表( linear list)是n个具有相同特性的数据元素的有限序列。 线性表是一种在实际中广泛使用的数据结构,常见的线性表:顺序表、链表、栈、队列、字符串... 线性表在逻辑上是线性结构,也就说是连续的一条直线。…

【电脑无法通过鼠标和键盘唤醒应该怎么办】

【电脑无法通过鼠标和键盘唤醒应该怎么办】 方法一(有时候不起作用):方法二(方法一无效时,使用方法二): 方法一(有时候不起作用): 方法二(方法一无效时,使用方法二):

动态规划(路径问题)

62. 不同路径 62. 不同路径 - 力扣(LeetCode) 动态规划思想第一步:描述状态~ dp[i][j]:表示走到i,j位置时,一共有多少种方法~ 动态规划思想第二步:状态转移方程~ 动态规划思想第三步&#xf…

vue + element-ui 组件样式缺失导致没有效果

失效 代码: 修改方法: 在main.js文件里面加上: import element-ui/lib/theme-chalk/index.css; 最后:

Go 切片:用法和本质

要想更好的了解一个知识点,实战是最好的经历。 题目 我这里放一道题目: package mainimport "fmt"func SliceRise(s []int) {s append(s, 0)for i : range s {s[i]}fmt.Println(s) }func SlicePrint() {s1 : []int{1, 2}s2 : s1s2 append…