title: 从零玩转前后端加解密之SM2
date: 2022-08-21 19:42:00.907
updated: 2023-03-30 13:28:48.866
url: https://www.yby6.com/archives/sm2
categories:
- 加密算法
- 从零玩转系列
tags:
- 加密算法
- sm2

前言

SM2是国家密码管理局于2010年12月17日发布的椭圆曲线公钥密码算法。

SM2算法和RSA算法都是公钥密码算法,SM2算法是一种更先进安全的算法,在我们国家商用密码体系中被用来替换RSA算法。

随着密码技术和计算机技术的发展,目前常用的1024位RSA算法面临严重的安全威胁,我们国家密码管理部门经过研究,决定采用SM2椭圆曲线算法替换RSA算法。

SM2算法和RSA算法比较

SM2性能更优更安全:密码复杂度高、处理速度快、机器性能消耗更小

详细参考: https://www.ecaa.org.cn/667.html

SM2 RSA
算法结构 基本椭圆曲线(ECC) 基于特殊的可逆模幂运算
计算复杂度 完全指数级 亚指数级
存储空间 192-256bit 2048-4096bit
秘钥生成速度 较RSA算法快百倍以上
解密加密速度 较快 一般
加密长度限制 117

后端代码实现

添加 sm2 依赖

<dependency>
<groupId>com.antherd</groupId>
<artifactId>sm-crypto</artifactId>
<version>0.3.2</version>
</dependency>

获取密钥对


@org.junit.Test
public void generateKeyPairHex (){
// 生成出来的密钥可无缝衔接 前端 js 加解密
Keypair keypair = Sm2.generateKeyPairHex();
String privateKey = keypair.getPrivateKey(); // 公钥
String publicKey = keypair.getPublicKey(); // 私钥 System.out.println(privateKey);
System.out.println(publicKey); System.out.println("========================");
} @org.junit.Test
public void t2 () {
Keypair keypair = Sm2.generateKeyPairHex();
String privateKey = keypair.getPrivateKey(); // 公钥
String publicKey = keypair.getPublicKey(); // 私钥
System.out.println(privateKey);
System.out.println(publicKey);
System.out.println("========================");
// cipherMode 1 - C1C3C2,0 - C1C2C3,默认为1
// 使用公钥加密
final String doEncrypt = Sm2.doEncrypt("https://yby6.com,https://yangbuyi.top", publicKey);
System.out.println("加密: \n" + doEncrypt);
// 私钥解密
final String s = Sm2.doDecrypt(doEncrypt, privateKey);
System.out.println("解密:\n" + s);
}

签名验签、获取椭圆曲线点

更多加密方式参考: https://github.com/JuneAndGreen/sm-crypto#readme

前端代码实现 - vue

安装依赖

npm install --save sm-crypto

获取密钥对

const sm2 = require('sm-crypto').sm2
let keypair = sm2.generateKeyPairHex()
publicKey = keypair.publicKey // 公钥
privateKey = keypair.privateKey // 私钥 // 自定义随机数,参数会直接透传给 jsbn 库的 BigInteger 构造器
// 注意:开发者使用自定义随机数,需要自行确保传入的随机数符合密码学安全
let keypair2 = sm2.generateKeyPairHex('123123123123123')
let keypair3 = sm2.generateKeyPairHex(256, SecureRandom)
let verifyResult = sm2.verifyPublicKey(publicKey) // 验证公钥

加密解密


// 这里使用Java生成的密钥
// 后端生成密钥
const privateKey = 'a7a9846bbb015f8192bae355be4013d7b7b2bdcf56033b990d58bb5a7541f518'
const publicKey = '048ff6380b4db5c9fc9d80fc5e30bde049c12222c56b9085aa1f1c0b53cabd09e72dc5690110e5b57fc3ff88111d0d161723bcb6365c33cef70d3dbbdf32c7038f' const sm2 = require('sm-crypto').sm2
const cipherMode = 1 // 1 - C1C3C2,0 - C1C2C3,默认为1
let encryptData = sm2.doEncrypt(msgString, publicKey, cipherMode) // 加密结果
let decryptData = sm2.doDecrypt(encryptData, privateKey, cipherMode) // 解密结果
// 指定输出类型
// encryptData = sm2.doEncrypt(msgArray, publicKey, cipherMode) // 加密结果,输入数组
// decryptData = sm2.doDecrypt(encryptData, privateKey, cipherMode, {output: 'array'}) // 解密结果,输出数组

前端代码

页面查看

最终封装


/**
* 前端加密
* @param text
* @returns {*}
*/
export function encrypt(text) {
return sm2.doEncrypt(text, publicKey, 1) // 加密结果
} /**
* 前端解密
* @param text
* @returns {*}
*/
export function decrypt(text) {
return sm2.doDecrypt(text, privateKey, 1) // 加密结果
}

