一、简介

国密即国家密码局认定的国产密码算法。常用的主要有SM2,SM3,SM4。

SM2:椭圆曲线公钥密码算法是我国自主设计的公钥密码算法,为非对称加密,基于ECC。该算法已公开。由于该算法基于ECC,故其签名速度与秘钥生成速度都快于RSA。

SM3:消息摘要。可以用MD5作为对比理解。该算法已公开。校验结果为256位。

SM4:对称加密,密钥长度和分组长度均为128位。

由于国际环境(与美国的关系),我们在加密领域也基本切换为国密算法。

在有些项目中,没有使用HTTPS的时候,登录的口令(用户名/密码),需要进行加密传输的需求,这时候我们就需要采用非对称加密来实现。

故: 前端采用公钥加密, 后端私钥解密。

经过多次的百度及代码验证,折腾,最终找好了合适的方案。

前端加密

前端加密js示例:

<!DOCTYPE html>
<html><head><meta http-equiv="X-UA-Compatible" content="chrome=1" /><meta name="description" content="JavaScript implementation of SM2 Algorithm Encryption and Decryption sample." /><!--<link rel="stylesheet" type="text/css" media="screen" href="stylesheets/stylesheet.css">--><title>SM2 Algorithm Encryption and Decryption sample</title><style>textarea {width: 100%;}</style><!-- for pkcs5pkey --><script src="sm2.js"></script><script language="JavaScript" type="text/javascript">/***  生成秘钥对*/function doGenerate() {var ec = new KJUR.crypto.ECDSA({"curve": 'sm2'});var keypair = ec.generateKeyPairHex();// 私钥:keypair.ecprvhex;// 公钥:keypair.ecpubhex;console.log(keypair)}function test(){/*** [SM2Encrypt description  加密数据]* @param {[type]} data       [待加密数据]* @param {[type]} publickey  [公钥 hex]* @param {[type]} cipherMode [加密模式 C1C3C2:1, C1C2C3:0]* @return {[type]}           [返回加密后的数据 hex]*/var cipherText = sm2Encrypt("我是妞见妞爱===", "04b96fb7504d7a0509745b80ae8079d5250119899e8620fe322ff47d3a3cbf7d17330ff6c8019b8c0cb06b4a881aef40240354dded8eef4b9c557c817cd7b3788d", 1);console.log("cipherText:",cipherText)/*** [SM2Decrypt sm2 解密数据]* @param {[type]} encrypted  [待解密数据 hex]* @param {[type]} privateKey [私钥 hex]* @param {[type]} cipherMode [加密模式 C1C3C2:1, C1C2C3:0]* @return {[type]}           [返回解密后的数据]*/var plainText = sm2Decrypt(cipherText,"0a7e399f15e1ca85a4112635589fedce85eb62298d7154788c24c3485a598138", 1)console.log("plainText:",plainText)}</script>
</head><body><!-- MAIN CONTENT -->
<div id="main_content_wrap" class="outer"><section class="inner"><hr size="1" /><h4>SM2 Certificate Encryption</h4><fieldset><legend>SM2证书加密</legend><ul><li><input type="button" value="测试,看控制台" onClick="doGenerate();" /></li><li><input type="button" value="加密、解密" onClick="test();" /></li></ul><div></div></fieldset></section>
</div>
</body></html>

后端加密

下面是我封装的工具类:

package com.topinfo.basic.platform.common.sm;import com.topinfo.basic.platform.common.sm.sm2.KeyVo;
import com.topinfo.basic.platform.common.sm.sm2.SM2EncDecUtils;
import com.topinfo.basic.platform.common.sm.sm2.SM2KeyVO;/*** @ClassName: Sm2Util* @Description: Sm2 加密工具类* @Author: 杨攀* @Date: 2020/12/10 16:47* @Copyright: 2020 www.tuxun.net Inc. All rights reserved.*/
public class TpSm2Util {/*** 生成非对称秘钥对* @author 杨攀* @date 2020/12/11 10:50* @param* @return com.topinfo.basic.platform.common.sm.sm2.KeyVo*/public static KeyVo generateKeyPair() {SM2KeyVO sm2KeyVO = SM2EncDecUtils.generateKeyPair();KeyVo vo = new KeyVo(sm2KeyVO.getPubHexInSoft(), sm2KeyVO.getPriHexInSoft());return vo;}/*** 加密* @author 杨攀* @date 2020/12/11 10:54* @param publicKeyHex 公钥* @param plainText 明文* @return java.lang.String*/public static String  encrypt(String publicKeyHex, String plainText) {String cipherText = SM2EncDecUtils.encrypt(publicKeyHex, plainText);return cipherText;}/*** 解密* @author 杨攀* @date 2020/12/11 10:56* @param privateKeyHex 私钥* @param cipherText 密文* @return java.lang.String*/public static String  decrypt(String privateKeyHex, String cipherText) {byte[] decryptData = SM2EncDecUtils.decrypt(privateKeyHex, cipherText);String  plainText = new String(decryptData);return plainText;}}

一开始,后端使用hutool的工具类, 发现hutool的key生成与前端JS的不同,使用的算法不一样,使用不得已在重现找了一个。

使用前需要依赖:

<!-- 国密算法bcprov-jdk15to18 hutool -->
<dependency><groupId>org.bouncycastle</groupId><artifactId>bcprov-jdk15to18</artifactId><version>1.66</version>
</dependency>

最后

最近我整理了整套《JAVA核心知识点总结》,说实话 ,作为一名Java程序员,不论你需不需要面试都应该好好看下这份资料。拿到手总是不亏的~我的不少粉丝也因此拿到腾讯字节快手等公司的Offer

Java进阶群

好了,以上就是本文的全部内容了,如果觉得有收获,记得三连,我们下期再见。

国密SM2的前端加密,后端解密(Java版本)及SM3 摘要加密相关推荐

  1. 前端使用国密sm2和sm4进行加解密

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

  2. 数据加密-国密SM2对数据进行加解密

    1 什么是SM2 RSA算法的危机在于其存在亚指数算法,对ECC算法而言一般没有亚指数攻击算法. SM2椭圆曲线公钥密码算法:我国自主知识产权的商用密码算法,是ECC(Elliptic Curve C ...

  3. 国密SM2前端加密,Java后台解密问题

    背景:要实现请求参数加密的功能,使用的是国密SM2算法,前端向后台发送请求获取公钥,将请求加密发送到后台,后台用对应的私钥进行解密 问题:前端进行加密的请求,后台无法进行解析 解决方案:(此处所用的类 ...

  4. 国密SM2算法(JS加密,C#、Java解密)

    常见的渗透测试会将网站登录时密码使用明文传输视为风险.推荐使用国密算法或者RSA算法对密码进行加密传输. RSA加密(JS加密,C#.Java解密)请参考<RSA对称加密(JS加密,C#.Jav ...

  5. 国密sm2 js加密后台解密,sm3 js、后台加密,sm4 后台加密

    公司最近进行安全问题修改,所以要用国密系列的sm2,sm3,sm4,这些加密都用在登录模块,因此作为菜鸟的我,从网上找了一堆资料,整理修改后形成符合项目的加密,需要的可以自己去查看相关代码和jar包: ...

  6. vue前端国密SM2, SM4 算法实现

    vue前端国密SM2, SM4 算法实现 整体加密逻辑是,首先生成16位key值 用SM2 公钥加密该key值,后端用sm2私钥 解密出key值,然后采用sm4方法根据key值对返回值进行加密,前端采 ...

  7. Spring Security-用户密码自定义国密SM2加密

    为什么80%的码农都做不了架构师?>>>    由于甲方要求需要把密码的加密方式改为国密SM2的方式,网上看了一些写的代码,结合了一下SpringSecurity用户自定义加密,直接 ...

  8. 使用 Python 脚本执行国密 sm2 加解密

    一.场景 工作中的一个场景:Go 需要对信息加解密,但是研究了 GmSSL Go API 文档之后,发现是依赖于 CGO 的,同事配了半天环境没配成功.于是换了一个方法,选择 Go 调 Python ...

  9. 国密SM2算法的只求理解不求甚解 (4/5)SM2算法加解密协议

    国密SM2算法的只求理解不求甚解 (1/5)前置数学知识:模运算 国密SM2算法的只求理解不求甚解 (2/5)前置数学知识:平面几何 国密SM2算法的只求理解不求甚解 (3/5)SM2算法数学模型 国 ...

最新文章

  1. 直播 | 256核CPU实现每秒一百万帧的Atari!强化学习并行模拟器EnvPool详解
  2. 【Android NDK 开发】NDK C/C++ 代码崩溃调试 - Tombstone 报错信息日志文件分析 ( 获取 tombstone_0X 崩溃日志信息 )
  3. 【转载】jQuery最佳实践
  4. CentOS6.X安装QQ2012
  5. 基于Matlab的跨孔CT胖射线追踪算法(五)
  6. 进程间通信 IPC、LPC、RPC
  7. origin使用指导。pdf_获取所有的最高法指导性案例并保存为pdf
  8. Linux上安装Hadoop集群(CentOS7+hadoop-2.8.3)
  9. 大数据 数据库 评测_大数据产品能力评测介绍.pdf
  10. java服装销售系统课程设计_毕业论文(设计)基于javaweb的服装销售管理系统的设计与实现.doc...
  11. 杭州银行面试题【杭州多测师】【杭州多测师_王sir】
  12. android 带箭头的框,带有工具提示箭头的Android PopupWindow
  13. jdbc,基本数据库命令封装
  14. xv6的sleep和wakeup
  15. 2020线上中国国际智能产业博览会区块链高峰论坛重庆举行
  16. android 截屏 简书,Android 内置应用截屏方法
  17. HDU 1560 DNA sequence(DNA序列)
  18. 学会记忆--学会遗忘
  19. TMS320C6678开发笔记---SRIO 启动
  20. Kewail:三种常用的邮件内容传送编码

热门文章

  1. 华为手机有线共享网络_华为怎么共享热点网络连接
  2. 狼疮性肾炎,这4个问题你需要知道
  3. consul的kv使用
  4. Flink实战(八十):flink-sql使用(七)Flink SQL Clien读取Kafka数据流式写入Hive(用hive 管理kafka元数据)
  5. 【自然语言处理】情感分析(一):基于 NLTK 的 Naive Bayes 实现
  6. 1024 科学计数法 (20分) c/c++代码中有详细解释
  7. 2022-2028年中国智慧燃气行业市场全景评估及投资前景规划报告
  8. 地大网上报账之日常报销流程
  9. Flink SQL 如何实现数据流的 Join?
  10. ARtrix HUD 工具箱 2021.9 版本发布