1 public classSM4Util {2
3 public static final int KEY_SIZE = 128;4
5 public static final String ALGORITHM = "SM4";6
7 public static final String IV = "根据自己的项目定义";8
9 public static final String ALGORITHM_ECB_PADDING = "SM4/ECB/PKCS7Padding";10
11 public static final String ALGORITHM_CBC_PADDING = "SM4/CBC/PKCS7Padding";12
13
14 public static byte[] encryptECBToByte(byte[] data, String keyStr) {15 try{16 Cipher cipher =Cipher.getInstance(ALGORITHM_ECB_PADDING, BouncyCastleProvider.PROVIDER_NAME);17 Key key = newSecretKeySpec(keyStr.getBytes(), ALGORITHM);18 cipher.init(Cipher.ENCRYPT_MODE, key);19 byte[] enBytes =cipher.doFinal(data);20 returnenBytes;21 } catch(Exception e) {22 e.printStackTrace();23 }24 return null;25 }26
27 public staticString encryptECB(String data, String keyStr, String encoding) {28 try{29 Cipher cipher =Cipher.getInstance(ALGORITHM_ECB_PADDING, BouncyCastleProvider.PROVIDER_NAME);30 Key key = newSecretKeySpec(keyStr.getBytes(), ALGORITHM);31 cipher.init(Cipher.ENCRYPT_MODE, key);32 byte[] enBytes =cipher.doFinal(data.getBytes(encoding));33 Base64Encoder base64Encoder = newBase64Encoder();34 returnbase64Encoder.encode(enBytes);35 } catch(Exception e) {36 e.printStackTrace();37 }38 return null;39 }40
41 public static byte[] decryptECBToByte(byte[] data, String keyStr) {42 try{43 Cipher cipher =Cipher.getInstance(ALGORITHM_ECB_PADDING, BouncyCastleProvider.PROVIDER_NAME);44 Key key = newSecretKeySpec(keyStr.getBytes(), ALGORITHM);45 cipher.init(Cipher.DECRYPT_MODE, key);46 byte[] deBytes =cipher.doFinal(data);47 returndeBytes;48 } catch(Exception e) {49 e.printStackTrace();50 }51 return null;52 }53
54 public staticString decryptECB(String data, String keyStr, String encoding) {55 try{56 Cipher cipher =Cipher.getInstance(ALGORITHM_ECB_PADDING, BouncyCastleProvider.PROVIDER_NAME);57 Key key = newSecretKeySpec(keyStr.getBytes(), ALGORITHM);58 cipher.init(Cipher.DECRYPT_MODE, key);59 //byte[] deBytes = cipher.doFinal(Base64.decodeBase64(data));
60 Base64Encoder base64Encoder = newBase64Encoder();61 byte[] deBytes =cipher.doFinal(base64Encoder.decode(data));62 return newString(deBytes, encoding);63 } catch(Exception e) {64 e.printStackTrace();65 }66 return null;67 }68
69 public static byte[] encryptCBCToByte(byte[] data, String keyStr) {70 try{71 Cipher cipher =Cipher.getInstance(ALGORITHM_CBC_PADDING, BouncyCastleProvider.PROVIDER_NAME);72 Key key = newSecretKeySpec(keyStr.getBytes(), ALGORITHM);73 IvParameterSpec ivSpec = newIvParameterSpec(IV.getBytes());74 AlgorithmParameterSpec paramSpec =ivSpec;75 cipher.init(Cipher.ENCRYPT_MODE, key, paramSpec);76 byte[] enBytes =cipher.doFinal(data);77 returnenBytes;78 } catch(Exception e) {79 e.printStackTrace();80 }81 return null;82 }83
84 public staticString encryptCBC(String data, String keyStr, String encoding) {85 try{86 Cipher cipher =Cipher.getInstance(ALGORITHM_CBC_PADDING, BouncyCastleProvider.PROVIDER_NAME);87 Key key = newSecretKeySpec(keyStr.getBytes(), ALGORITHM);88 IvParameterSpec ivSpec = newIvParameterSpec(IV.getBytes());89 AlgorithmParameterSpec paramSpec =ivSpec;90 cipher.init(Cipher.ENCRYPT_MODE, key, paramSpec);91 byte[] enBytes =cipher.doFinal(data.getBytes(encoding));92 Base64Encoder base64Encoder = newBase64Encoder();93 returnbase64Encoder.encode(enBytes);94 } catch(Exception e) {95 e.printStackTrace();96 }97 return null;98 }99
100 public static byte[] decryptCBCToByte(byte[] data, String keyStr) {101 try{102 Cipher cipher =Cipher.getInstance(ALGORITHM_CBC_PADDING, BouncyCastleProvider.PROVIDER_NAME);103 Key key = newSecretKeySpec(keyStr.getBytes(), ALGORITHM);104 IvParameterSpec ivSpec = newIvParameterSpec(IV.getBytes());105 AlgorithmParameterSpec paramSpec =ivSpec;106 cipher.init(Cipher.DECRYPT_MODE, key, paramSpec);107 byte[] deBytes =cipher.doFinal(data);108 returndeBytes;109 } catch(Exception e) {110 e.printStackTrace();111 }112 return null;113 }114
115 public staticString decryptCBC(String data, String keyStr, String encoding) {116 try{117 Cipher cipher =Cipher.getInstance(ALGORITHM_CBC_PADDING, BouncyCastleProvider.PROVIDER_NAME);118 Key key = newSecretKeySpec(keyStr.getBytes(), ALGORITHM);119 IvParameterSpec ivSpec = newIvParameterSpec(IV.getBytes());120 AlgorithmParameterSpec paramSpec =ivSpec;121 cipher.init(Cipher.DECRYPT_MODE, key, paramSpec);122 //byte[] deBytes = cipher.doFinal(Base64.decodeBase64(data));
123 Base64Encoder base64Encoder = newBase64Encoder();124 byte[] deBytes =cipher.doFinal(base64Encoder.decode(data));125 return newString(deBytes, encoding);126 } catch(Exception e) {127 e.printStackTrace();128 }129 return null;130 }131
132 public staticString generateKey() {133 try{134 //获取到当前系统中的 提供者 和提供者支持的算法。
135 /*Provider[] providers = Security.getProviders();136 for (Provider provider2 : providers) {137 System.err.println(provider2);138 Set> entrySet = provider2.entrySet();139 for (Map.Entry entry : entrySet) {140 System.out.println(entry.getKey() +" "+ entry.getValue());141 }142 }*/
143 KeyGenerator kg =KeyGenerator.getInstance(ALGORITHM, BouncyCastleProvider.PROVIDER_NAME);144 kg.init(64, newSecureRandom());145 return newString(Hex.encodeHex(kg.generateKey().getEncoded())).toUpperCase();146 } catch(Exception e) {147 e.printStackTrace();148 }149 return null;150 }151
152 }