SM4是一种对称加密算法,是中国国家密码管理局发布的商用加密算法标准,也被称为"SMS4"。它是一种分组密码,属于分组密码家族,类似于AES、DES等对称加密算法。下面是对SM4对称加密的简要介绍:
1. 对称加密算法: 对称加密算法使用相同的密钥来加密和解密数据。这意味着发送方和接收方都必须共享相同的密钥,这种密钥的管理可能会带来一些挑战。SM4是一种对称加密算法,它适用于保护数据的机密性。
2. SM4算法特点:
3. 加密和解密流程: SM4算法的加密和解密流程如下:
解密过程与加密过程相反,使用相同的密钥。
4. 适用领域: SM4对称加密算法在中国以及其他国家的加密领域得到广泛应用,特别是在金融、电子支付、电子政务、物联网(IoT)等领域。它提供了良好的安全性和性能,适用于对数据进行加密和解密以保护隐私和机密信息。
javapackage com.example.test.util;
import cn.hutool.core.util.HexUtil;
import org.apache.tomcat.util.codec.binary.Base64;
import org.bouncycastle.jce.provider.BouncyCastleProvider;
import javax.crypto.Cipher;
import java.security.SecureRandom;
import java.security.Security;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec;
/**
* sm4加解密工具
* <p>
* <b>记得重新生成KEY和IV</b>
*
* @author weizhenwang
* @date 2023/10/22
*/
public class SM4Util {
/**
* 密钥
*/
private static final String KEY = "207331201bb0efee8778e70ed492225b";
/**
* 盐
*/
private static final String IV = "3bcf915e49de35c5fe202ed4f370e034";
/**
* sm4加密
*
* @param plaintext 明文
* @return {@link String}
* @throws Exception 例外
*/
public static String sm4Encrypt(String plaintext) throws Exception {
Security.addProvider(new BouncyCastleProvider());
Cipher cipher = Cipher.getInstance("SM4/CBC/PKCS7Padding", "BC");
SecretKeySpec secretKeySpec = new SecretKeySpec(HexUtil.decodeHex(KEY), "SM4");
IvParameterSpec ivParameterSpec = new IvParameterSpec(HexUtil.decodeHex(IV));
cipher.init(Cipher.ENCRYPT_MODE, secretKeySpec, ivParameterSpec);
byte[] encrypted = cipher.doFinal(plaintext.getBytes());
return Base64.encodeBase64String(encrypted);
}
/**
* sm4解密
*
* @param ciphertext 密文
* @return {@link String}
* @throws Exception 例外
*/
public static String sm4Decrypt(String ciphertext) throws Exception {
Security.addProvider(new BouncyCastleProvider());
Cipher cipher = Cipher.getInstance("SM4/CBC/PKCS7Padding", "BC");
SecretKeySpec secretKeySpec = new SecretKeySpec(HexUtil.decodeHex(KEY), "SM4");
IvParameterSpec ivParameterSpec = new IvParameterSpec(HexUtil.decodeHex(IV));
cipher.init(Cipher.DECRYPT_MODE, secretKeySpec, ivParameterSpec);
byte[] decrypted = cipher.doFinal(Base64.decodeBase64(ciphertext));
return new String(decrypted);
}
/**
* 生成随机16 字节(128位)字节数组
* <p>
* 用户生成KEY和IV
*
* @return {@link byte[]}
*/
public static byte[] generateRandomByte() {
SecureRandom random = new SecureRandom();
byte[] iv = new byte[16];
random.nextBytes(iv);
return iv;
}
public static void main(String[] args) {
try {
// 十六进制字符数组
System.out.println("16 字节(128位)字符串:" + HexUtil.encodeHexStr(generateRandomByte()));
String plaintext = "Hello, World!";
String ciphertext = sm4Encrypt(plaintext);
String decryptedText = sm4Decrypt(ciphertext);
System.out.println("Original Text:" + plaintext);
System.out.println("Encrypted Text:" + ciphertext);
System.out.println("Decrypted Text:" + decryptedText);
} catch (Exception e) {
e.printStackTrace();
}
}
}