springboot使用国产加密算法方式,sm2和sm3加解密demo

 更新时间:2023年07月19日 09:49:29   作者:yy1209357299  
这篇文章主要介绍了springboot使用国产加密算法方式,sm2和sm3加解密demo,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

需求

前后端交互的加解密算法,要求使用国产的

1、SM1分组密码算法

SM1是由国家密码管理局编制的一种商用密码分组标准对称算法,分组长度和密钥长度均为128位,算法的安全保密强度及相关软硬件实现性能与AES算法相当,目前该算法尚未公开,仅以IP核的形式存在于芯片中,调用该算法时,需要通过加密芯片的接口进行调用。

2、*SM2公钥密码算法

SM2算法是国家密码据于2010年12月17日发布的国密标准椭圆曲线加密算法,是一种基于ECC算法的非对称加密算法,SM2椭圆曲线公钥密码算法是我国自主设计的公钥密码算法,包括SM2-1椭圆曲线数字签名算法,SM2-2椭圆曲线密钥交换协议,SM2-3椭圆曲线公钥加密算法,分别用于实现数字签名密钥协商和数据加密等功能。

SM2算法与RSA算法不同的是,SM2算法是基于椭圆曲线上点群离散对数难题,对于一般椭圆曲线的离散对数问题,目前只存在指数级计算复杂度的求解方法。

与大数分解问题及有限域上离散对数问题相比,椭圆曲线离散对数问题的求解难度要大得多。

因此,在相同安全程度要求下,椭圆曲线密码较其他公钥密码所需的秘钥规模要小得多。

相对于RSA算法,256位的SM2密码强度已经比2048位的RSA密码强度要高。

其加密强度为256位,密钥长度短,安全程度高,可用于数字签名、密钥交换、公钥加密。

3、*SM3密码杂凑算法

SM3是我国采用的一种密码散列函数标准,由国家密码管理局于2010年12月17日发布。

相关标准为“GM/T 0004-2012 《SM3密码杂凑算法》”。

据国家密码管理局表示,其安全性及效率与SHA-256相当,也叫密码杂凑算法,属于哈希(摘要)算法的一种,功能与MD5,SHA-1相同。

对长度小于264比特的消息m,经过填充、压缩,生成256位杂凑值,和SM2算法一起被公布,该算法位不可逆的算法。

在商用密码体系中,SM3主要用于数字签名及验证、消息认证码生成及验证、随机数生成等,可满足多种密码应用的安全需求,算法已公开。

4、*SM4分组密码算法

SM4是国家密码管理局发布的分组密码算法,于2012年3月正式公布。

与DES和AES算法类似,SM4是一种分组密码算法。其分组长度为128bit,密钥长度也为128bit。

SM4算法加/解密算法是对合运算,只是使用轮密钥相反,其中解密轮密钥是加密轮密钥的逆序。

加密算法与密钥扩展算法均采用32轮非线性迭代结构(Feistel),以字(32位)为单位进行加密运算,每一次迭代运算均为一轮变换函数F。

目前主要用于无线局域网产品。

方案

使用场景:前后端交互使用sm2,后端存储密码时使用sm3

1、pom依赖

<dependency>
     <groupId>org.bouncycastle</groupId>
     <artifactId>bcprov-jdk15on</artifactId>
     <version>1.60</version>
</dependency>

2、demo示例

public static void main(String[] args) throws InvalidCipherTextException {
        System.out.println("sm2测试开始-----------");
        X9ECParameters sm2EcParameters = GMNamedCurves.getByName("sm2p256v1");
        ECDomainParameters domainParameters = new ECDomainParameters(sm2EcParameters.getCurve(),sm2EcParameters.getG(),sm2EcParameters.getN());
        ECKeyPairGenerator keyPairGenerator =new ECKeyPairGenerator();
        try {
            keyPairGenerator.init(new ECKeyGenerationParameters(domainParameters, SecureRandom.getInstance("SHA1PRNG")));
            AsymmetricCipherKeyPair asymmetricCipherKeyPair = keyPairGenerator.generateKeyPair();
            //私钥
            BigInteger privateKey = ((ECPrivateKeyParameters) asymmetricCipherKeyPair.getPrivate()).getD();
            String privateKeyHex = privateKey.toString(16);
            System.out.println("私钥:" + privateKeyHex);
            //公钥
            ECPoint ecPoint = ((ECPublicKeyParameters) asymmetricCipherKeyPair.getPublic()).getQ();
            String publicKeyHex = Hex.toHexString(ecPoint.getEncoded(false));
            System.out.println("公钥:" + publicKeyHex);
            String str = SM2Util.encrypt("test",publicKeyHex);
            System.out.println("加密结果:"+str);
            try{
                String res = SM2Util.decrypt(str,privateKeyHex);
                System.out.println("解密结果:"+res);
            }catch (Exception e){
                e.printStackTrace();
            }
            System.out.println("sm2测试结束-----------");
            System.out.println("sm3测试开始-----------");
            String sm3 = SM3Util.sm3Sign("test");
            System.out.println("sm3加密结果"+sm3);
            if(SM3Util.sm3Verify("test",sm3)){
                System.out.println("sm3验证成功");
            }else {
                System.out.println("sm3验证失败");
            }
        } catch (NoSuchAlgorithmException e) {
            e.printStackTrace();
        }
    }

