sm4加解密以及随机生成密钥

2024-06-05 15:36

本文主要是介绍sm4加解密以及随机生成密钥,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

字节数组处理工具类

public class ByteUtils {private static final char[] HEX_CHARS = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e','f' };private ByteUtils() {// Utility class}public static byte[] fromHexString(String s) {int len = s.length();//// // Data length must be even// if (len % 2 != 0) {// throw new IllegalArgumentException("Hex string has an odd number of// characters");// }byte[] data = new byte[len / 2];for (int i = 0; i < len; i += 2) {data[i / 2] = (byte) ((Character.digit(s.charAt(i), 16) << 4) + Character.digit(s.charAt(i + 1), 16));}return data;}public static String toHexString(byte[] input) {StringBuilder sb = new StringBuilder();for (byte b : input) {sb.append(HEX_CHARS[(b >>> 4) & 0x0f]);sb.append(HEX_CHARS[b & 0x0f]);}return sb.toString();}public static String toHexString(byte[] input, String prefix, String separator) {StringBuilder sb = new StringBuilder(prefix);for (int i = 0; i < input.length; i++) {sb.append(HEX_CHARS[(input[i] >>> 4) & 0x0f]);sb.append(HEX_CHARS[input[i] & 0x0f]);if (i < input.length - 1) {sb.append(separator);}}return sb.toString();}
}

随机生成十六进制密钥

// 生成 SM4 密钥的方法public static String generateSM4Key() {// 定义一个 128 位的字节数组byte[] keyBytes = new byte[16];// 使用 SecureRandom 生成随机密钥SecureRandom secureRandom = new SecureRandom();secureRandom.nextBytes(keyBytes);// 将字节数组转换为十六进制字符串StringBuilder sb = new StringBuilder();for (byte b : keyBytes) {// 使用 Integer.toHexString() 方法将字节转换为十六进制字符串sb.append(String.format("%02x", b & 0xff));}// 返回生成的密钥return sb.toString();}//    public static void main(String[] args) {
//        // 生成 SM4 密钥并打印
//        String sm4Key = generateSM4Key();
//        System.out.println("Generated SM4 Key: " + sm4Key);
//    }

sm4工具类

