首页 > 其他分享 >从零玩转前后端加解密之SM2-sm2

从零玩转前后端加解密之SM2-sm2

时间:2023-05-19 12:12:03浏览次数:41  
标签:加解密 privateKey sm2 SM2 publicKey 算法 keypair

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);
    }

image-1661078949316

签名验签、获取椭圆曲线点
更多加密方式参考: 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'}) // 解密结果,输出数组

前端代码

image-1661080078970

页面查看

image-1661080196004

最终封装


/**
 * 前端加密
 * @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) // 加密结果
}

标签:加解密,privateKey,sm2,SM2,publicKey,算法,keypair
From: https://www.cnblogs.com/Yangbuyi/p/17414766.html

相关文章

  • 记一次解‘字符串加解密’算法
    题目:对输入的字符串进行加解密,并输出。加密方法为:当内容是英文字母时则用该英文字母的后一个字母替换,同时字母变换大小写,如字母a时则替换为B;字母Z时则替换为a;当内容是数字时则把该数字加1,如0替换1,1替换2,9替换0;其他字符不做变化。解密方法为加密的逆过程。数据范围:输入的......
  • 罗克韦尔Modbus-RTU通讯程序 硬件配置:1769-SM2 软件版本:Studi
    罗克韦尔Modbus-RTU通讯程序硬件配置:1769-SM2软件版本:Studio5000V32实现以下功能:RS485通讯MODBUS-RTU模式1:读取从站数据2:写入从站数据3:查看从站通讯成功失败状态4:查看从站通讯错误故障代码5:查看单周期和全周期时间单个端口支持32站点,3端口96站点。支持并发3端口最大512点......
  • C# 实现RSA加解密
    一、支付宝工具生成公钥私钥下载地址链接:https://pan.baidu.com/s/15L1GM8mK43tzV9XyyNEV8Q提取码:vux3使用方法可参考阿里文档:https://docs.open.alipay.com/291/105971/二、加密说明:1.使用公钥加密, 2.加密后每次结果是可变的三、解密说明:1.使用私钥解密四、实现代码利用工具......
  • 【实战】国密4(SM4)使用 .NET 和 Java 相互加解密
    需求:由于朋友项目上需要和第三方对接,数据在传输过程中使用国密4(SM4)算法进行了加密,需要双方对数据进行加密和解密操作,第三方使用的是Java开发的项目,朋友使用的是.NET开发的项目。SM4.0(原名SMS4.0)是中华人民共和国政府采用的一种分组密码标准,由国家密码管理局于2012年3月21日发......
  • 20 18 | 加解密服务平台:如何让敏感数据存储与传输更安全?
    你好,我是李智慧。在一个应用系统运行过程中,需要记录、传输很多数据,这些数据有的是非常敏感的,比如用户姓名、手机号码、密码、甚至信用卡号等等。这些数据如果直接存储在数据库,记录在日志中,或者在公网上传输的话,一旦发生数据泄露,不但可能会产生重大的经济损失,还可能会使公司陷入重......
  • 基于DNA序列的图像加解密算法仿真
    1.算法仿真效果matlab2022a仿真结果如下:    2.算法涉及理论知识概要       随着互联网和通信行业的快速发展,信息安全也越来越受关注,由此很多数据加密算法被提出,并被大量使用,例如AES算法,DES算法等,由于人在生活中所获得的信息大部分来自于视觉,图像就成为了人类......
  • [2core]加解密算法
    本文主要记录从.netframework迁移到.net6后,加解密算法的跨平台测试,如AES和RSA算法。因为RSA使用了BouncyCastle类库提供的实现,所以并没有遇到什么问题。完成加解密算法跨平台测试,迁移工作算是告一段,也标志着从.netframework迁移.net6工作完毕。迁移工作完毕,表示基于.netframewor......
  • 微信公众号消息加解密
    在微信公众号的使用过程中,为了提高信息传输的安全性,可以在服务器配置中将消息加解密模式指定为安全模式。启用安全模式后,公众号主动调用API的情况并不会受影响,只有被动回复用户的消息时才需要对消息进行加解密。官方提供了5种开发语言的示例代码,参照官方给的C++示例代码,本文给出......
  • SM2加解密工具
    创建秘钥对//生成随机秘钥对publicstaticSM2KeyPairVOgenerateKeyPair(){try{X9ECParameterssm2ECParameters=GMNamedCurves.getByName("sm2p256v1");ECDomainParametersdomainParameters=newECDomainParameters(sm2ECParameters.getCurve......
  • 慧荣SM2259XT固件,SM2259XT开卡软件教程,慧荣SM2259XT主控贴镁光B27A测试分享
    上回说到把mas0902开不了的两片镁光降级(AS)B27A贴上了as2258,确实能开,缓内速度也可以,但是吧,大家说的全盘模拟SLC并没发现,也就前4g速度快,缓外20M写入(当然这是颗粒的问题),这速度能用个啥,缓内数据再漂亮也不能在实际使用体现出来啊,这是典型的花架子。如果有大佬教教我AS2258如何开全盘模......