> 技术文档 > Java 实现 SM4 加密解密_java sm4

Java 实现 SM4 加密解密_java 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 加密解密功能。