当前位置: 首页 > news >正文

sm4 加解密算法工具类( Java 版 )

sm4 加解密算法工具类(java)
说明:密钥是 hexString

import java.security.Key;
import java.security.Security;
import javax.crypto.Cipher;
import javax.crypto.spec.SecretKeySpec;import cn.hutool.core.codec.Base64Decoder;
import cn.hutool.core.codec.Base64Encoder;
import org.bouncycastle.jce.provider.BouncyCastleProvider;
import org.bouncycastle.pqc.math.linearalgebra.ByteUtils;/*** sm4 加解密算法工具类*/
public class Sm4Util {private static final String ENCODING = "UTF-8";private static final String ALGORITHM_NAME = "SM4";private static final String ALGORITHM_NAME_ECB_PADDING = "SM4/ECB/PKCS5Padding";private static final int DEFAULT_KEY_SIZE = 128;static {Security.addProvider(new BouncyCastleProvider());}public static void main(String[] args) throws Exception {}/*** sm4加密** @param data   待加密字符串* @param hexKey 16进制密钥(忽略大小写)* @return base64的字符串* @throws Exception*/public static String encryptEcb(String data, String hexKey) throws Exception {if (data == null  || hexKey == null ) {return null;}byte[] keyData = ByteUtils.fromHexString(hexKey);byte[] srcData = data.getBytes(ENCODING);Cipher cipher = generateEcbCipher(ALGORITHM_NAME_ECB_PADDING, Cipher.ENCRYPT_MODE, keyData);byte[] cipherArray = cipher.doFinal(srcData);//        String cipherText = ByteUtils.toHexString(cipherArray); // byte[] to hex StringString cipherText = Base64Encoder.encode(cipherArray); // byte[] to base64return cipherText;//}/*** sm4解密* @param cipherText 16进制的加密字符串(忽略大小写)* @param hexKey     16进制密钥* @return 解密后的字符串* @throws Exception*/public static String decryptEcb(String cipherText, String hexKey) throws Exception {if (cipherText == null || hexKey == null ) {return null;}// hexString --> byte[]byte[] keyData = ByteUtils.fromHexString(hexKey);byte[] cipherData = Base64Decoder.decode(cipherText);// 解密Cipher cipher = generateEcbCipher(ALGORITHM_NAME_ECB_PADDING, Cipher.DECRYPT_MODE, keyData);byte[] srcData = cipher.doFinal(cipherData);// byte[] --> StringString decryptStr = new String(srcData, ENCODING);return decryptStr;}/*** get Cipher** @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;}}

依赖库

<dependency><groupId>cn.hutool</groupId><artifactId>hutool-all</artifactId><version>5.8.16</version>
</dependency><dependency><groupId>org.bouncycastle</groupId><artifactId>bcprov-jdk15on</artifactId><version>1.54</version>
</dependency>
http://www.lryc.cn/news/145038.html

相关文章:

  • Redis项目实战——商户查询缓存
  • 重磅OpenAI发布ChatGPT企业版本
  • # Go学习-Day7
  • uniapp-form表单
  • 漏洞挖掘-利用
  • React钩子函数之useDeferredValue的基本使用
  • lodash常用方法
  • QByteArray与结构体之间相互转换
  • npm如何安装淘宝镜像
  • 从项目中突显技能:在面试中讲述你的编程故事
  • python的观察者模式案例
  • C语言——类型转换
  • jmeter性能测试入门完整版
  • 报错sql_mode=only_full_group_by
  • 伪造 IP 地址的原理和防范措施
  • Linux通过libudev获取挂载路径、监控U盘热拔插事件、U盘文件系统类型
  • 【会议征稿】2023智能通信与网络国际学术会议(ICN 2023)
  • Android投屏总结
  • vue2 组件组成部分,组件通信,进阶语法
  • 信看课堂笔记—LDO和DC-DC电路打PK
  • C++ Day6
  • 分布式系统与微服务的区别是什么?
  • python:用python构建一个物联网平台
  • 基于Qt5开发图形界面——WiringPi调用Linux单板电脑IO
  • 【MySQL】组合查询
  • ChatGPT:引领人机交互的未来
  • 【算法】经典的八大排序算法
  • 防溺水预警识别系统算法
  • Redis 的整合 Jedis 使用
  • Mainline Linux 和 U-Boot编译