android java 算法_android(java) SM3,SM4国密算法踩坑总结

论坛 期权论坛 编程之家     
选择匿名的用户   2021-6-2 17:49   2249   0

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 }

分享到 :
0 人收藏
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

积分:3875789
帖子:775174
精华:0
期权论坛 期权论坛
发布
内容

下载期权论坛手机APP