• 基于hutool实现国密SM2的加解密,简直不要太简单!



    程序员的公众号:源1024获取更多资料,无加密无套路!

    最近整理了一波电子书籍资料,包含《Effective Java中文版 第2版》《深入JAVA虚拟机》,《重构改善既有代码设计》,《MySQL高性能-第3版》,《Java并发编程实战》等等
    获取方式: 关注公众号并回复 电子书 领取,更多内容持续奉上


    SM2算法是中国国家密码局推出的一种基于椭圆曲线的非对称加密算法,是一种安全性高、运算速度快的非对称加密算法,适用于数字签名、密钥交换、密钥派生以及数据加密和解密等应用场景,相比于RSA算法,SM2具有以下特点和优势:

    1. SM2算法使用的是ECC 256位椭圆曲线,相对于RSA 2048位,它具有更高的安全强度。
    2. SM2算法的密钥长度较小,运算速度更快。
    3. 在相同密钥长度下,SM2算法比RSA算法具有更高的安全性。
    4. SM2算法在安全性和性能方面都具备优势。

    SM2算法的应用主要涵盖以下几个方面:

    1. 数字签名:SM2算法可以用于生成和验证数字签名,保证信息的完整性和真实性。
    2. 密钥交换:SM2算法可以用于在通信过程中安全地交换密钥,确保通信的机密性。
    3. 密钥派生:SM2算法可以用于从一个密钥派生出多个密钥,方便管理和使用。
    4. 加密和解密:SM2算法可以用于加密和解密敏感数据,保护数据的机密性。

    具体实现添加以下依赖

    1. <dependency>
    2. <groupId>cn.hutoolgroupId>
    3. <artifactId>hutool-allartifactId>
    4. <version>5.5.4version>
    5. dependency>
    6. <dependency>
    7. <groupId>org.bouncycastlegroupId>
    8. <artifactId>bcprov-jdk15onartifactId>
    9. <version>1.70version>
    10. dependency>

    Java示例代码如下

    1. /**
    2. * 生成公私钥
    3. */
    4. KeyPair pair = SecureUtil.generateKeyPair("SM2");
    5. byte[] prikey = pair.getPrivate().getEncoded();
    6. byte[] pubKey = pair.getPublic().getEncoded();
    7. //私钥
    8. String privateKey = bytesToBase64(prikey);
    9. //公钥
    10. String publicKey = bytesToBase64(pubKey);
    1. /**
    2. * 加密
    3. */
    4. SM2 sm2 = SmUtil.sm2(privateKey, publicKey);
    5. String encryptStr = sm2.encryptBcd("asdf", KeyType.PublicKey);
    6. System.out.println("加密后:" + encryptStr);
    7. /**
    8. * 解密
    9. */
    10. String decryptStr = StrUtil.utf8Str(sm2.decryptFromBcd(encryptStr, KeyType.PrivateKey));
    11. System.out.println("解密后:" + decryptStr);

     运行结果:

    1. 加密后:0407536A4A360FCBB07CF2A9687CE3130547EFBD4E95D825AE2A85EE8060FC9AEBEE7467142A86B91BF54B402E805D2CEDAC8104DE428DCFC2487586AAC110F8A3533BAAA3B7EA0D5F06BC3C80487C270D7E6E1F34C66E57487BBDED06A2B73BAAF9B50AA4
    2. 解密后:asdf

    如果是对接的一些三方系统,可能不会给私钥,只给到一个公钥,那就只用公钥加密,三方系统用对应的私钥解密即可。具体示例如下:

    1. /**
    2. * 只用公钥加密,只有对应的私钥才能解密成功
    3. */
    4. SM2 sm2 = SmUtil.sm2(null, publicKey);
    5. String encryptStr = sm2.encryptBcd("asdf", KeyType.PublicKey);
    6. System.out.println("加密后:" + encryptStr);

  • 相关阅读:
    ts声明文件
    基于springboot的药店管理系统
    【Apache Hudi】一种基于增量日志文件数的压缩策略
    CUDA编程基础:如何实现c++事实绘制曲线,采用的绘图工具箱是:gnuplot
    游戏中有n条龙,每条龙都有自身力量x及战胜它后的奖励力量 y,当你的力量超过龙时,才能打败龙和获得奖励力量。你可以自由选择挑战顺序,问最后你最多能打败多少条龙?
    剩余类环上可逆矩阵的计数
    ROS | 命名空间
    Java深入讲解static操作符
    Git项目管理快速入门,轻松易上手
    Java递归
  • 原文地址:https://blog.csdn.net/feikillyou/article/details/132878122