1、算法定义:SM4算法是一种分组密码算法。其分组长度为128bit,密钥长度也为128bit。加密算法与密钥扩展算法均采用32轮非线性迭代结构,以字(32位)为单位进行加密运算,每一次迭代运算均为一轮变换函数F。SM4算法加/解密算法的结构相同,只是使用轮密钥相反,其中解密轮密钥是加密轮密钥的逆序。
2、
基本运算
⊕ 异或
<<<i 循环左移i位
3.算法实现
即首先执行32次轮函数迭代运算,然后在对最后一轮数据反序变换并得到密文输出
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.codec.binary.Base64;
import org.bouncycastle.jce.provider.BouncyCastleProvider;
import javax.crypto.Cipher;
import javax.crypto.KeyGenerator;
import javax.crypto.spec.SecretKeySpec;
import java.security.*;
import java.util.Arrays;
/**
* packageName com.utils
*
* @author
* @version JDK 8
* @className Sm4Util
* @date 2024/5/8 0008
* @description 国产SM4数据加密和解密
*/
@Slf4j
public class Sm4Util {
static {
Security.addProvider(new BouncyCastleProvider());
}
private static final String ENCODING = "UTF-8";
public static final String ALGORITHM_NAME = "SM4";
// 加密算法/分组加密模式/分组填充方式
// PKCS5Padding-以8个字节为一组进行分组加密
// 定义分组加密模式使用:PKCS5Padding
public static final String ALGORITHM_NAME_ECB_PADDING5 = "SM4/ECB/PKCS5Padding";
public static final String ALGORITHM_NAME_ECB_PADDING7 = "SM4/ECB/PKCS7Padding";
// 64-16位16进制;128-32位16进制;256-64位16进制
public static final int DEFAULT_KEY_SIZE = 128;
//16进制密钥(忽略大小写)
private static String hexKey = "86C63180C2806ED1";
/**
* 生成ECB暗号
*
* @param algorithmName 算法名称
* @param mode 模式
* @param key
* @return
* @throws Exception
* @explain ECB模式(电子密码本模式:Electronic codebook)
*/
private static Cipher generateEcbCipher(String algorithmName, int mode, byte[] key) throws Exception {
Cipher cipher = Cipher.getInstance(algorithmName, BouncyCastleProvider.PROVIDER_NAME);
Key sm4Key = new SecretKeySpec(key, ALGORITHM_NAME);
cipher.init(mode, sm4Key);
return cipher;
}
// 产生密钥
/**
* 自

最低0.47元/天 解锁文章
649






