import javax.crypto.Cipher;
import javax.crypto.spec.SecretKeySpec;
import java.util.Base64;
public class SM4Util {
// 密钥长度为16字节
private static final String KEY = "0123456789abcdef";
private static final String ALGORITHM = "SM4";
/**
* SM4加密
* @param data 待加密的数据
* @return 加密后的数据,Base64编码
*/
public static String encrypt(String data) {
try {
SecretKeySpec secretKey = new SecretKeySpec(KEY.getBytes("UTF-8"), ALGORITHM);
Cipher cipher = Cipher.getInstance("SM4/ECB/PKCS5Padding");
cipher.init(Cipher.ENCRYPT_MODE, secretKey);
byte[] encryptedData = cipher.doFinal(data.getBytes("UTF-8"));
return Base64.getEncoder().encodeToString(encryptedData);
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
/**
* SM4解密
* @param encryptedData Base64编码的加密数据
* @return 解密后的原始数据
*/
public static String decrypt(String encryptedData) {
try {
SecretKeySpec secretKey = new SecretKeySpec(KEY.getBytes("UTF-8"), ALGORITHM);
Cipher cipher = Cipher.getInstance("SM4/ECB/PKCS5Padding");
cipher.init(Cipher.DECRYPT_MODE, secretKey);
byte[] originalData = cipher.doFinal(Base64.getDecoder().decode(encryptedData));
return new String(originalData, "UTF-8");
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
public static void main(String[] args) {
String data = "Hello, SM4!";
System.out.println("Original Data: " + data);
String encryptedData = encrypt(data);
System.out.println("Encrypted Data: " + encryptedData);
String decryptedData = decrypt(encryptedData);
System.out.println("Decrypted Data: " + decryptedData);
}
}
KEY 是用于加密和解密的密钥,长度为16字节。ALGORITHM 定义了使用的加密算法为 SM4。encrypt:将输入的字符串进行 SM4 加密,并使用 Base64 编码返回加密后的结果。decrypt:将 Base64 编码的加密字符串进行 SM4 解密,返回原始字符串。main:演示了如何使用 encrypt 和 decrypt 方法对数据进行加密和解密。注意:实际应用中,密钥应该妥善保管,不能硬编码在代码中。
上一篇:java 判断字符串是否为数字
Laravel PHP 深圳智简公司。版权所有©2023-2043 LaravelPHP 粤ICP备2021048745号-3
Laravel 中文站