SM4加密工具类
1,SM4_Context.java
package com.security.cipher.sm; public class SM4_Context { public int mode; public String name; public int[] sk; public boolean isPadding; public SM4_Context() { this.mode = 1; this.isPadding = true; this.sk = new int[32]; } public int getMode() { return mode; } public void setMode(int mode) { this.mode = mode; } public int[] getSk() { return sk; } public void setSk(int[] sk) { this.sk = sk; } public String getName() { return name; } public void setName(String name) { this.name = name; } }
2,SM4Utils.java
package com.security.cipher.sm; import sun.misc.BASE64Decoder; import sun.misc.BASE64Encoder; import java.util.regex.Matcher; import java.util.regex.Pattern; public class SM4Utils { private static String secretKey ="5ff7db748e839782"; private static String iv = "UISwD9fW6cFh9SNS"; private static String CHARSET_UTF8 = "UTF-8"; private static boolean hexString = false; public SM4Utils() { } public static String encryptData_ECB(String plainText) { try { SM4_Context ctx = new SM4_Context(); ctx.isPadding = true; ctx.mode = SM4.SM4_ENCRYPT; byte[] keyBytes; if (hexString) { keyBytes = Util.hexStringToBytes(secretKey); } else { keyBytes = secretKey.getBytes(); } SM4 sm4 = new SM4(); sm4.sm4_setkey_enc(ctx, keyBytes); byte[] encrypted = sm4.sm4_crypt_ecb(ctx, plainText.getBytes(CHARSET_UTF8)); String cipherText = new BASE64Encoder().encode(encrypted); if (cipherText != null && cipherText.trim().length() > 0) { Pattern p = Pattern.compile("\\s*|\t|\r|\n"); Matcher m = p.matcher(cipherText); cipherText = m.replaceAll(""); } return cipherText; } catch (Exception e) { e.printStackTrace(); return null; } } public static String decryptData_ECB(String cipherText) { try { SM4_Context ctx = new SM4_Context(); ctx.isPadding = true; ctx.mode = SM4.SM4_DECRYPT; byte[] keyBytes; if (hexString) { keyBytes = Util.hexStringToBytes(secretKey); } else { keyBytes = secretKey.getBytes(); } SM4 sm4 = new SM4(); sm4.sm4_setkey_dec(ctx, keyBytes); byte[] decrypted = sm4.sm4_crypt_ecb(ctx, new BASE64Decoder().decodeBuffer(cipherText)); return new String(decrypted, CHARSET_UTF8); } catch (Exception e) { e.printStackTrace(); return null; } } public static String encryptData_CBC(String plainText) { if(plainText==null || "".equals(plainText)){ return null; } try { SM4_Context ctx = new SM4_Context(); ctx.isPadding = true; ctx.mode = SM4.SM4_ENCRYPT; byte[] keyBytes; byte[] ivBytes; if (hexString) { keyBytes = Util.hexStringToBytes(secretKey); ivBytes = Util.hexStringToBytes(iv); } else { keyBytes = secretKey.getBytes(); ivBytes = iv.getBytes(); } SM4 sm4 = new SM4(); sm4.sm4_setkey_enc(ctx, keyBytes); byte[] encrypted = sm4.sm4_crypt_cbc(ctx, ivBytes, plainText.getBytes(CHARSET_UTF8)); String cipherText = new BASE64Encoder().encode(encrypted); if (cipherText != null && cipherText.trim().length() > 0) { Pattern p = Pattern.compile("\\s*|\t|\r|\n"); Matcher m = p.matcher(cipherText); cipherText = m.replaceAll(""); } return cipherText; } catch (Exception e) { e.printStackTrace(); return null; } } public static String decryptData_CBC(String cipherText) { if(cipherText==null){ return null; } try { SM4_Context ctx = new SM4_Context(); ctx.isPadding = true; ctx.mode = SM4.SM4_DECRYPT; byte[] keyBytes; byte[] ivBytes; if (hexString) { keyBytes = Util.hexStringToBytes(secretKey); ivBytes = Util.hexStringToBytes(iv); } else { keyBytes = secretKey.getBytes(); ivBytes = iv.getBytes(); } SM4 sm4 = new SM4(); sm4.sm4_setkey_dec(ctx, keyBytes); byte[] decrypted = sm4.sm4_crypt_cbc(ctx, ivBytes, new BASE64Decoder().decodeBuffer(cipherText)); return new String(decrypted, CHARSET_UTF8); } catch (Exception e) { e.printStackTrace(); return cipherText; } } public static void main(String[] args) { String plainText = "340521198508194410"; String cipherText = SM4Utils.encryptData_ECB(plainText); System.out.println("加密结果: " + cipherText); plainText = SM4Utils.decryptData_ECB("JTAUNzdhT8hnMIBudljcyxPqYfdFiOwN2jZ5eWV66fg="); System.out.println("解密结果: " + plainText); } }
好记性不如烂笔头
浙公网安备 33010602011771号