1、引入jar
<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-all</artifactId>
<version>5.3.0</version>
</dependency>
<dependency>
<groupId>org.bouncycastle</groupId>
<artifactId>bcprov-jdk15to18</artifactId>
<version>1.71</version>
</dependency>
2、封装工具类
/**
* sm4加密
* @param mode sm4加密的模式 ECB,CBC
* @param padding 加密填充方式
* @param key 加密秘钥 转成byte[] 大小16
* @param iv 偏移量,CBC模式下需要传入,否则系统随机生成iv每次加密结果都不一样 转成byte[] 大小16
* @param content 加密内容
* @return
*/
public static String encode(Mode mode, Padding padding,String key, String iv,String content) {
try {
//校验参数
if(StringUtils.isBlank(content)) {
return null;
}
SymmetricCrypto sm4 = new SM4(mode, padding, key.getBytes());
String encryptHex = null;
if(mode.equals(Mode.CBC)) {
sm4 = new SM4(mode, padding, key.getBytes(),iv.getBytes());
}
// 在NoPadding模式下需要手动补齐分组16字节倍数
if(padding.equals(Padding.NoPadding)) {
byte[] data = padding(content);
encryptHex = sm4.encryptHex(data);
}
else {
encryptHex = sm4.encryptHex(content.getBytes());
}
return encryptHex;
} catch (Exception e) {
e.printStackTrace();
logger.error("MS4加密失败");
}
return null;
}
/**
* sm4解密
* @param mode sm4加密的模式 ECB,CBC
* @param padding 加密填充方式
* @param key 加密秘钥 转成byte[] 大小16
* @param iv 偏移量,CBC模式下需要传入,否则系统随机生成iv每次加密结果都不一样 转成byte[] 大小16
* @param encodeContent 需解密字符串
* @return
*/
public static String decode(Mode mode, Padding padding,String key, String iv,String encodeContent) {
try {
//校验参数
if(StringUtils.isBlank(encodeContent)) {
return null;
}
SymmetricCrypto sm4 = new SM4(mode, padding, key.getBytes());
if(mode.equals(Mode.CBC)) {
sm4 = new SM4(mode, padding, key.getBytes(),iv.getBytes());
}
String decryptStr = sm4.decryptStr(encodeContent, CharsetUtil.CHARSET_UTF_8);
return decryptStr;
} catch (Exception e) {
e.printStackTrace();
logger.error("SM4解密失败");
}
return null;
}
// 在NoPadding模式下需要手动对齐16字节的倍数
public static byte[] padding(String arg_text) {
byte[] encrypt = arg_text.getBytes();
if (encrypt.length % 16 != 0) {
byte[] padded = new byte[encrypt.length + 16 - (encrypt.length % 16)];
System.arraycopy(encrypt, 0, padded, 0, encrypt.length);
encrypt = padded;
}
return encrypt;
}
3、在代码中引入加密自己的内容。
Mode,Padding要加密和解密一样,自由选择。