Blame view

src/com/ectrip/cyt/utils/AESEncryptor.java 3.36 KB
3c2353cd   杜方   1、畅游通核销app源码提交;
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
  package com.ectrip.cyt.utils;
  
  import android.nfc.Tag;
  import android.os.Build;
  
  import java.nio.charset.StandardCharsets;
  import java.security.SecureRandom;
  
  import javax.crypto.Cipher;
  import javax.crypto.KeyGenerator;
  import javax.crypto.SecretKey;
  import javax.crypto.spec.SecretKeySpec;
  
  /**
   * AES加密类
   */
  public class AESEncryptor {
      /**
       * AES加密
       */
      public static String encrypt(String seed, String cleartext)
              throws Exception {
          byte[] rawKey = getRawKey(seed.getBytes());
          byte[] result = encrypt(rawKey, cleartext.getBytes());
          return toHex(result);
      }
  
      /**
       * AES解密
       */
      public static String decrypt(String seed, String encrypted)
              throws Exception {
          byte[] rawKey = getRawKey(seed.getBytes());
          byte[] enc = toByte(encrypted);
          byte[] result = decrypt(rawKey, enc);
          return new String(result);
      }
  
      private static byte[] getRawKey(byte[] seed) throws Exception {
  
  		SecureRandom sr = null;
  		int targetSdkVersion = android.os.Build.VERSION.SDK_INT;
  		LogUtil.i("SDK","targetSdkVersion == " + targetSdkVersion);
  		if (targetSdkVersion >= 28) {
  			return InsecureSHA1PRNGKeyDerivator.deriveInsecureKey(seed, 32);
  		} else if (targetSdkVersion >= 24 && targetSdkVersion < 28) {
  			sr = SecureRandom.getInstance("SHA1PRNG", new CryptoProvider());
  		} else {
  //		SecureRandom sr = SecureRandom.getInstance("SHA1PRNG");
  			sr = SecureRandom.getInstance("SHA1PRNG", "Crypto");
  		}
  		sr.setSeed(seed);
  		KeyGenerator kgen = KeyGenerator.getInstance("AES");
  		kgen.init(128, sr); // 192 and 256 bits may not be available
          SecretKey skey = kgen.generateKey();
          byte[] raw = skey.getEncoded();
          return raw;
      }
  
      private static byte[] encrypt(byte[] raw, byte[] clear) throws Exception {
          SecretKeySpec skeySpec = new SecretKeySpec(raw, "AES");
          Cipher cipher = Cipher.getInstance("AES");
          cipher.init(Cipher.ENCRYPT_MODE, skeySpec);
          byte[] encrypted = cipher.doFinal(clear);
          return encrypted;
      }
  
      private static byte[] decrypt(byte[] raw, byte[] encrypted)
              throws Exception {
          SecretKeySpec skeySpec = new SecretKeySpec(raw, "AES");
          Cipher cipher = Cipher.getInstance("AES");
          cipher.init(Cipher.DECRYPT_MODE, skeySpec);
          byte[] decrypted = cipher.doFinal(encrypted);
          return decrypted;
      }
  
      public static String toHex(String txt) {
          return toHex(txt.getBytes());
      }
  
      public static String fromHex(String hex) {
          return new String(toByte(hex));
      }
  
      public static byte[] toByte(String hexString) {
          int len = hexString.length() / 2;
          byte[] result = new byte[len];
          for (int i = 0; i < len; i++)
              result[i] = Integer.valueOf(hexString.substring(2 * i, 2 * i + 2),
                      16).byteValue();
          return result;
      }
  
      public static String toHex(byte[] buf) {
          if (buf == null)
              return "";
          StringBuffer result = new StringBuffer(2 * buf.length);
          for (int i = 0; i < buf.length; i++) {
              appendHex(result, buf[i]);
          }
          return result.toString();
      }
  
      private final static String HEX = "0123456789ABCDEF";
  
      private static void appendHex(StringBuffer sb, byte b) {
          sb.append(HEX.charAt((b >> 4) & 0x0f)).append(HEX.charAt(b & 0x0f));
      }
  }