Android AESUtils 工具类与调用方法

举报
wh_bn 发表于 2021/12/15 23:56:21 2021/12/15
【摘要】 加密类 package com.test.abc; import android.annotation.SuppressLint;import android.text.TextUtils;import android.util.Base64;import android.util.Log; import java.security....

加密类


  
  1. package com.test.abc;
  2. import android.annotation.SuppressLint;
  3. import android.text.TextUtils;
  4. import android.util.Base64;
  5. import android.util.Log;
  6. import java.security.Provider;
  7. import java.security.SecureRandom;
  8. import javax.crypto.Cipher;
  9. import javax.crypto.KeyGenerator;
  10. import javax.crypto.SecretKey;
  11. import javax.crypto.spec.IvParameterSpec;
  12. import javax.crypto.spec.SecretKeySpec;
  13. public class AESUtils {
  14. private final static String HEX = "0123456789ABCDEF";
  15. private static final String CBC_PKCS5_PADDING = "AES/CBC/PKCS5Padding";//AES是加密方式 CBC是工作模式 PKCS5Padding是填充模式
  16. private static final String AES = "AES";//AES 加密
  17. private static final String SHA1PRNG = "SHA1PRNG";// SHA1PRNG 强随机种子算法, 要区别4.2以上版本的调用方法
  18. /**
  19. * 返回固定的KEY
  20. * @return
  21. */
  22. public static String fixedKey(){
  23. String secret_key = "F2492E93586F768B1E9C80C10EBA1CA88AB6B16C";
  24. //"{\"activation_result\":-2,\"member_username\":\"qwe\",\"member_expirationtime\":0}";
  25. return secret_key;
  26. }
  27. /**
  28. * 生成随机数,可以当做动态的密钥 加密和解密的密钥必须一致,不然将不能解密
  29. */
  30. public static String generateKey() {
  31. try {
  32. SecureRandom localSecureRandom = SecureRandom.getInstance(SHA1PRNG);
  33. byte[] bytes_key = new byte[20];
  34. localSecureRandom.nextBytes(bytes_key);
  35. String str_key = toHex(bytes_key);
  36. return str_key;
  37. } catch (Exception e) {
  38. e.printStackTrace();
  39. }
  40. return null;
  41. }
  42. /**
  43. * 对密钥进行处理
  44. *
  45. * @param seed
  46. * @return
  47. * @throws Exception
  48. */
  49. @SuppressLint("DeletedProvider")
  50. private static byte[] getRawKey(byte[] seed) throws Exception {
  51. KeyGenerator kgen = KeyGenerator.getInstance(AES);
  52. //for android
  53. SecureRandom sr = null;
  54. // 在4.2以上版本中,SecureRandom获取方式发生了改变
  55. int sdk_version = android.os.Build.VERSION.SDK_INT;
  56. if (sdk_version > 23) { // Android 6.0 以上
  57. sr = SecureRandom.getInstance(SHA1PRNG, new CryptoProvider());
  58. } else if (android.os.Build.VERSION.SDK_INT >= 17) { //4.2及以上
  59. sr = SecureRandom.getInstance(SHA1PRNG, "Crypto");
  60. } else {
  61. sr = SecureRandom.getInstance(SHA1PRNG);
  62. }
  63. // for Java
  64. // secureRandom = SecureRandom.getInstance(SHA1PRNG);
  65. sr.setSeed(seed);
  66. kgen.init(128, sr); //256 bits or 128 bits,192bits
  67. //AES中128位密钥版本有10个加密循环,192比特密钥版本有12个加密循环,256比特密钥版本则有14个加密循环。
  68. SecretKey skey = kgen.generateKey();
  69. byte[] raw = skey.getEncoded();
  70. return raw;
  71. }
  72. /**
  73. * 加密
  74. */
  75. public static String encrypt(String key, String cleartext) {
  76. if (TextUtils.isEmpty(cleartext)) {
  77. return cleartext;
  78. }
  79. try {
  80. byte[] result = encrypt(key, cleartext.getBytes());
  81. // return Base64Encoder.encode(result);
  82. return new String(Base64.encode(result, Base64.DEFAULT));
  83. } catch (Exception e) {
  84. e.printStackTrace();
  85. }
  86. return null;
  87. }
  88. /**
  89. * 加密
  90. */
  91. private static byte[] encrypt(String key, byte[] clear) throws Exception {
  92. byte[] raw = getRawKey(key.getBytes());
  93. SecretKeySpec skeySpec = new SecretKeySpec(raw, AES);
  94. Cipher cipher = Cipher.getInstance(CBC_PKCS5_PADDING);
  95. cipher.init(Cipher.ENCRYPT_MODE, skeySpec, new IvParameterSpec(new byte[cipher.getBlockSize()]));
  96. byte[] encrypted = cipher.doFinal(clear);
  97. return encrypted;
  98. }
  99. /**
  100. * 解密
  101. */
  102. public static String decrypt(String key, String encrypted) {
  103. if (TextUtils.isEmpty(encrypted)) {
  104. return encrypted;
  105. }
  106. try {
  107. // byte[] enc = Base64Decoder.decodeToBytes(encrypted);
  108. byte[] enc = Base64.decode(encrypted, Base64.DEFAULT);
  109. byte[] result = decrypt(key, enc);
  110. return new String(result);
  111. } catch (Exception e) {
  112. e.printStackTrace();
  113. }
  114. return null;
  115. }
  116. /**
  117. * 解密
  118. */
  119. private static byte[] decrypt(String key, byte[] encrypted) throws Exception {
  120. byte[] raw = getRawKey(key.getBytes());
  121. SecretKeySpec skeySpec = new SecretKeySpec(raw, AES);
  122. Cipher cipher = Cipher.getInstance(CBC_PKCS5_PADDING);
  123. cipher.init(Cipher.DECRYPT_MODE, skeySpec, new IvParameterSpec(new byte[cipher.getBlockSize()]));
  124. byte[] decrypted = cipher.doFinal(encrypted);
  125. return decrypted;
  126. }
  127. //二进制转字符
  128. public static String toHex(byte[] buf) {
  129. if (buf == null)
  130. return "";
  131. StringBuffer result = new StringBuffer(2 * buf.length);
  132. for (int i = 0; i < buf.length; i++) {
  133. appendHex(result, buf[i]);
  134. }
  135. return result.toString();
  136. }
  137. private static void appendHex(StringBuffer sb, byte b) {
  138. sb.append(HEX.charAt((b >> 4) & 0x0f)).append(HEX.charAt(b & 0x0f));
  139. }
  140. // 增加 CryptoProvider 类
  141. public static class CryptoProvider extends Provider {
  142. /**
  143. * Creates a Provider and puts parameters
  144. */
  145. public CryptoProvider() {
  146. super("Crypto", 1.0, "HARMONY (SHA1 digest; SecureRandom; SHA1withDSA signature)");
  147. put("SecureRandom.SHA1PRNG",
  148. "org.apache.harmony.security.provider.crypto.SHA1PRNG_SecureRandomImpl");
  149. put("SecureRandom.SHA1PRNG ImplementedIn", "Software");
  150. }
  151. }
  152. }

