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

java sm4加密

作者:妳會吥會在吥經意間想起莪?   发布日期:2025-05-25   浏览:32

import javax.crypto.Cipher;
import javax.crypto.spec.SecretKeySpec;
import java.util.Base64;

public class SM4Util {

    // SM4加密算法的名称
    private static final String ALGORITHM = "SM4";
    // 加密模式和填充方式
    private static final String TRANSFORMATION = "SM4/ECB/PKCS5Padding";

    /**
     * 使用SM4算法进行加密
     * @param data 待加密的数据
     * @param key  密钥
     * @return 加密后的Base64编码字符串
     * @throws Exception 如果加密过程中出现异常
     */
    public static String encrypt(String data, String key) throws Exception {
        // 创建SecretKeySpec对象,指定算法和密钥
        SecretKeySpec secretKey = new SecretKeySpec(key.getBytes("UTF-8"), ALGORITHM);
        // 创建Cipher对象,指定转换方式
        Cipher cipher = Cipher.getInstance(TRANSFORMATION);
        // 初始化Cipher对象为加密模式
        cipher.init(Cipher.ENCRYPT_MODE, secretKey);
        // 执行加密操作,并将结果进行Base64编码
        byte[] encryptedBytes = cipher.doFinal(data.getBytes("UTF-8"));
        return Base64.getEncoder().encodeToString(encryptedBytes);
    }

    /**
     * 使用SM4算法进行解密
     * @param encryptedData 加密后的Base64编码字符串
     * @param key           密钥
     * @return 解密后的原始数据
     * @throws Exception 如果解密过程中出现异常
     */
    public static String decrypt(String encryptedData, String key) throws Exception {
        // 创建SecretKeySpec对象,指定算法和密钥
        SecretKeySpec secretKey = new SecretKeySpec(key.getBytes("UTF-8"), ALGORITHM);
        // 创建Cipher对象,指定转换方式
        Cipher cipher = Cipher.getInstance(TRANSFORMATION);
        // 初始化Cipher对象为解密模式
        cipher.init(Cipher.DECRYPT_MODE, secretKey);
        // 将Base64编码的加密数据解码,并执行解密操作
        byte[] decodedBytes = Base64.getDecoder().decode(encryptedData);
        byte[] decryptedBytes = cipher.doFinal(decodedBytes);
        return new String(decryptedBytes, "UTF-8");
    }

    public static void main(String[] args) {
        try {
            String data = "Hello, SM4!";
            String key = "1234567890abcdef"; // 密钥长度必须为16字节

            // 加密
            String encryptedData = encrypt(data, key);
            System.out.println("Encrypted Data: " + encryptedData);

            // 解密
            String decryptedData = decrypt(encryptedData, key);
            System.out.println("Decrypted Data: " + decryptedData);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

解释说明:

  1. ALGORITHM 和 TRANSFORMATION:定义了使用的加密算法(SM4)以及加密模式和填充方式(ECB模式和PKCS5Padding填充)。
  2. encrypt 方法:用于对输入的字符串 data 进行加密。它首先创建一个 SecretKeySpec 对象来表示密钥,然后初始化 Cipher 对象为加密模式,并使用 doFinal 方法执行加密操作。最后,将加密后的字节数组进行Base64编码并返回。
  3. decrypt 方法:用于对Base64编码的加密字符串 encryptedData 进行解密。它同样使用 SecretKeySpecCipher 对象,但初始化为解密模式。解密后的字节数组被转换为字符串并返回。
  4. main 方法:演示了如何使用 encryptdecrypt 方法。注意,密钥长度必须为16字节(128位)。

上一篇:java 单例

下一篇:java decimal

大家都在看

java连接数据库的代码

ubuntu 卸载java

java sort用法

java collections.sort

java file类的方法

java 判断

java时间数据类型

java 时间加一天

java demo

java 截取

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

Laravel 中文站