Laravel  
laravel
文档
数据库
架构
入门
php技术
    
Laravelphp
laravel / php / java / vue / mysql / linux / python / javascript / html / css / c++ / c#

java国密加密和解密流程

作者:メ可遇不可求   发布日期:2025-07-16   浏览:84

import javax.crypto.Cipher;
import javax.crypto.KeyGenerator;
import javax.crypto.SecretKey;
import javax.crypto.spec.SecretKeySpec;
import java.security.Security;
import org.bouncycastle.jce.provider.BouncyCastleProvider;

public class SM4Util {

    static {
        // 添加BouncyCastle安全提供者
        Security.addProvider(new BouncyCastleProvider());
    }

    private static final String ALGORITHM_NAME = "SM4";
    private static final String ALGORITHM_NAME_ECB_PADDING = "SM4/ECB/PKCS7Padding";

    public static byte[] encrypt_ECB_Padding(byte[] key, byte[] data) throws Exception {
        SecretKeySpec secretKeySpec = new SecretKeySpec(key, ALGORITHM_NAME);
        Cipher cipher = Cipher.getInstance(ALGORITHM_NAME_ECB_PADDING, "BC");
        cipher.init(Cipher.ENCRYPT_MODE, secretKeySpec);
        return cipher.doFinal(data);
    }

    public static byte[] decrypt_ECB_Padding(byte[] key, byte[] encryptedData) throws Exception {
        SecretKeySpec secretKeySpec = new SecretKeySpec(key, ALGORITHM_NAME);
        Cipher cipher = Cipher.getInstance(ALGORITHM_NAME_ECB_PADDING, "BC");
        cipher.init(Cipher.DECRYPT_MODE, secretKeySpec);
        return cipher.doFinal(encryptedData);
    }

    public static void main(String[] args) throws Exception {
        // 生成密钥
        KeyGenerator kg = KeyGenerator.getInstance("SM4", "BC");
        kg.init(128); // 密钥长度可以是128或256
        SecretKey secretKey = kg.generateKey();
        byte[] key = secretKey.getEncoded();

        // 要加密的数据
        String data = "Hello, World!";
        byte[] encryptedData = encrypt_ECB_Padding(key, data.getBytes("UTF-8"));
        System.out.println("Encrypted Data: " + bytesToHex(encryptedData));

        // 解密数据
        byte[] decryptedData = decrypt_ECB_Padding(key, encryptedData);
        System.out.println("Decrypted Data: " + new String(decryptedData, "UTF-8"));
    }

    private static String bytesToHex(byte[] bytes) {
        StringBuilder sb = new StringBuilder();
        for (byte b : bytes) {
            sb.append(String.format("%02x", b));
        }
        return sb.toString();
    }
}

解释说明:

  1. 引入BouncyCastle库:为了支持国密算法(如SM4),需要添加BouncyCastle作为安全提供者。
  2. 定义算法名称ALGORITHM_NAMEALGORITHM_NAME_ECB_PADDING 分别定义了使用的算法和模式。
  3. 加密方法encrypt_ECB_Padding 方法使用给定的密钥对数据进行加密。
  4. 解密方法decrypt_ECB_Padding 方法使用给定的密钥对加密后的数据进行解密。
  5. 主函数:演示了如何生成密钥、加密和解密数据,并打印结果。
  6. 辅助方法bytesToHex 将字节数组转换为十六进制字符串,便于查看加密后的数据。

确保你已经导入了BouncyCastle库,可以通过Maven或其他方式引入依赖。

上一篇:java将byte数组写入文件

下一篇:java代码运行

大家都在看

java连接数据库的代码

ubuntu 卸载java

java读取excel中的图片

java新建

java sort用法

java collections.sort

java file类的方法

java 判断

java时间数据类型

java实体类转json字符串

Laravel PHP 深圳智简公司。版权所有©2023-2043 LaravelPHP 粤ICP备2021048745号-3

Laravel 中文站