从零玩转前后端加解密之SM2-sm2的更多相关文章

  1. 谈谈《Dotnet core结合jquery的前后端加密解密密码密文传输的实现》一文中后端解密失败的原因

    详情请看<Dotnet core结合jquery的前后端加密解密密码密文传输的实现>,正常来讲,这个博客里面的代码是没有问题的,但是我有时候却会直接报错,原因是后台解密失败:Interna ...

  2. 微信小程序aes前后端加密解密交互

    aes前后端加密解密交互 小程序端 1. 首先引入aes.js /** * [description] CryptoJS v3.1.2 * [description] zhuangzhudada so ...

  3. 结合jquery的前后端加密解密 适用于WebApi的SQL注入过滤器 Web.config中customErrors异常信息配置 ife2018 零基础学院 day 4 ife2018 零基础学院 day 3 ife 零基础学院 day 2 ife 零基础学院 day 1 - 我为什么想学前端

    在一个正常的项目中,登录注册的密码是密文传输到后台服务端的,也就是说,首先前端js对密码做处理,随后再传递到服务端,服务端解密再加密传出到数据库里面.Dotnet已经提供了RSA算法的加解密类库,我们 ...

  4. Dotnet core结合jquery的前后端加密解密密码密文传输的实现

    在一个正常的项目中,登录注册的密码是密文传输到后台服务端的,也就是说,首先前端js对密码做处理,随后再传递到服务端,服务端解密再加密传出到数据库里面.Dotnet已经提供了RSA算法的加解密类库,我们 ...

  5. 16: vue + crypto-js + python前后端加密解密

    1.1 vue中使用crypto-js进行AES加密解密    参考博客:https://www.cnblogs.com/qixidi/p/10137935.html 1.初始化vue项目 vue i ...

  6. Sentry(v20.12.1) K8S 云原生架构探索,玩转前/后端监控与事件日志大数据分析,高性能+高可用+可扩展+可伸缩集群部署

    Sentry 算是目前开源界集错误监控,日志打点上报,事件数据实时分析最好用的软件了,没有之一.将它部署到 Kubernetes,再搭配它本身自带的利用 Clickhouse (大数据实时分析引擎)构 ...

  7. 学习加密(四)spring boot 使用RSA+AES混合加密,前后端传递参数加解密

      学习加密(四)spring boot 使用RSA+AES混合加密,前后端传递参数加解密 技术标签: RSA  AES  RSA AES  混合加密  整合   前言:   为了提高安全性采用了RS ...

  8. 前后端API交互数据加密——AES与RSA混合加密完整实例

    前言 前段时间看到一篇文章讲如何保证API调用时数据的安全性(传送门:https://blog.csdn.net/ityouknow/article/details/80603617),文中讲到利用R ...

  9. 前后端登录注册之node剖析与token的使用状态

    登录模块功能详解 1.用户名密码的格式验证 由前端完成,根据需求自行决定,不加叙述 2.点击提交按钮思路详解 前端将用户名 以及加密后的密码还有验证码输入的内容统一发给后端  由后端和数据库的数据进行 ...

  10. 前后端API交互数据加密——AES与RSA混合加密完整实例(转载)

    前言 前段时间看到一篇文章讲如何保证API调用时数据的安全性(传送门:https://blog.csdn.net/ityouknow/article/details/80603617),文中讲到利用R ...

随机推荐

  1. SQL Server关于AlwaysOn的理解-读写分离的误区(一)

    前言 很多人认为AlwaysOn在同步提交模式下数据是实时同步的,也就是说在主副本写入数据后可以在辅助副本立即查询到.因此期望实现一个彻底的读写分离策略,即所有的写语句在主副本上,所有的只读语句分离到 ...

  2. 深入理解 python 虚拟机:生成器停止背后的魔法

    深入理解 python 虚拟机:生成器停止背后的魔法 在本篇文章当中主要给大家介绍 Python 当中生成器的实现原理,尤其是生成器是如何能够被停止执行,而且还能够被恢复的,这是一个非常让人疑惑的地方 ...

  3. Dubbo3应用开发—Dubbo3注册中心(zookeeper、nacos、consul)的使用

    Dubbo3注册中心的使用 zookeeper注册中心的使用 依赖引入 <dependency> <groupId>org.apache.dubbo</groupId&g ...

  4. win10系统单独编译和使用WebRTC的回声消除(AEC)、音频增益(AGC)、去噪(NS)模块

    一.简介 本人想单独编译并使用WebRTC的音频回声消除模块,奈何技术有限,于是在百度的海洋里大海捞针,发现了https://www.cnblogs.com/mod109/p/5827918.html ...

  5. idea中常用的快捷键

    IntelliJ IDEA 常用快捷键 一.Ctrl 快捷键 Ctrl + F 在当前文件进行文本查找 (必备) Ctrl + R 在当前文件进行文本替换 (必备) Ctrl + Z 撤销 (必备) ...

  6. CSS之3D翻转效果

    <!DOCTYPE html> <html> <head> <title></title> <style type="tex ...

  7. OA、CRM、SCM、ERP之间的区别和联系是什么?

    当然,各个系统之间要集成.集成之后的东西,不叫做ERP.做ERP的人说叫ERP,做PLM的人说叫PLM,卖OA的人更愿意叫OA.其实,那个集成之后的东西,啥也不叫.   英文名 中文名 百科释义 关注 ...

  8. Velocity之Hello World(tomcat下配置Velocity)

    本文主要参考:http://hi.baidu.com/dalianjingying/item/1fb3a98ad64dcac299255f72 http://wangbaoaiboy.blog.163 ...

  9. .NET的各种对象在内存中如何布局[博文汇总]

    在过去一段时间里,我陆陆续续写一些关于.NET对象类型布局的文章,其中包括值类型和引用类型的内存布局.字符串对象和数组的内存布局等,这里作一个简单的汇总. [1] 如何计算一个实例占用多少内存? 我们 ...

  10. Excel 使用 VLOOKUP 函数匹配特定列

    前言 工作有一项内容,是根据新的表格的某一列的内容一对一匹配,生成一列新的表格.这就用到了 Excel 的 VLOOKUP 函数. 函数使用 函数体: =VLOOKUP(lookup_value,ta ...