调用方法


  
  1. String jsonData = "{\"activation_result\":-2,\"member_username\":\"qwe\",\"member_expirationtime\":0}";
  2. Log.e("MainActivity", "AES加密前json数据 ---->" + jsonData);
  3. Log.e("MainActivity", "AES加密前json数据长度 ---->" + jsonData.length());
  4. //生成一个动态key
  5. String secretKey = AESUtils.generateKey();
  6. Log.e("MainActivity", "AES动态secretKey ---->" + secretKey);
  7. //AES加密
  8. long start = System.currentTimeMillis();
  9. String encryStr = AESUtils.encrypt(secretKey, jsonData);
  10. long end = System.currentTimeMillis();
  11. Log.e("MainActivity", "AES加密耗时 cost time---->" + (end - start));
  12. Log.e("MainActivity", "AES加密后json数据 ---->" + encryStr);
  13. Log.e("MainActivity", "AES加密后json数据长度 ---->" + encryStr.length());
  14. //AES解密
  15. start = System.currentTimeMillis();
  16. String decryStr = AESUtils.decrypt(secretKey, encryStr);
  17. end = System.currentTimeMillis();
  18. Log.e("MainActivity", "AES解密耗时 cost time---->" + (end - start));
  19. Log.e("MainActivity", "AES解密后json数据 ---->" + decryStr);

 

文章来源: blog.csdn.net,作者:fengda2870,版权归原作者所有,如需转载,请联系作者。

原文链接:blog.csdn.net/fengda2870/article/details/104771485

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。