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

相关文章

Java利用docx4j+Freemarker生成word文档

《Java利用docx4j+Freemarker生成word文档》这篇文章主要为大家详细介绍了Java如何利用docx4j+Freemarker生成word文档,文中的示例代码讲解详细,感兴趣的小伙伴... 目录技术方案maven依赖创建模板文件实现代码技术方案Java 1.8 + docx4j + Fr

Java编译生成多个.class文件的原理和作用

《Java编译生成多个.class文件的原理和作用》作为一名经验丰富的开发者,在Java项目中执行编译后,可能会发现一个.java源文件有时会产生多个.class文件,从技术实现层面详细剖析这一现象... 目录一、内部类机制与.class文件生成成员内部类(常规内部类)局部内部类(方法内部类)匿名内部类二、

使用Jackson进行JSON生成与解析的新手指南

《使用Jackson进行JSON生成与解析的新手指南》这篇文章主要为大家详细介绍了如何使用Jackson进行JSON生成与解析处理,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录1. 核心依赖2. 基础用法2.1 对象转 jsON(序列化)2.2 JSON 转对象(反序列化)3.

Python中随机休眠技术原理与应用详解

《Python中随机休眠技术原理与应用详解》在编程中,让程序暂停执行特定时间是常见需求,当需要引入不确定性时,随机休眠就成为关键技巧,下面我们就来看看Python中随机休眠技术的具体实现与应用吧... 目录引言一、实现原理与基础方法1.1 核心函数解析1.2 基础实现模板1.3 整数版实现二、典型应用场景2

java中使用POI生成Excel并导出过程

《java中使用POI生成Excel并导出过程》:本文主要介绍java中使用POI生成Excel并导出过程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录需求说明及实现方式需求完成通用代码版本1版本2结果展示type参数为atype参数为b总结注:本文章中代码均为

在java中如何将inputStream对象转换为File对象(不生成本地文件)

《在java中如何将inputStream对象转换为File对象(不生成本地文件)》:本文主要介绍在java中如何将inputStream对象转换为File对象(不生成本地文件),具有很好的参考价... 目录需求说明问题解决总结需求说明在后端中通过POI生成Excel文件流,将输出流(outputStre

C/C++随机数生成的五种方法

《C/C++随机数生成的五种方法》C++作为一种古老的编程语言,其随机数生成的方法已经经历了多次的变革,早期的C++版本使用的是rand()函数和RAND_MAX常量,这种方法虽然简单,但并不总是提供... 目录C/C++ 随机数生成方法1. 使用 rand() 和 srand()2. 使用 <random

Flask 验证码自动生成的实现示例

《Flask验证码自动生成的实现示例》本文主要介绍了Flask验证码自动生成的实现示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习... 目录生成图片以及结果处理验证码蓝图html页面展示想必验证码大家都有所了解,但是可以自己定义图片验证码

Python如何在Word中生成多种不同类型的图表

《Python如何在Word中生成多种不同类型的图表》Word文档中插入图表不仅能直观呈现数据,还能提升文档的可读性和专业性,本文将介绍如何使用Python在Word文档中创建和自定义各种图表,需要的... 目录在Word中创建柱形图在Word中创建条形图在Word中创建折线图在Word中创建饼图在Word

nginx生成自签名SSL证书配置HTTPS的实现

《nginx生成自签名SSL证书配置HTTPS的实现》本文主要介绍在Nginx中生成自签名SSL证书并配置HTTPS,包括安装Nginx、创建证书、配置证书以及测试访问,具有一定的参考价值,感兴趣的可... 目录一、安装nginx二、创建证书三、配置证书并验证四、测试一、安装nginxnginx必须有"-