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.Testpublic 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.Testpublic 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. AES和RSA前后端加解密

    先了解AES和RSA加密算法 AES算法 1.运算速度快,在有反馈模式.无反馈模式的软硬件中,Rijndael都表现出非常好的性能. 2.对内存的需求非常低,适合于受限环境. 3.Rijndael 是 ...

  2. Base64 混淆加密+迭代次数,Base64前后端加解密不一致、Base64 js加解密结果与java加解密结果不一致,Base64中文加密乱码

    Table of Contents 概述 一.js加密,java解密 1.js加密 1.中文字符串加密 2.英文等字符串加密 3.中文字符串混淆.迭代加密 4.英文等字符串混淆.迭代加密 5.JSON ...

  3. 程序猿成长之路番外篇之前后端加解密(rsa+aes混合加解密算法)

    今年国庆前夕接手一个外部项目,说是要保障接口数据安全,数据安全相对容易些,接口安全嘛emmmmm, 这个要考虑加解密算法.白名单之类的问题了.于是打算今天搞一期接口安全为题的成长之路番外篇. 为什么要 ...

  4. Vue前端和Java后端 联调使用AES 前后端加密解密

    Vue前端和Java后端 联调使用AES 前后端加密解密 最近在项目中需要针对重要数据进行加密传输,在网上找了一大推加密方式 最终采用AES 加密 Java端 package com.zk.web.u ...

  5. 前端国密加解密使用方法SM2、SM3、SM4

    国密算法,即国家商用密码算法.是由国家密码管理局认定和公布的密码算法标准及其应用规范,其中部分密码算法已经成为国际标准.如SM系列密码,SM代表商密,即商业密码,是指用于商业的.不涉及国家秘密的密码技 ...

  6. AES前后端加密解密

    AES前后端加密 关于AES-来自百度百科 后端代码 前端代码 关于AES-来自百度百科 高级加密标准(英语:Advanced Encryption Standard,缩写:AES),在密码学中又称R ...

  7. 前后端加密解密 【JS加密模块(md5 、 crypto 、 crypto-js、jsencrypt) python RSA加密解密(pycryptodome )模块安装与使用】

    JS加密模块[js-md5(AES) . crypto (AES). crypto-js().jsencrypt(非对称加密.RSA)] 一.安装 npm install js-md5 npm ins ...

  8. 【Java加解密系列】- SM2生成密钥

    国密算法是国家密码局制定标准的一系列算法,包括SM1.SM2.SM3.SM4等.其中,SM1是采用硬件实现的,不予讨论:SM2是非对称加密算法:SM3是摘要算法:SM4是对称加密算法.本系列博客将讲解 ...

  9. java代码生成密钥库_【Java加解密系列】- SM2生成密钥

    国密算法是国家密码局制定标准的一系列算法,包括SM1.SM2.SM3.SM4等.其中,SM1是采用硬件实现的,不予讨论:SM2是非对称加密算法:SM3是摘要算法:SM4是对称加密算法.本系列文章将讲解 ...

最新文章

  1. 《剑指offer》-- 调整数组顺序使奇数位于偶数前面、顺时针打印矩阵、数字在排序数组中出现的次数
  2. OpenCASCADE:拓扑 API之对象修改
  3. C++ 学习笔记之——输入和输出
  4. 任意模数NTT(MTT)
  5. 电脑入门完全自学手册_「新书推荐」新能源汽车维修完全自学手册
  6. 2018 年“浪潮杯”山东省 ACM 省赛总结
  7. 网络流 小结(更新时间2015/8/8)更新中
  8. 全员5G!iPhone 12系列终于来了:没有阉割,售价依旧5499元起!
  9. MFC小笔记:滑动条与编辑框
  10. JDK8之后的 接口的新特性:
  11. 一个新的自己从2009年的第一天...
  12. ListView.setOnItemClickListener 点击无效
  13. 的列数 获取mysql_阿里面试:MySQL如何设计索引更高效?
  14. 38. 遵循按照值传递的原则来设计函数子类
  15. 计算机图形学(一)——数据压缩:道格拉斯普克法
  16. 兄弟连新版PHP视频教程(共346讲)
  17. 微信小程序开发工具报错对应的服务器证书无效
  18. 如何快速制作Gif动图
  19. 怎样把CAD图纸的背景颜色修改成白色?
  20. 树莓派使用摄像头——fswebcam

热门文章

  1. 想知道好用的录音机软件有哪些?给你推荐这些录声音的软件
  2. Google OR-Tools(二) 线性优化Linear Optimization
  3. 【项目杂记】实现文章、评论、回复点赞及防刷赞
  4. AI产品推荐_Replika(聊天机器人App)
  5. 硬纪元AI峰会实录|暴风集团副总裁王刚:让虚拟人代替你去做很多事
  6. 帮忙配过/提过建议的台机配置单
  7. 证明英雄联盟石头人大招半价200码
  8. 【C 高阶】系列导航
  9. ios markdown 解析_Markdown 使用手册
  10. 15天日出千刀!新品推广实战技巧全解析