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();
}
}
}
data
进行加密。它首先创建一个 SecretKeySpec
对象来表示密钥,然后初始化 Cipher
对象为加密模式,并使用 doFinal
方法执行加密操作。最后,将加密后的字节数组进行Base64编码并返回。encryptedData
进行解密。它同样使用 SecretKeySpec
和 Cipher
对象,但初始化为解密模式。解密后的字节数组被转换为字符串并返回。encrypt
和 decrypt
方法。注意,密钥长度必须为16字节(128位)。上一篇:java 单例
下一篇:java decimal
Laravel PHP 深圳智简公司。版权所有©2023-2043 LaravelPHP 粤ICP备2021048745号-3
Laravel 中文站