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

rdf-file:SM2加解密

一:SM2简介

SM2是中国密码学算法标准中的一种非对称加密算法(包括公钥和私钥)。SM2主要用于数字签名密钥交换加密解密等密码学。

  • 生成秘钥:用于生成一对公钥和私钥。公钥:用于加密数据和验证数字签名。私钥:用于解密数据和生成数字签名。
  • 数字签名:用于生成和验证数字签名,可以独立使用。数字签名可以确保数据的完整性和身份认证,防止数据被篡改或冒充。发送方可以使用自己的私钥生成数字签名,并将签名附加在数据上发送给接收方。接收方使用发送方的公钥来验证数字签名的有效性,从而确保数据的完整性和身份认证。
  • 密钥交换:双方可以使用各自的私钥和对方的公钥来生成一个共享密钥,用于后续的对称加密通信。
  • 加密解密:发送方使用接收方的公钥进行加密,接收方使用自己的私钥进行解密。

CFCA

二:Java

<dependency><groupId>org.apache.commons</groupId><artifactId>commons-lang3</artifactId><version>3.9</version>
</dependency><dependency><groupId>com.cfca</groupId><artifactId>SADK</artifactId><version>3.2.1.3</version>
</dependency>
public class SM2Util {private static final String PVK_FILE = ".pvk";private static final String PUB_FILE = ".puk";/*** 加密数据* @param publicKey* @param data*/public static byte[] encrypt(PublicKey publicKey, byte[] data) throws Exception {byte[] result = null;SM2Toolkit sm2Toolkit = new SM2Toolkit();SM2PublicKey sm2PublicKey = (SM2PublicKey)publicKey;result = sm2Toolkit.SM2EncryptData(sm2PublicKey, data);return result;}public static byte[] decryptString(PrivateKey privateKey, String base64Text) throws Exception {SM2Toolkit sm2Toolkit = new SM2Toolkit();SM2PrivateKey sm2PrivateKey = (SM2PrivateKey)privateKey;return sm2Toolkit.SM2DecryptData(sm2PrivateKey, BASE64Toolkit.decode(base64Text));}public static void sm4EncryptFile(String key, String inFile, String outFile) throws Exception{SM4Toolkit toolkit = new SM4Toolkit();toolkit.SM4Init(key.getBytes(), key.getBytes());toolkit.SM4EncryptFile(inFile, outFile);}public static boolean sM4DecryptFile(String key, String inFile, String outFile) throws Exception {SM4Toolkit toolkit = new SM4Toolkit();toolkit.SM4Init(key.getBytes(), key.getBytes());return toolkit.SM4DecryptFile(inFile, outFile);}/*** 签名* @param privateKey*/public static String singnString(PrivateKey privateKey, byte[] srcBytes) throws Exception {SM2Toolkit sm2Toolkit = new SM2Toolkit();SM2PrivateKey sm2PrivateKey = (SM2PrivateKey)privateKey;String result = BASE64Toolkit.encode(sm2Toolkit.SM2Sign(sm2PrivateKey, srcBytes));return result;}public static String sm2SignFile(String filePath, String privateKeyPath) throws Exception {SM2Toolkit sm2Toolkit = new SM2Toolkit();byte[] privateBytes = readKey(privateKeyPath);SM2PrivateKey sm2PrivateKey = (SM2PrivateKey)sm2Toolkit.SM2BuildPrivateKey(BASE64Toolkit.encode(privateBytes));byte[] hash = SM3Toolkit.SM3HashFile(sm2PrivateKey.getSM2PublicKey(), filePath);String result = BASE64Toolkit.encode(BCSoftSM2.sign(hash, sm2PrivateKey.dBigInteger(), true));return result;}/*** 文件验签* @param outfilePath* @param keyPath* @param singStr* @return*/public static boolean verify(String outfilePath, String keyPath, String singStr) {boolean result = false;try {SM2Toolkit toolkit = new SM2Toolkit();SM2PublicKey sm2PublicKey = (SM2PublicKey)toolkit.SM2BuildPublicKey(BASE64Toolkit.encode(readKey(keyPath)));byte[] hash = SM3Toolkit.SM3HashFile(sm2PublicKey, outfilePath);result = toolkit.SM2VerifyHash(sm2PublicKey, hash, BASE64Toolkit.decode(singStr));} catch (Exception e) {throw new RuntimeException("文件验签失败");}return result;}/*** 读取私钥* @param keyPath* @return*/public static SM2PrivateKey buildPrivateKey(String keyPath) throws Exception {if (!keyPath.endsWith(PVK_FILE)) {keyPath += PVK_FILE;}byte[] privateKeyByte = readKey(keyPath);SM2Toolkit sm2Toolkit = new SM2Toolkit();SM2PrivateKey sm2PrivateKey = (SM2PrivateKey)sm2Toolkit.SM2BuildPrivateKey(BASE64Toolkit.encode(privateKeyByte));return sm2PrivateKey;}/*** 读取公钥* @param keyPath* @return*/public static SM2PublicKey buildPublicKey(String keyPath) throws Exception {if (!keyPath.endsWith(PUB_FILE)) {keyPath += PUB_FILE;}byte[] privateKeyByte = readKey(keyPath);SM2Toolkit sm2Toolkit = new SM2Toolkit();SM2PublicKey sm2PublicKey = (SM2PublicKey)sm2Toolkit.SM2BuildPublicKey(BASE64Toolkit.encode(privateKeyByte));return sm2PublicKey;}/*** 读取秘钥* @param filePath*/public static byte[] readKey(String filePath) throws Exception {try(FileInputStream is = new FileInputStream(filePath)) {byte[] out = new byte[is.available()];byte[] buffer = new byte[1024];int len;for (int offset = 0; (len = is.read(buffer, 0, buffer.length)) != -1; offset += len) {System.arraycopy(buffer, 0, out, offset, len);}return out;}}public static void main(String[] args) throws Exception {SM2Toolkit toolkit = new SM2Toolkit();KeyPair keyPair = toolkit.SM2GenerateKeyPair();PublicKey publicKey = keyPair.getPublic();PrivateKey privateKey = keyPair.getPrivate();// 1. 对源文件进行签名(最终会作为签名文件和数据zip一起放到新的.zip中去)String zipPath = "/Temp/data.zip";String tempZipPath = "/Temp/Activiti/data.zip";String signguare = sm2SignFile(zipPath, "xxx.pvk");// 2. 对秘钥加密(最终将将加密的秘钥作为压缩包文件中的一部分)String verifyChars = "1234567890abcdefghijkmnopqrstuvwxyz";String encryptKey = RandomStringUtils.random(16, verifyChars).toUpperCase();byte[] encrypt = encrypt(buildPublicKey("/Temp/xxx.puk"), random16.getBytes());byte[] encryptKeyBytes = BASE64Toolkit.encode(encrypt).getBytes();// 3. 加密源文件sm4EncryptFile(encryptKey, zipPath, tempZipPath);// 4. 新的zip = (sign文件、秘钥文件、加密源文件)}
}

在这里插入图片描述

相关文章:

rdf-file:SM2加解密

一&#xff1a;SM2简介 SM2是中国密码学算法标准中的一种非对称加密算法&#xff08;包括公钥和私钥&#xff09;。SM2主要用于数字签名、密钥交换和加密解密等密码学。 生成秘钥&#xff1a;用于生成一对公钥和私钥。公钥&#xff1a;用于加密数据和验证数字签名。私钥&…...

harmonyOS学习笔记之@Styles装饰器与@Extend装饰器

Styles装饰器 定义组件重用样式 自定义样式函数使用装饰器 可以定义在组件内或全局,内部优先级>外部,内部不需要function,外部需要function 定义在组件内的styles可以通过this访问组件内部的常量和状态变量,可以在styles里通过事件来改变状态变量 弊端:只支持通用属性和通用…...

GateWay的路由与全局过滤器

1.断言工厂 我们在配置文件中写的断言规则只是字符串&#xff0c;这些字符串会被Predicate Factory读取并处理&#xff0c;转变为路由判断的条件 例如Path/user/**是按照路径匹配&#xff0c;这个规则是由 org.springframework.cloud.gateway.handler.predicate.PathRoutePr…...

MuleSoft 中的细粒度与粗粒度 API

API 设计是一个令人着迷的话题。API 设计的一个重要方面是根据 API 的特性和功能确定正确的“大小”。所有建筑师都必须在某个时候解决过这个问题。在本文中&#xff0c;我将尝试对我们在获得“正确的”粒度 API 之前需要考虑的各种参数进行一些深入的探讨&#xff1a; 可维护…...

【笔记】2023最新Python安装教程(Windows 11)

&#x1f388;欢迎加群交流&#xff08;备注&#xff1a;csdn&#xff09;&#x1f388; ✨✨✨https://ling71.cn/hmf.jpg✨✨✨ &#x1f913;前言 作为一名经验丰富的CV工程师&#xff0c;今天我将带大家在全新的Windows 11系统上安装Python。无论你是编程新手还是老手&…...

Android Wifi断开问题分析和802.11原因码

Android Wifi连接和断链分析思路。 1.密码错误导致的连接失败 2.关联被拒绝 3.热点未回复AUTH_RSP或者STA未收到 AUTH_RSP 4.热点未回复ASSOC_RSP或者STA未收到ASSOC_RSP 5.DHCP FAILURE 6.发生roaming 7.AP发送了DEAUTH帧导致断开连接 8.被AP踢出&#xff0c;这个原因…...

【Cell Signaling + 神经递质(neurotransmitter) ; 神经肽 】

Neuroscience EndocytosisExcitatory synapse pathwayGlutamatergic synapseInflammatory PainInhibitors of axonal regenerationNeurotrophin signaling pathwaySecreted Extracellular VesiclesSynaptic vesicle cycle...

当springsecurity出现SerializationException问题

当springsecurity出现SerializationException问题 01 异常发生场景 当我使用springsecurity时&#xff0c;登录成功后携带token访问接口出了问题 org.springframework.data.redis.serializer.SerializationException: Could not read JSON: Unrecognized field "userna…...

[SaaS] 广告创意中stable-diffusion的应用

深度对谈&#xff1a;广告创意领域中 AIGC 的应用这个领域非常快速发展&#xff0c;所以你应该保持好奇心&#xff0c;不断尝试新事物&#xff0c;不断挑战自己。https://mp.weixin.qq.com/s/ux9iEABNois3y4wwyaDzAQ我对AIGC领域应用调研&#xff0c;除了MaaS服务之外&#xff…...

第八节HarmonyOS @Component自定义组件的生命周期

在开始之前&#xff0c;我们先明确自定义组件和页面的关系&#xff1a; 1、自定义组件&#xff1a;Component装饰的UI单元&#xff0c;可以组合多个系统组件实现UI的复用。 2、页面&#xff1a;即应用的UI页面。可以由一个或者多个自定义组件组成&#xff0c;Entry装饰的自定…...

【Openstack Train安装】五、Memcached/Etcd安装

本文介绍Memcached/Etcd安装步骤&#xff0c;Memcached/Etcd仅需在控制节点安装。 在按照本教程安装之前&#xff0c;请确保完成以下配置&#xff1a; 【Openstack Train安装】一、虚拟机创建 【Openstack Train安装】二、NTP安装 【Openstack Train安装】三、openstack安装…...

29 kafka动态配置

为什么需要动态配置 线上运行的kafka broker修改配置需要重启的话&#xff0c;影响比较大。需要一个不需要重启就能使参数生效的功能 使用的场景 配置优先级&#xff1a; per-broker参数 > cluster-wide参数 > static参数 > 默认参数 1.动态调整network线程数和工…...

JIRA部分数据库结构

表jiraissue&#xff08;问题表&#xff09; 字段 数据类型 是否为空 KEY 说明 ID decimal(18,0) NO PRI 主键 pkey varchar(255) YES MUL 查看主键&#xff0c;“项目ID” PROJECT decimal(18,0) YES MUL 项目外键&#xff0c;项目表外键 REPORTER varch…...

RK3568平台开发系列讲解(Linux系统篇) dtb 到 device_node 的转化

🚀返回专栏总目录 文章目录 一、dtb 展开流程二、dtb 解析过程源码分析沉淀、分享、成长,让自己和他人都能有所收获!😄 📢本篇将介绍通过设备树 dtb 如何展开成 device_node 一、dtb 展开流程 设备树源文件编写: 根据设备树的基本语法和相关知识编写符合规范的设备树。…...

屏幕的刷新率和分辨率

一、显示器刷新率和分辨率的区别 1、显示器刷新率是什么意思? 刷新率是指电子束对屏幕上的图像重复扫描的次数。刷新率越高,所显示的图像(画面)稳定就越好。 刷新率高低直接决定其价格&#xff0c;但是由于刷新率与分辨率两者相互制约&#xff0c;因此只有在高分辨率下达到…...

面试官:请说说JS中的防抖和节流

给大家推荐一个实用面试题库 1、前端面试题库 &#xff08;面试必备&#xff09; 推荐&#xff1a;★★★★★ 地址&#xff1a;web前端面试题库 前言 为什么要做性能优化&#xff1f;性能优化到底有多重要&#xff1f; 性能优化是为了提供更好的用户体验、加…...

[足式机器人]Part4 南科大高等机器人控制课 Ch00 课程简介

本文仅供学习使用 本文参考&#xff1a; B站&#xff1a;CLEAR_LAB 课程主讲教师&#xff1a; Prof. Wei Zhang 南科大高等机器人控制课 Ch00 课程简介 1. What is this course about?2. Tentative Schedule暂定时间表 1. What is this course about? Develop a solid found…...

SSM项目实战-登录验证成功并路由到首页面,Vue3+Vite+Axios+Element-Plus技术

1、util/request.js import axios from "axios";let request axios.create({baseURL: "http://localhost:8080",timeout: 50000 });export default request 2、api/sysUser.js import request from "../util/request.js";export const login (…...

Python----网络爬虫

目录 1.Robots排除协议 2.request库的使用 3.beautifulsoup4库的使用 Python网络爬虫应用一般分为两部: &#xff08;1&#xff09;通过网络连接获取网页内容 &#xff08;2&#xff09;对获得的网页内容进行处理 - 这两个步骤分别使用不同的函数库&#xff1a;requests …...

【微信小程序】上传头像 微信小程序内接小程序客服

这里写目录标题 微信小程序上传头像使用button按钮包裹img 微信小程序内接小程序客服使用button按钮跳转客服 微信小程序上传头像 使用button按钮包裹img 原本思路是只使用image标签再加上chooseImg&#xff0c;但发现使用button标签上传头像这种方法更实用。微信小程序文档上…...

wordpress后台更新后 前端没变化的解决方法

使用siteground主机的wordpress网站&#xff0c;会出现更新了网站内容和修改了php模板文件、js文件、css文件、图片文件后&#xff0c;网站没有变化的情况。 不熟悉siteground主机的新手&#xff0c;遇到这个问题&#xff0c;就很抓狂&#xff0c;明明是哪都没操作错误&#x…...

【力扣数据库知识手册笔记】索引

索引 索引的优缺点 优点1. 通过创建唯一性索引&#xff0c;可以保证数据库表中每一行数据的唯一性。2. 可以加快数据的检索速度&#xff08;创建索引的主要原因&#xff09;。3. 可以加速表和表之间的连接&#xff0c;实现数据的参考完整性。4. 可以在查询过程中&#xff0c;…...

Admin.Net中的消息通信SignalR解释

定义集线器接口 IOnlineUserHub public interface IOnlineUserHub {/// 在线用户列表Task OnlineUserList(OnlineUserList context);/// 强制下线Task ForceOffline(object context);/// 发布站内消息Task PublicNotice(SysNotice context);/// 接收消息Task ReceiveMessage(…...

Redis相关知识总结(缓存雪崩,缓存穿透,缓存击穿,Redis实现分布式锁,如何保持数据库和缓存一致)

文章目录 1.什么是Redis&#xff1f;2.为什么要使用redis作为mysql的缓存&#xff1f;3.什么是缓存雪崩、缓存穿透、缓存击穿&#xff1f;3.1缓存雪崩3.1.1 大量缓存同时过期3.1.2 Redis宕机 3.2 缓存击穿3.3 缓存穿透3.4 总结 4. 数据库和缓存如何保持一致性5. Redis实现分布式…...

IGP(Interior Gateway Protocol,内部网关协议)

IGP&#xff08;Interior Gateway Protocol&#xff0c;内部网关协议&#xff09; 是一种用于在一个自治系统&#xff08;AS&#xff09;内部传递路由信息的路由协议&#xff0c;主要用于在一个组织或机构的内部网络中决定数据包的最佳路径。与用于自治系统之间通信的 EGP&…...

解决Ubuntu22.04 VMware失败的问题 ubuntu入门之二十八

现象1 打开VMware失败 Ubuntu升级之后打开VMware上报需要安装vmmon和vmnet&#xff0c;点击确认后如下提示 最终上报fail 解决方法 内核升级导致&#xff0c;需要在新内核下重新下载编译安装 查看版本 $ vmware -v VMware Workstation 17.5.1 build-23298084$ lsb_release…...

macOS多出来了:Google云端硬盘、YouTube、表格、幻灯片、Gmail、Google文档等应用

文章目录 问题现象问题原因解决办法 问题现象 macOS启动台&#xff08;Launchpad&#xff09;多出来了&#xff1a;Google云端硬盘、YouTube、表格、幻灯片、Gmail、Google文档等应用。 问题原因 很明显&#xff0c;都是Google家的办公全家桶。这些应用并不是通过独立安装的…...

工业自动化时代的精准装配革新:迁移科技3D视觉系统如何重塑机器人定位装配

AI3D视觉的工业赋能者 迁移科技成立于2017年&#xff0c;作为行业领先的3D工业相机及视觉系统供应商&#xff0c;累计完成数亿元融资。其核心技术覆盖硬件设计、算法优化及软件集成&#xff0c;通过稳定、易用、高回报的AI3D视觉系统&#xff0c;为汽车、新能源、金属制造等行…...

C++八股 —— 单例模式

文章目录 1. 基本概念2. 设计要点3. 实现方式4. 详解懒汉模式 1. 基本概念 线程安全&#xff08;Thread Safety&#xff09; 线程安全是指在多线程环境下&#xff0c;某个函数、类或代码片段能够被多个线程同时调用时&#xff0c;仍能保证数据的一致性和逻辑的正确性&#xf…...

推荐 github 项目:GeminiImageApp(图片生成方向,可以做一定的素材)

推荐 github 项目:GeminiImageApp(图片生成方向&#xff0c;可以做一定的素材) 这个项目能干嘛? 使用 gemini 2.0 的 api 和 google 其他的 api 来做衍生处理 简化和优化了文生图和图生图的行为(我的最主要) 并且有一些目标检测和切割(我用不到) 视频和 imagefx 因为没 a…...