public class Sm4Utils {static {Security.addProvider(new BouncyCastleProvider());}private static final String ENCODING = "UTF-8";public static final String ALGORIGTHM_NAME = "SM4";public static final String ALGORITHM_NAME_ECB_PADDING = "SM4/ECB/PKCS7Padding";public static final int DEFAULT_KEY_SIZE = 128;private static Cipher generateEcbCipher(String algorithmName, int mode, byte[] key) throws Exception {Cipher cipher = Cipher.getInstance(algorithmName, "BC");Key sm4Key = new SecretKeySpec(key, ALGORIGTHM_NAME);cipher.init(mode, sm4Key);return cipher;}public static byte[] generateKey(String keyString) throws Exception {// Use SHA-256 to hash the string and then take first 128 bits (16 bytes)MessageDigest digest = MessageDigest.getInstance("SHA-256");byte[] hash = digest.digest(keyString.getBytes(StandardCharsets.UTF_8));byte[] key = new byte[16];System.arraycopy(hash, 0, key, 0, 16);return key;}public static String encryptEcb(String key, String paramStr, String charset) throws Exception {String cipherText = "";if (null != paramStr && !"".equals(paramStr)) {byte[] keyData = generateKey(key);charset = charset.trim();if (charset.length() <= 0) {charset = ENCODING;}byte[] srcData = paramStr.getBytes(charset);byte[] cipherArray = encryptEcbPadding(keyData, srcData);cipherText = ByteUtils.toHexString(cipherArray);}return cipherText;}public static byte[] encryptEcbPadding(byte[] key, byte[] data) throws Exception {Cipher cipher = generateEcbCipher("SM4/ECB/PKCS7Padding", Cipher.ENCRYPT_MODE, key);byte[] bs = cipher.doFinal(data);return bs;}public static String decryptEcb(String key, String cipherText, String charset) throws Exception {String decryptStr = "";byte[] keyData = generateKey(key);byte[] cipherData = ByteUtils.fromHexString(cipherText);byte[] srcData = decryptEcbPadding(keyData, cipherData);charset = charset.trim();if (charset.length() <= 0) {charset = ENCODING;}decryptStr = new String(srcData, charset);return decryptStr;}public static byte[] decryptEcbPadding(byte[] key, byte[] cipherText) throws Exception {Cipher cipher = generateEcbCipher("SM4/ECB/PKCS7Padding", Cipher.DECRYPT_MODE, key);return cipher.doFinal(cipherText);}//测试加解密public static void main(String[] args) {try {String enpwd = "";//已加密数据String json = "";//需要加密数据String key = "";//这里填生成的十六进制密钥
//            String cipher = encryptEcb(key, json, ENCODING);//加密
//            System.out.println(cipher);System.out.println(decryptEcb(key, enpwd, ENCODING));//解密} catch (Exception var5) {var5.printStackTrace();}}
}

pom

<dependency><groupId>org.bouncycastle</groupId><artifactId>bcprov-jdk15to18</artifactId><version>1.68</version>//可根据情况修改
</dependency>

这篇关于sm4加解密以及随机生成密钥的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1033460

相关文章

k8s admin用户生成token方式

《k8sadmin用户生成token方式》用户使用Kubernetes1.28创建admin命名空间并部署,通过ClusterRoleBinding为jenkins用户授权集群级权限,生成并获取其t... 目录k8s admin用户生成token创建一个admin的命名空间查看k8s namespace 的

Vue3 如何通过json配置生成查询表单

《Vue3如何通过json配置生成查询表单》本文给大家介绍Vue3如何通过json配置生成查询表单,本文结合实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录功能实现背景项目代码案例功能实现背景通过vue3实现后台管理项目一定含有表格功能,通常离不开表单

Java使用Javassist动态生成HelloWorld类

《Java使用Javassist动态生成HelloWorld类》Javassist是一个非常强大的字节码操作和定义库,它允许开发者在运行时创建新的类或者修改现有的类,本文将简单介绍如何使用Javass... 目录1. Javassist简介2. 环境准备3. 动态生成HelloWorld类3.1 创建CtC

Python从Word文档中提取图片并生成PPT的操作代码

《Python从Word文档中提取图片并生成PPT的操作代码》在日常办公场景中,我们经常需要从Word文档中提取图片,并将这些图片整理到PowerPoint幻灯片中,手动完成这一任务既耗时又容易出错,... 目录引言背景与需求解决方案概述代码解析代码核心逻辑说明总结引言在日常办公场景中,我们经常需要从 W

C#使用Spire.XLS快速生成多表格Excel文件

《C#使用Spire.XLS快速生成多表格Excel文件》在日常开发中,我们经常需要将业务数据导出为结构清晰的Excel文件,本文将手把手教你使用Spire.XLS这个强大的.NET组件,只需几行C#... 目录一、Spire.XLS核心优势清单1.1 性能碾压:从3秒到0.5秒的质变1.2 批量操作的优雅

Python使用python-pptx自动化操作和生成PPT

《Python使用python-pptx自动化操作和生成PPT》这篇文章主要为大家详细介绍了如何使用python-pptx库实现PPT自动化,并提供实用的代码示例和应用场景,感兴趣的小伙伴可以跟随小编... 目录使用python-pptx操作PPT文档安装python-pptx基础概念创建新的PPT文档查看

在ASP.NET项目中如何使用C#生成二维码

《在ASP.NET项目中如何使用C#生成二维码》二维码(QRCode)已广泛应用于网址分享,支付链接等场景,本文将以ASP.NET为示例,演示如何实现输入文本/URL,生成二维码,在线显示与下载的完整... 目录创建前端页面(Index.cshtml)后端二维码生成逻辑(Index.cshtml.cs)总结

Python实现数据可视化图表生成(适合新手入门)

《Python实现数据可视化图表生成(适合新手入门)》在数据科学和数据分析的新时代,高效、直观的数据可视化工具显得尤为重要,下面:本文主要介绍Python实现数据可视化图表生成的相关资料,文中通过... 目录前言为什么需要数据可视化准备工作基本图表绘制折线图柱状图散点图使用Seaborn创建高级图表箱线图热

mybatis用拦截器实现字段加解密全过程

《mybatis用拦截器实现字段加解密全过程》本文通过自定义注解和MyBatis拦截器实现敏感信息加密,处理Parameter和ResultSet,确保数据库存储安全且查询结果解密可用... 目录前言拦截器的使用总结前言根据公司业务需要,灵活对客户敏感信息进行加解密,这里采用myBATis拦截器进行简单实

SQLServer中生成雪花ID(Snowflake ID)的实现方法

《SQLServer中生成雪花ID(SnowflakeID)的实现方法》:本文主要介绍在SQLServer中生成雪花ID(SnowflakeID)的实现方法,文中通过示例代码介绍的非常详细,... 目录前言认识雪花ID雪花ID的核心特点雪花ID的结构(64位)雪花ID的优势雪花ID的局限性雪花ID的应用场景