Java 实现 SM4 加密解密
加密方法:encrypt 方法接收明文和密钥,先对密钥进行 Base64 解码,再用 Cipher 类进行加密操作,最后把加密结果转换为 Base64 编码的字符串。解密方法:decrypt 方法接收密文和密钥,对密文和密钥进行 Base64 解码,使用 Cipher 类进行解密操作,最终返回解密后的明文。依赖引入:借助 Bouncy Castle 库实现 SM4 算法,在代码开头添加该库的提供者
一、SM4 算法简介
SM4 是中国国家密码管理局于 2012 年发布的一种对称加密算法,属于分组密码算法。它的分组长度为 128 位(16 字节),密钥长度同样为 128 位(16 字节)。SM4 算法具有较高的安全性和性能,在国内多个领域得到广泛应用。
二、依赖库
要在 Java 中使用 SM4 算法,可借助 Bouncy Castle 库。在 Maven 项目里,需在 pom.xml 文件添加如下依赖:
xml
<dependency>
<groupId>org.bouncycastle</groupId>
<artifactId>bcprov-jdk15on</artifactId>
<version>1.70</version>
</dependency>
三、示例代码
java
import org.bouncycastle.jce.provider.BouncyCastleProvider;
import javax.crypto.Cipher;
import javax.crypto.KeyGenerator;
import javax.crypto.SecretKey;
import javax.crypto.spec.SecretKeySpec;
import java.nio.charset.StandardCharsets;
import java.security.Security;
import java.util.Base64;
public class SM4Example {
private static final String ALGORITHM_NAME = "SM4";
private static final String ALGORITHM_MODE = "SM4/ECB/PKCS5Padding";
static {
Security.addProvider(new BouncyCastleProvider());
}
/**
* 生成 SM4 密钥
* @return 密钥的 Base64 编码字符串
* @throws Exception 异常
*/
public static String generateKey() throws Exception {
KeyGenerator kg = KeyGenerator.getInstance(ALGORITHM_NAME, "BC");
kg.init(128);
SecretKey secretKey = kg.generateKey();
return Base64.getEncoder().encodeToString(secretKey.getEncoded());
}
/**
* SM4 加密
* @param plainText 明文
* @param key 密钥的 Base64 编码字符串
* @return 密文的 Base64 编码字符串
* @throws Exception 异常
*/
public static String encrypt(String plainText, String key) throws Exception {
byte[] keyBytes = Base64.getDecoder().decode(key);
SecretKeySpec secretKeySpec = new SecretKeySpec(keyBytes, ALGORITHM_NAME);
Cipher cipher = Cipher.getInstance(ALGORITHM_MODE, "BC");
cipher.init(Cipher.ENCRYPT_MODE, secretKeySpec);
byte[] encryptedBytes = cipher.doFinal(plainText.getBytes(StandardCharsets.UTF_8));
return Base64.getEncoder().encodeToString(encryptedBytes);
}
/**
* SM4 解密
* @param cipherText 密文的 Base64 编码字符串
* @param key 密钥的 Base64 编码字符串
* @return 明文
* @throws Exception 异常
*/
public static String decrypt(String cipherText, String key) throws Exception {
byte[] keyBytes = Base64.getDecoder().decode(key);
SecretKeySpec secretKeySpec = new SecretKeySpec(keyBytes, ALGORITHM_NAME);
Cipher cipher = Cipher.getInstance(ALGORITHM_MODE, "BC");
cipher.init(Cipher.DECRYPT_MODE, secretKeySpec);
byte[] cipherBytes = Base64.getDecoder().decode(cipherText);
byte[] decryptedBytes = cipher.doFinal(cipherBytes);
return new String(decryptedBytes, StandardCharsets.UTF_8);
}
public static void main(String[] args) {
try {
// 生成密钥
String key = generateKey();
System.out.println("生成的密钥: " + key);
// 明文
String plainText = "Hello, SM4!";
System.out.println("明文: " + plainText);
// 加密
String cipherText = encrypt(plainText, key);
System.out.println("密文: " + cipherText);
// 解密
String decryptedText = decrypt(cipherText, key);
System.out.println("解密后的明文: " + decryptedText);
} catch (Exception e) {
e.printStackTrace();
}
}
}
四、代码解释
依赖引入:借助 Bouncy Castle 库实现 SM4 算法,在代码开头添加该库的提供者。
常量定义:定义了算法名称 ALGORITHM_NAME 和算法模式 ALGORITHM_MODE。
生成密钥:generateKey 方法用于生成 128 位的 SM4 密钥,并将其转换为 Base64 编码的字符串。
加密方法:encrypt 方法接收明文和密钥,先对密钥进行 Base64 解码,再用 Cipher 类进行加密操作,最后把加密结果转换为 Base64 编码的字符串。
解密方法:decrypt 方法接收密文和密钥,对密文和密钥进行 Base64 解码,使用 Cipher 类进行解密操作,最终返回解密后的明文。
主方法:在 main 方法中,生成密钥,对明文进行加密,然后对密文进行解密,最后输出相关信息。
五、运行示例
运行上述代码,输出结果类似如下:
plaintext
生成的密钥: 8Q+J8p5J+6x6J8l7J8p5J8=
明文: Hello, SM4!
密文: 4a7j8J8l7J8p5J8=
解密后的明文: Hello, SM4!
通过上述步骤,你可以在 Java 中实现 SM4 加密解密功能。
更多推荐


所有评论(0)