SM4是一种对称加密算法,广泛应用于中国的信息安全标准中。作为SM系列算法中的一种,SM4具有效率高、安全性强的特点。它采用128位的密钥和128位的分组长度,支持ECB(电子密码本)和CBC(密码块链)两种工作模式。本文将介绍如何基于Java实现SM4的ECB和CBC模式的对称加密及解密。
SM4算法的基本概念
ECB模式:每个明文分组独立地加密成密文分组,适用于对称分组加密,但安全性相对较低,因为同样的明文块会被加密成相同的密文块。
CBC模式:每个明文块在加密前与前一个密文块进行异或运算,提高了安全性,但需要一个初始向量IV。
Java实现SM4算法
我们可以使用开源库来实现SM4加解密,如Bouncy Castle。下面是一个简单的示例,展现如何在Java中实现SM4的ECB模式和CBC模式。
Maven依赖
首先,确保在你的pom.xml
中添加Bouncy Castle依赖:
<dependency>
<groupId>org.bouncycastle</groupId>
<artifactId>bcpkix-jdk15on</artifactId>
<version>1.69</version>
</dependency>
SM4加解密工具类
import org.bouncycastle.jce.provider.BouncyCastleProvider;
import javax.crypto.Cipher;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec;
import java.security.Security;
import java.util.Arrays;
public class SM4Utils {
static {
Security.addProvider(new BouncyCastleProvider());
}
private static final String SM4_ECB = "SM4/ECB/PKCS7Padding"; // ECB模式
private static final String SM4_CBC = "SM4/CBC/PKCS7Padding"; // CBC模式
// SM4加密
public static byte[] encrypt(byte[] key, byte[] data, boolean isCBC) throws Exception {
SecretKeySpec keySpec = new SecretKeySpec(key, "SM4");
Cipher cipher = Cipher.getInstance(isCBC ? SM4_CBC : SM4_ECB);
if (isCBC) {
byte[] iv = new byte[16]; // CBC使用初始向量IV
IvParameterSpec ivSpec = new IvParameterSpec(iv);
cipher.init(Cipher.ENCRYPT_MODE, keySpec, ivSpec);
} else {
cipher.init(Cipher.ENCRYPT_MODE, keySpec);
}
return cipher.doFinal(data);
}
// SM4解密
public static byte[] decrypt(byte[] key, byte[] data, boolean isCBC) throws Exception {
SecretKeySpec keySpec = new SecretKeySpec(key, "SM4");
Cipher cipher = Cipher.getInstance(isCBC ? SM4_CBC : SM4_ECB);
if (isCBC) {
byte[] iv = new byte[16]; // CBC需要IV
IvParameterSpec ivSpec = new IvParameterSpec(iv);
cipher.init(Cipher.DECRYPT_MODE, keySpec, ivSpec);
} else {
cipher.init(Cipher.DECRYPT_MODE, keySpec);
}
return cipher.doFinal(data);
}
public static void main(String[] args) throws Exception {
byte[] key = "1234567890abcdef".getBytes(); // 128位密钥
byte[] data = "Hello SM4!".getBytes(); // 明文
// ECB模式加密
byte[] encryptedECB = encrypt(key, data, false);
System.out.println("ECB模式加密结果: " + Arrays.toString(encryptedECB));
// ECB模式解密
byte[] decryptedECB = decrypt(key, encryptedECB, false);
System.out.println("ECB模式解密结果: " + new String(decryptedECB));
// CBC模式加密
byte[] encryptedCBC = encrypt(key, data, true);
System.out.println("CBC模式加密结果: " + Arrays.toString(encryptedCBC));
// CBC模式解密
byte[] decryptedCBC = decrypt(key, encryptedCBC, true);
System.out.println("CBC模式解密结果: " + new String(decryptedCBC));
}
}
运行示例
在上述代码中,我们首先定义了一个包含SM4加解密方法的工具类SM4Utils
。我们通过encrypt
和decrypt
方法分别实现了ECB和CBC模式的加解密。 main
方法中展示了如何使用这些方法进行加密和解密。
结论
通过简单的代码示例,本文展示了如何在Java中使用Bouncy Castle库实现SM4算法的ECB和CBC模式的对称加解密。SM4作为中国的国家密码标准,具有重要的应用价值和安全意义。在实际应用中,建议根据具体需求选择加密模式,并确保密钥和初始向量的安全管理。