VUE3+Springboot实现SM2完整步骤
一.VUE3代码实现
1.安装依赖
npm install --save sm-crypto
2.导入sm2
const sm2 = require('sm-crypto').sm2
3.定义公钥私钥
var privateKey = "私钥";//解密使用
var publicKey = "公钥";//加密使用
4.设置加密模式
//cipherMode [加密模式 C1C3C2:1, C1C2C3:0]const cipherMode = 1;//默认是1
5.加密
页面代码直接@click绑定getphone即可单击实现data() {return {copyphone:'',phone:'123545687',}}
methods: {getphone(){const sm2 = require('sm-crypto').sm2;var publicKey = "公钥";//加密使用var encrText = 需要加密的字段;//例如var enxrText = this.phone;const cipherMode = 1;let decryptData = sm2.doEncrypt(encrText, publicKey, cipherMode) // 加密结果return '04' + decryptData;//04可不要具体看后端要求}}
6.解密
页面代码直接@click绑定getphone即可单击实现data() {return {copyphone:'',}}
methods: {getphone(){const sm2 = require('sm-crypto').sm2;//var privateKey = "私钥";var encrText = 需要解密的字段; //有04要截 var encrText = val.substring(2);val是后台传过来的加密字段,将‘04’截取掉const cipherMode = 1let decryptData = sm2.doDecrypt(encrText, privateKey, cipherMode) // 解密结果return decryptData ;this.copyphone = decryptData;//赋值方便处理console.log(this.copyphone);//直接打印出来看是否实现}}
二、springboot代码实现
1.导入maven依赖
<dependency><groupId>org.bouncycastle</groupId><artifactId>bcprov-jdk15on</artifactId><version>1.70</version></dependency><dependency><groupId>cn.hutool</groupId><artifactId>hutool-all</artifactId><version>5.8.9</version></dependency>
2.代码实现
package com.gstanzer.supervise.sm2;import cn.hutool.core.util.HexUtil;
import cn.hutool.crypto.BCUtil;
import cn.hutool.crypto.ECKeyUtil;
import cn.hutool.crypto.asymmetric.KeyType;
import cn.hutool.crypto.asymmetric.SM2;
import cn.hutool.crypto.SmUtil;
import org.bouncycastle.crypto.engines.SM2Engine;
import org.bouncycastle.crypto.params.ECPublicKeyParameters;
import org.bouncycastle.crypto.signers.PlainDSAEncoding;
import org.bouncycastle.jcajce.provider.asymmetric.ec.BCECPublicKey;import java.util.HashMap;
import java.util.Map;
import java.util.Set;public class SM2CryptUtils {//生成秘钥对public static Map<String,String> createSM2Key(){SM2 sm2=SmUtil.sm2();sm2.setMode(SM2Engine.Mode.C1C3C2);String privateKey=HexUtil.encodeHexStr(BCUtil.encodeECPrivateKey(sm2.getPrivateKey()));String publicKey = HexUtil.encodeHexStr(((BCECPublicKey) sm2.getPublicKey()).getQ().getEncoded(false));Map<String,String> keys=new HashMap<>();keys.put(privateKey,publicKey);return keys;}//加密public static String encrypt(String data, String publicKey){String publicKeyTmp = publicKey;if (publicKey.length() == 130) {//这里需要去掉开始第一个字节 第一个字节表示标记publicKeyTmp = publicKey.substring(2);}String xhex = publicKeyTmp.substring(0, 64);String yhex = publicKeyTmp.substring(64, 128);ECPublicKeyParameters ecPublicKeyParameters = BCUtil.toSm2Params(xhex, yhex);//创建sm2 对象SM2 sm2 = new SM2(null, ecPublicKeyParameters);sm2.usePlainEncoding();sm2.setMode(SM2Engine.Mode.C1C3C2);String hex = sm2.encryptHex(data,KeyType.PublicKey);return hex;}//解密public static String decrypt(String data, String privateKey){SM2 sm2 = new SM2(ECKeyUtil.toSm2PrivateParams(privateKey), null);sm2.setMode(SM2Engine.Mode.C1C3C2);sm2.setEncoding(new PlainDSAEncoding());String encryptStr = sm2.decryptStr(data, KeyType.PrivateKey);return encryptStr;}public static void test1() {Map<String, String> keymap = SM2CryptUtils.createSM2Key();Set<Map.Entry<String, String>> entries = keymap.entrySet();String publickey = "";String privatekey = "";for (Map.Entry<String, String> entry : entries) {publickey = entry.getValue();privatekey = entry.getKey();}System.out.println("SM2国密算法公钥:{}" + publickey);System.out.println("SM2国密算法私钥:{}" + privatekey);String data = SM2CryptUtils.encrypt("CQmgh301%",publickey);System.out.println("加密后数据:" + data);String result = SM2CryptUtils.decrypt(data,privatekey);System.out.println("解密后数据:" + result);}public static void test2() {String publickey = "04daac50ec8a61ef628f79d738a71e543dcb969a5efbb6bf8290b73be5a5a80e3d34f74fb987b237ccf8cb1930a842a21d240e22807fdc66726a0a4368bf7483c6";String privatekey = "339521b8cd63e0e3c83fd89f6141b085000f9e0bfad66473288d2e6851ae8b77";System.out.println("SM2国密算法公钥:{}" + publickey);System.out.println("SM2国密算法私钥:{}" + privatekey);
// String data = SM2CryptUtils.encrypt("CQmgh301%",publickey);String data = "04da994c0c7b224832cfb578be69445201dda1338515b5d5dcc94e12ff414a2a9fcee9c788344a0393178a341043d19c19619df62a5fbf6b731d2d559faa7470ff38e65b8a0a2b091de65277fccd0a91777e4d20d33845abafb0653edb557c85c7a4dcc78f3b87f35b";System.out.println("加密后数据:" + data);String result = SM2CryptUtils.decrypt(data,privatekey);System.out.println("解密后数据:" + result);}public static void main(String[] args) {//test1();test2();}
}
相关文章:
VUE3+Springboot实现SM2完整步骤
一.VUE3代码实现 1.安装依赖 npm install --save sm-crypto 2.导入sm2 const sm2 require(sm-crypto).sm2 3.定义公钥私钥 var privateKey "私钥";//解密使用 var publicKey "公钥";//加密使用 4.设置加密模式 //cipherMode [加密模式 C1C3C2:1,…...
CSS-背景属性篇
属性名:background-color 功能:设置背景颜色 属性值:符合CSS中颜色规范的值 默认背景颜色是 transparent body{ background-color: blue; } 属性名:background-image 功能:设置背景图片 属性值:url(图片的…...

KyLin离线安装OceanBase
去OceanBase下载若干文件 1 首先安装ob-deploy-2.3.1-2.el7.x86_64.rpm rpm -ivh ob-deploy-2.3.1-2.el7.x86_64.rpm# 运行此命令的时候他会报错 RPM should not be used directly install RPM packages, use Alien instead! 这个需要用Alien去转换为deb的包,不…...

插件预热 | 且看安全小白如何轻松利用Goby插件快速上分
001 前言 各位师傅们好,首先强调一遍我可没做坏事,我只是想学技术,我有什么坏心思呢 回到正题,作为一个初学者,我想和大家分享一下我是如何利用 Goby 进行刷分的经历。大家都知道,刚开始学习的时候&…...

pytorch下载离线包的网址
下载地址:https://download.pytorch.org/whl/torch_stable.html 安装GPU版本需要安装:torch、torchvision、 注意版本需要对应上 格式:适用cuda版本,torch版本 或者 orchvision版本,cp38就是适用python 3.8版本 下…...

【docker下安装jenkins】(一)
目的:在Linux操作系统(x86_64)下,使用docker部署jenkins,python使用压缩包安装 安装jenkins的步骤 1、编排jenkins的docker-compose.yml文件 说明:这里遇到部署jenkins后,占用内存8G,所以重新…...

【前端】必学知识ES6 1小时学会
1.ES6概述 2.let和const的认识 3.let、const、var的区别 4.模板字符串 5.函数默认参数 6.箭头函数【重点】 编辑7.对象初始化简写以及案例分析 【重点】 8.对象解构 8.对象传播操作符 9.对象传播操作符案例分析 编辑 10.数组Map 11.数组Reduce 12.NodeJS小结 …...
【学生成绩管理】数据库示例数据(MySQL代码)
【学生成绩管理】数据库示例数据(MySQL代码) 目录 【学生成绩管理】数据库示例数据(MySQL代码)一、创建数据库二、创建dept(学院)表1、创建表结构2、添加示例数据3、查看表中数据 三、创建stu(学…...

【电子通识】什么是物料清单BOM(Bill of Material))
BOM (Bill of Materials)是我们常说的物料清单。BOM是制造业管理的重点之一,用于记载产品组成所需要的全部物料(Items)。物料需求的计算是从最终产品开始,层层往下推算出部件,组件,零件和原材料的需求量。这…...

接口自动化测试难点:数据库验证解决方案!
接口自动化中的数据库验证:确保数据的一致性和准确性 接口自动化测试是现代软件开发中不可或缺的一环,而数据库验证则是确保接口返回数据与数据库中的数据一致性的重要步骤。本文将介绍接口自动化中的数据库验证的原理、步骤以及示例代码,帮…...
淘宝、1688代购系统;微信代购小程序,代购系统源代码,PHP前端源码演示
电商价格数据监测接口、品牌商品控价接口、商品数据分析接口和比价搜索API接口都是非常实用的电商接口服务,下面我将为您详细介绍这些接口的用途和使用方式。 1.电商价格数据监测接口(注册获取请求调用key) taobao.item_get-获得淘宝商品详…...

LED驱动控制专用电路
一、基本概述 TM1628是一种带键盘扫描接口的LED(发光二极管显示器)驱动控制专用IC,内部集成有MCU 数 字接口、数据锁存器、LED 驱动、键盘扫描等电路。本产品质量可靠、稳定性好、抗干扰能力强。 主要适用于家电设备(智能热水器、微波炉、洗衣机、空调…...
为什么 Flink 抛弃了 Scala
曾经红遍一时的Scala 想当初Spark横空出世之后,Scala简直就是语言界的一颗璀璨新星,惹得大家纷纷侧目,连Kafka这类技术框架也选择用Scala语言进行开发重构。 可如今,Flink竟然公开宣布弃用Scala 在Flink1.18的官方文档里&#x…...
scala 实现表达式解析
表达式解析 import org.junit.Testimport scala.collection.mutableclass ExprTestCase {private val orderSource "source_1"private val saleChannel "saleChannel"val datas new mutable.HashMap[String, String]();// p1, source1, sale1, source…...
分布式事务seata的AT模式介绍
分布式事务seata的AT模式介绍 seata是阿里开源的一款分布式事务解决方案,致力于提供高性能和简单易用的分布式事务服务。Seata 将为用户提供了 AT、TCC、SAGA 和 XA 事务模式,本文主要介绍AT模式的使用。 seata安装 下载seata服务,官方地址…...

初识Linux(1),看了这篇文章,妈妈再也不用担心我Linux找不到门了。
文章目录 前言1. ls 指令例如:只显示文件名属性ls显示文件详细属性 ls - l 该操作可以简写成ll查看隐藏文件ls -l -a 2.pwd例如:显示当前目录所处的路径类似于windows如下操作: 3.cd 指令例如:改变工作目录相当于windows如下操作 4.whoami 指…...

甲烷产生及氧化
温室气体排放被认为是加速气候变化的重要因素,甲烷(CH4)是仅次于二氧化碳(CO2)的重要温室气体,其百年温室效应潜势是CO2的28倍[1-2]。湿地中的CH4由产甲烷古菌在水体底部或沉积层严格厌氧环境下产生并释放进入水体,产生的CH4向上覆水运输过程…...
Javascript的form表单校验输入框
以下是HTML代码: <form name"myForm" onsubmit"return validateForm()"><label for"name">姓名:</label><input type"text" id"name" name"name"><br><l…...
大数据-之LibrA数据库系统告警处理(ALM-37003 GTM主备不同步或者GTM主备断连)
告警解释 当GTM主实例与GTM备实例连接异常或者GTM主实例未处于同步状态时,产生该告警。 告警属性 告警ID 告警级别 可自动清除 37003 严重 是 告警参数 参数名称 参数含义 ServiceName 产生告警的服务名称 RoleName 产生告警的角色名称 HostName 产…...
python每日一题——4移动0
题目 给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。 请注意 ,必须在不复制数组的情况下原地对数组进行操作。 示例 1: 输入: nums [0,1,0,3,12] 输出: [1,3,12,0,0] 示例 2: 输入: nums [0]…...

相机Camera日志实例分析之二:相机Camx【专业模式开启直方图拍照】单帧流程日志详解
【关注我,后续持续新增专题博文,谢谢!!!】 上一篇我们讲了: 这一篇我们开始讲: 目录 一、场景操作步骤 二、日志基础关键字分级如下 三、场景日志如下: 一、场景操作步骤 操作步…...

SCAU期末笔记 - 数据分析与数据挖掘题库解析
这门怎么题库答案不全啊日 来简单学一下子来 一、选择题(可多选) 将原始数据进行集成、变换、维度规约、数值规约是在以下哪个步骤的任务?(C) A. 频繁模式挖掘 B.分类和预测 C.数据预处理 D.数据流挖掘 A. 频繁模式挖掘:专注于发现数据中…...

ESP32读取DHT11温湿度数据
芯片:ESP32 环境:Arduino 一、安装DHT11传感器库 红框的库,别安装错了 二、代码 注意,DATA口要连接在D15上 #include "DHT.h" // 包含DHT库#define DHTPIN 15 // 定义DHT11数据引脚连接到ESP32的GPIO15 #define D…...

2.Vue编写一个app
1.src中重要的组成 1.1main.ts // 引入createApp用于创建应用 import { createApp } from "vue"; // 引用App根组件 import App from ./App.vue;createApp(App).mount(#app)1.2 App.vue 其中要写三种标签 <template> <!--html--> </template>…...

React19源码系列之 事件插件系统
事件类别 事件类型 定义 文档 Event Event 接口表示在 EventTarget 上出现的事件。 Event - Web API | MDN UIEvent UIEvent 接口表示简单的用户界面事件。 UIEvent - Web API | MDN KeyboardEvent KeyboardEvent 对象描述了用户与键盘的交互。 KeyboardEvent - Web…...
反射获取方法和属性
Java反射获取方法 在Java中,反射(Reflection)是一种强大的机制,允许程序在运行时访问和操作类的内部属性和方法。通过反射,可以动态地创建对象、调用方法、改变属性值,这在很多Java框架中如Spring和Hiberna…...

ElasticSearch搜索引擎之倒排索引及其底层算法
文章目录 一、搜索引擎1、什么是搜索引擎?2、搜索引擎的分类3、常用的搜索引擎4、搜索引擎的特点二、倒排索引1、简介2、为什么倒排索引不用B+树1.创建时间长,文件大。2.其次,树深,IO次数可怕。3.索引可能会失效。4.精准度差。三. 倒排索引四、算法1、Term Index的算法2、 …...
鸿蒙中用HarmonyOS SDK应用服务 HarmonyOS5开发一个生活电费的缴纳和查询小程序
一、项目初始化与配置 1. 创建项目 ohpm init harmony/utility-payment-app 2. 配置权限 // module.json5 {"requestPermissions": [{"name": "ohos.permission.INTERNET"},{"name": "ohos.permission.GET_NETWORK_INFO"…...
【HTML-16】深入理解HTML中的块元素与行内元素
HTML元素根据其显示特性可以分为两大类:块元素(Block-level Elements)和行内元素(Inline Elements)。理解这两者的区别对于构建良好的网页布局至关重要。本文将全面解析这两种元素的特性、区别以及实际应用场景。 1. 块元素(Block-level Elements) 1.1 基本特性 …...
【C语言练习】080. 使用C语言实现简单的数据库操作
080. 使用C语言实现简单的数据库操作 080. 使用C语言实现简单的数据库操作使用原生APIODBC接口第三方库ORM框架文件模拟1. 安装SQLite2. 示例代码:使用SQLite创建数据库、表和插入数据3. 编译和运行4. 示例运行输出:5. 注意事项6. 总结080. 使用C语言实现简单的数据库操作 在…...