package com.xiaomi.xms.sales.util; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.IOException; import java.io.InputStream; import java.security.InvalidAlgorithmParameterException; import java.security.InvalidKeyException; import java.security.MessageDigest; import java.security.NoSuchAlgorithmException; import javax.crypto.BadPaddingException; import javax.crypto.Cipher; import javax.crypto.IllegalBlockSizeException; import javax.crypto.NoSuchPaddingException; import javax.crypto.spec.IvParameterSpec; import javax.crypto.spec.SecretKeySpec; import android.text.TextUtils; import android.util.Base64; public class Coder { public static final String AES_ALGORITHM = "AES/CBC/PKCS5Padding"; private final static String[] hexDigits = { "0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "a", "b", "c", "d", "e", "f" }; public static final String encodeMD5(String string) { if (TextUtils.isEmpty(string)) { return null; } MessageDigest digester = null; try { digester = MessageDigest.getInstance("MD5"); } catch (NoSuchAlgorithmException e) { e.printStackTrace(); return null; } digester.update(string.getBytes()); byte[] digest = digester.digest(); return byteArrayToString(digest); } public static final String encodeMD5(File file) { InputStream fis; byte[] buffer = new byte[1024]; int numRead = 0; MessageDigest md5; try { fis = new FileInputStream(file); } catch (FileNotFoundException e) { e.printStackTrace(); return null; } try { md5 = MessageDigest.getInstance("MD5"); while ((numRead = fis.read(buffer)) > 0) { md5.update(buffer, 0, numRead); } } catch (NoSuchAlgorithmException e) { e.printStackTrace(); return null; } catch (IOException e) { e.printStackTrace(); return null; } finally { try { fis.close(); } catch (IOException e) { e.printStackTrace(); } } return byteArrayToString(md5.digest()); } private static String byteArrayToString(byte[] b) { StringBuffer resultSb = new StringBuffer(); for (int i = 0; i < b.length; i++) { resultSb.append(byteToHexString(b[i])); } return resultSb.toString(); } private static String byteToHexString(byte b) { int n = b; if (n < 0) { n = 256 + n; } int d1 = n / 16; int d2 = n % 16; return hexDigits[d1] + hexDigits[d2]; } public static final String encodeSHA(String string) { if (TextUtils.isEmpty(string)) { return null; } MessageDigest digester = null; try { digester = MessageDigest.getInstance("SHA"); } catch (NoSuchAlgorithmException e) { e.printStackTrace(); return null; } digester.update(string.getBytes()); byte[] digest = digester.digest(); return byteArrayToString(digest); } public static final byte[] encodeSHABytes(String string) { if (TextUtils.isEmpty(string)) { return null; } MessageDigest digester = null; try { digester = MessageDigest.getInstance("SHA"); } catch (NoSuchAlgorithmException e) { e.printStackTrace(); return null; } digester.update(string.getBytes()); return digester.digest(); } public static final String encodeBase64(String string) { return Base64.encodeToString(string.getBytes(), Base64.DEFAULT | Base64.NO_WRAP); } public static final String encodeBase64(byte[] bytes) { return Base64.encodeToString(bytes, Base64.DEFAULT | Base64.NO_WRAP); } public static final byte[] encodeBase64Bytes(String string) { return Base64 .encode(string.getBytes(), Base64.DEFAULT | Base64.NO_WRAP); } public static final String decodeBase64(String string) { return new String(Base64.decode(string, Base64.DEFAULT)); } public static final byte[] decodeBase64Bytes(String string) { return Base64.decode(string, Base64.DEFAULT); } /** * 返回经过AES加密和base64编码后的数据 */ public static final String encodeAES(String data, String key) { if (TextUtils.isEmpty(data) || TextUtils.isEmpty(key)) { return null; } byte[] raw = decodeBase64Bytes(key); if (raw == null || raw.length != 16) { return null; } SecretKeySpec keySpec = new SecretKeySpec(raw, "AES"); try { Cipher cipher = Cipher.getInstance(AES_ALGORITHM); IvParameterSpec iv = new IvParameterSpec( "0102030405060708".getBytes()); cipher.init(Cipher.ENCRYPT_MODE, keySpec, iv); return encodeBase64(cipher.doFinal(data.getBytes())); } catch (NoSuchAlgorithmException e) { return null; } catch (NoSuchPaddingException e) { return null; } catch (InvalidKeyException e) { return null; } catch (InvalidAlgorithmParameterException e) { return null; } catch (IllegalBlockSizeException e) { return null; } catch (BadPaddingException e) { return null; } } /** * 返回经过base64解码和AES解密后的数据 */ public static final String decodeAES(String data, String key) { if (TextUtils.isEmpty(data) || TextUtils.isEmpty(key)) { return null; } byte[] raw = decodeBase64Bytes(key); if (raw == null || raw.length != 16) { return null; } SecretKeySpec keySpec = new SecretKeySpec(raw, "AES"); try { Cipher cipher = Cipher.getInstance(AES_ALGORITHM); IvParameterSpec iv = new IvParameterSpec( "0102030405060708".getBytes()); cipher.init(Cipher.DECRYPT_MODE, keySpec, iv); byte[] encryptedByte = decodeBase64Bytes(data); if (null == encryptedByte) { return null; } byte[] decryptedByte = cipher.doFinal(encryptedByte); return new String(decryptedByte); } catch (NoSuchAlgorithmException e) { return null; } catch (NoSuchPaddingException e) { return null; } catch (InvalidKeyException e) { return null; } catch (InvalidAlgorithmParameterException e) { return null; } catch (IllegalBlockSizeException e) { return null; } catch (BadPaddingException e) { return null; } } }