3、结果

sm2测试开始-----------
私钥:bdda9f26ae5884e3f5410902aec78cab6c3f4a7c9d9578e6a9c60ae977d6d645
公钥:041870142d71f518ce9bd6458b4b41b4d49e7fbfd9a14440eb49ed9bbb352e72739d2e2369722ba381db2a7add5093c7a976df49496cb5c08a56e87db877f4e866
加密结果:0445fd5bce247f30cd507314830f57d3278dfdfab3e8fdc6acb93c60a3a4b6bbc09150c065153389d7b0c3581a0a0fd5c3ffe59ed53855a289a98ce9705a5230b752aa8535980ba08db6319eef0f3c1140ccd3d0849f0c78a4478189c1736de07b27254794929c9de9
解密结果:test
sm2测试结束-----------
sm3测试开始-----------
sm3加密结果55e12e91650d2fec56ec74e1d3e4ddbfce2ef3a65890c2a19ecf88a307e76a23
sm3验证成功

4、前端加密

const sm2 = require('sm-crypto').sm2
const cipherMode = 0 // 1 - C1C3C2,0 - C1C2C3,默认为1,这里用0

加密

let base = Base64.encode(msgString);
let encryptData = sm2.doEncrypt(base, publicKey, cipherMode) // 加密结果
conso.log("加密结果:",encryptData);

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • SpringBoot详解Banner的使用

    SpringBoot详解Banner的使用

    这篇文章主要介绍了超个性修改SpringBoot项目的启动banner的方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-07-07
  • Java并发 线程间的等待与通知

    Java并发 线程间的等待与通知

    这篇文章主要介绍了Java并发 线程间的等待与通知,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-10-10
  • java使用正则表达为数字添加千位符的简单方法

    java使用正则表达为数字添加千位符的简单方法

    这篇文章主要介绍了java使用正则表达为数字添加千位符的简单方法,需要的朋友可以参考下
    2014-04-04
  • spring中的ObjectPostProcessor详解

    spring中的ObjectPostProcessor详解

    这篇文章主要介绍了spring中的ObjectPostProcessor详解,Spring Security 的 Java 配置不会公开其配置的每个对象的每个属性,这简化了大多数用户的配置,毕竟,如果每个属性都公开,用户可以使用标准 bean 配置,需要的朋友可以参考下
    2024-01-01
  • springboot拦截器Interceptor的使用,你都了解吗

    springboot拦截器Interceptor的使用,你都了解吗

    springmvc 中的拦截器可以对请求进行判别,在请求到达控制器之前,把非法的请求给拦截掉下面来说一说, 它在springboot中的使用,感兴趣的朋友一起看看吧
    2021-07-07
  • 在IntelliJ IDEA中配置SSH服务器开发环境并实现固定地址远程连接的操作方法

    在IntelliJ IDEA中配置SSH服务器开发环境并实现固定地址远程连接的操作方法

    本文主要介绍如何在IDEA中设置远程连接服务器开发环境,并结合Cpolar内网穿透工具实现无公网远程连接,然后实现远程Linux环境进行开发,本例使用的是IDEA2023.2.5版本,感兴趣的朋友跟随小编一起看看吧
    2024-01-01
  • Springboot配置security basic path无效解决方案

    Springboot配置security basic path无效解决方案

    这篇文章主要介绍了Springboot配置security basic path无效解决方案,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-09-09
  • java中String、StringBuffer与StringBuilder的区别

    java中String、StringBuffer与StringBuilder的区别

    这篇文章主要介绍了java 中String和StringBuffer与StringBuilder的区别,在开发过程中经常会用到String这个类进行操作。需要的朋友可以收藏下,方便下次浏览观看
    2021-12-12
  • Java上传文件错误java.lang.NoSuchMethodException的解决办法

    Java上传文件错误java.lang.NoSuchMethodException的解决办法

    今天小编就为大家分享一篇关于Java上传文件错误java.lang.NoSuchMethodException的解决办法,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2019-01-01
  • 打开.properties中文显示unicode编码问题以及解决

    打开.properties中文显示unicode编码问题以及解决

    这篇文章主要介绍了打开.properties中文显示unicode编码问题以及解决方案,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-01-01

最新评论