1、需要依赖:

 <dependency><groupId>org.bouncycastle</groupId><artifactId>bcprov-jdk15on</artifactId><version>1.66</version></dependency><dependency><groupId>cn.hutool</groupId><artifactId>hutool-all</artifactId><version>5.4.1</version></dependency>

2、工具类

package com.wlhy.utils;import org.bouncycastle.jce.provider.BouncyCastleProvider;
import org.bouncycastle.pqc.math.linearalgebra.ByteUtils;import javax.crypto.Cipher;
import javax.crypto.spec.SecretKeySpec;
import java.security.Key;
import java.security.Security;
import java.util.Arrays;public class Sm4Util {static {Security.addProvider(new BouncyCastleProvider());}private static final String ENCODING = "UTF-8";public static final String ALGORITHM_NAME = "SM4";// PKCS5Padding  NoPadding 补位规则,PKCS5Padding缺位补0,NoPadding不补public static final String ALGORITHM_NAME_ECB_PADDING = "SM4/ECB/PKCS5Padding";/*** ECB加密模式,无向量* @explain ECB* @param algorithmName* @param mode* @param key* @return* @throws Exception*/private static Cipher generateEcbCipher(String algorithmName, int mode, byte[] key) throws Exception {Cipher cipher = Cipher.getInstance(algorithmName, BouncyCastleProvider.PROVIDER_NAME);Key sm4Key = new SecretKeySpec(key, ALGORITHM_NAME);cipher.init(mode, sm4Key);return cipher;}/*** sm4加密* @explain 加密模式:ECB 密文长度不固定,会随着被加密字符串长度的变化而变化* @param hexKey 16进制密钥(忽略大小写)* @param paramStr 待加密字符串* @return 返回16进制的加密字符串* @throws Exception*/public static String encryptEcb(String hexKey, String paramStr) throws Exception {String cipherText = "";// 16进制字符串-->byte[]byte[] keyData = ByteUtils.fromHexString(hexKey);// String-->byte[]//当加密数据为16进制字符串时使用这行
//          byte[] srcData = ByteUtils.fromHexString(hexKey);byte[] srcData = paramStr.getBytes(ENCODING);// 加密后的数组byte[] cipherArray = encrypt_Ecb_Padding(keyData, srcData);// byte[]-->hexStringcipherText = ByteUtils.toHexString(cipherArray);return cipherText;}/*** 加密模式之Ecb* @param key* @param data* @return* @throws Exception*/public static byte[] encrypt_Ecb_Padding(byte[] key, byte[] data) throws Exception {Cipher cipher = generateEcbCipher(ALGORITHM_NAME_ECB_PADDING, Cipher.ENCRYPT_MODE, key);//声称Ecb暗号,通过第二个参数判断加密还是解密return cipher.doFinal(data);}//解密****************************************/*** sm4解密* @explain 解密模式:采用ECB* @param hexKey 16进制密钥* @param cipherText 16进制的加密字符串(忽略大小写)* @return 解密后的字符串* @throws Exception*/public static String decryptEcb(String hexKey, String cipherText) throws Exception {// 用于接收解密后的字符串String decryptStr = "";// hexString-->byte[]byte[] keyData = ByteUtils.fromHexString(hexKey);// hexString-->byte[]byte[] cipherData = ByteUtils.fromHexString(cipherText);// 解密byte[] srcData = decrypt_Ecb_Padding(keyData, cipherData);// byte[]-->StringdecryptStr = new String(srcData, ENCODING);return decryptStr;}/*** 解密* @explain* @param key* @param cipherText* @return* @throws Exception*/public static byte[] decrypt_Ecb_Padding(byte[] key, byte[] cipherText) throws Exception {Cipher cipher = generateEcbCipher(ALGORITHM_NAME_ECB_PADDING, Cipher.DECRYPT_MODE, key);//生成Ecb暗号,通过第二个参数判断加密还是解密return cipher.doFinal(cipherText);}public static boolean verifyEcb(String hexKey, String cipherText, String paramStr) throws Exception {// 用于接收校验结果boolean flag = false;// hexString-->byte[]byte[] keyData = ByteUtils.fromHexString(hexKey);// 将16进制字符串转换成数组byte[] cipherData = ByteUtils.fromHexString(cipherText);// 解密byte[] decryptData = decrypt_Ecb_Padding(keyData, cipherData);// 将原字符串转换成byte[]byte[] srcData = paramStr.getBytes(ENCODING);// 判断2个数组是否一致flag = Arrays.equals(decryptData, srcData);return flag;}public static void main(String[] args) {try {System.out.println("开始****************************");String json = "xxxxxx";System.out.println("加密前:"+json);//自定义的32位16进制秘钥String key = "76747161590C11EA8FBA40167E2083BB ";String cipher = encryptEcb(key,json);//sm4加密System.out.println("加密后:"+cipher);System.out.println("校验:"+verifyEcb(key,cipher,json));//校验加密前后是否为同一数据cipher = "jiami";json =decryptEcb(key,cipher);//解密System.out.println("解密后:"+json);System.out.println("结束****************************");} catch (Exception e) {e.printStackTrace();}}}

关于 SM4 加秘密解密的工具类 (转载)相关推荐

  1. java配置文件工具类,java项目加载配置文件的工具类

    java项目加载配置文件的工具类 package com.loadproperties; import java.io.IOException; import java.io.InputStream; ...

  2. ECCDSA加签验签工具类, base64编码

    对传入参数, 按照key首字母降序排序 json序列化后, 进行 sha256 加密, 结果使用base64编码获取hash hash进行ECCDSA加密 package cn.box365.ipfs ...

  3. Android RSA加密解密的 工具类的使用

    RSA 比较特殊,我们首先要生成私钥和公钥,然后在加密的时候,使用私钥加密,在解密的时候使用公钥解密. //RSA 的初始化,获得私钥和密钥public void rsaInit(){try {Key ...

  4. java图片加水印上传工具类_基于Spring Boot实现图片上传/加水印一把梭操作

    文章共537字,阅读大约需要 2分钟 ! 概述 很多网站的图片为了版权考虑都加有水印,尤其是那些图片类网站.自己正好最近和图片打交道比较多,因此就探索了一番基于 Spring Boot这把利器来实现从 ...

  5. java日期工具类(转载)

    import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Calendar; impor ...

  6. jsqlparser解析SQL工具类(转载)

    JSQLParser官网地址:http://jsqlparser.sourceforge.net/ JSQLParserGitHub地址:https://github.com/JSQLParser/J ...

  7. RSA公私钥加解密方式-工具类

    直接上代码 ​ import java.io.ByteArrayOutputStream; import java.math.BigInteger; import java.security.*; i ...

  8. ContactsUtil 工具类 - 转载

    import java.util.HashMap; import java.util.Map; //http://www.open-open.com/code/view/1432300986802 / ...

  9. Java与Winform进行AES加解密数据传输的工具类与对应关系和示例

    场景 Android+Java中使用Aes对称加密的工具类与使用: Android+Java中使用Aes对称加密的工具类与使用_霸道流氓气质的博客-CSDN博客 上面讲的Java与安卓进行数据传输时使 ...

最新文章

  1. 8亿参数,刷新ImageNet纪录:何恺明团队开源最强ResNeXt预训练模型
  2. Mysql将日期转为字符串
  3. 程序员的灯下黑:能认识自己吗?
  4. Kaggle比赛源代码和讨论的收集整理
  5. 10深入理解C指针之---指针运算和比较
  6. ThinkPHP3.2 实现阿里云OSS上传文件
  7. 组装电脑教程(转载)
  8. 如何将数字转换成口语中的文本串
  9. MacOS 12.0.X系统提示“未能装载磁盘映像,错误代码为109”的临时解决方法
  10. servlet,session对象的生命周期
  11. android 调用 asp.net web api,从 .NET 客户端调用 Web API (C#)
  12. mercurial使用_DBA对Mercurial的介绍–什么时候以及为什么我们应该使用版本控制
  13. 最安全的php加密,安全性 - 使用PHP进行最简单的双向加密
  14. H264 YUV420视频翻转
  15. 修改IDEA缓存文件路径
  16. hdu 4484 Hailstone HOTPO
  17. 二、PHP基础学习之常用命令①
  18. RSA key fingerprint is....Permission denied (publickey).需要SSH Key
  19. 大头儿子小头爸爸计算机音乐,幼儿园大班音乐教案:《大头儿子小头爸爸》插曲...
  20. Zotero——一款文献管理工具

热门文章

  1. C语言学习日志 day1
  2. Mac通过bootcamp安装win10后设置触摸板滑动方向
  3. 大学自我测试成绩的软件,2021输入分数预测大学软件-在线估分选大学app
  4. 分享下个人一直以来整理维护的C++/Qt开发用到的控件库
  5. function name should be lowercase
  6. 路由器发展编年史 发展篇
  7. 安裝 Installation of Torch7, Cuda, Cudnn, Nvidia Driver with GTX1070
  8. 基于YOLOv7的芯片表面缺陷检测系统(源码&教程)
  9. python检测端口是否被占用_怎么查看端口占用情况
  10. 工作交接checklist