国密算法SM4 的JAVA实现(基于ECB实现)
一、pom文件引用
<dependency> <groupId>cn.hutool</groupId> <artifactId>hutool-all</artifactId> <version>5.7.22</version> </dependency> <dependency> <groupId>org.bouncycastle</groupId> <artifactId>bcprov-jdk15to18</artifactId> <version>1.71</version> </dependency>
二、SM4 实现工具类
package com.cetcnav.smartreception.util; //模式 import static cn.hutool.crypto.Mode.ECB; //加密算法 import static cn.hutool.crypto.Padding.NoPadding; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import com.alibaba.fastjson.JSONObject; import cn.hutool.core.util.CharsetUtil; import cn.hutool.crypto.symmetric.SM4; import cn.hutool.crypto.symmetric.SymmetricCrypto; public class SM4Util { private static Logger logger = LoggerFactory.getLogger(SM4Util.class); //国四加解密的秘钥需要16个字符长度 private static String key = "yyyyMMddyyyyMMdd"; /** * hutool MS4加密 * * @param content * 加密内容 */ public static String encode(String content) { try { // SymmetricCrypto sm4 = SmUtil.sm4(ZeroPadding,key.getBytes()); SymmetricCrypto sm4 = new SM4(ECB, NoPadding, key.getBytes()); // 在NoPadding模式下需要手动补齐分组不为8字节的 byte[] data = padding(content); String encryptHex = sm4.encryptHex(data); return encryptHex; } catch (Exception e) { e.printStackTrace(); logger.error("MS4加密失败"); } return null; } /** * hutool 解密SM4 * * @param encodeContent * @return */ public static String decode(String encodeContent) { try { SymmetricCrypto sm4 = new SM4(ECB, NoPadding, key.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) { // not a multiple of 8 // create a new array with a size which is a multiple of 8 byte[] padded = new byte[encrypt.length + 16 - (encrypt.length % 16)]; // copy the old array into it System.arraycopy(encrypt, 0, padded, 0, encrypt.length); encrypt = padded; } return encrypt; } }