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();
}
}
ALGORITHM_NAME
和 ALGORITHM_NAME_ECB_PADDING
分别定义了使用的算法和模式。encrypt_ECB_Padding
方法使用给定的密钥对数据进行加密。decrypt_ECB_Padding
方法使用给定的密钥对加密后的数据进行解密。bytesToHex
将字节数组转换为十六进制字符串,便于查看加密后的数据。确保你已经导入了BouncyCastle库,可以通过Maven或其他方式引入依赖。
上一篇:java将byte数组写入文件
下一篇:java代码运行
Laravel PHP 深圳智简公司。版权所有©2023-2043 LaravelPHP 粤ICP备2021048745号-3
Laravel 中文站