Android AES加密解密

fv6688 8年前
   <p>补齐方式采用的是:不足16字节,补齐内容为差值(比如数据是10个字节,补齐的内容就是6)。</p>    <pre>  <code class="language-java">import javax.crypto.Cipher;    import javax.crypto.spec.SecretKeySpec;      /**    * AES加密解密工具    *     * @author yangle    */    public class AESUtils {          /**        * AES加密        *         * @param data        *            将要加密的内容        * @param key        *            密钥        * @return 已经加密的内容        */        public static byte[] encrypt(byte[] data, byte[] key) {            //不足16字节,补齐内容为差值            int len = 16 - data.length % 16;            for (int i = 0; i < len; i++) {                byte[] bytes = { (byte) len };                data = ArrayUtils.concat(data, bytes);            }            try {                SecretKeySpec skeySpec = new SecretKeySpec(key, "AES");                Cipher cipher = Cipher.getInstance("AES/ECB/NoPadding");                cipher.init(Cipher.ENCRYPT_MODE, skeySpec);                return cipher.doFinal(data);            } catch (Exception e) {                e.printStackTrace();            }            return new byte[] {};        }          /**        * AES解密        *         * @param data        *            将要解密的内容        * @param key        *            密钥        * @return 已经解密的内容        */        public static byte[] decrypt(byte[] data, byte[] key) {            data = ArrayUtils.noPadding(data, -1);            try {                SecretKeySpec skeySpec = new SecretKeySpec(key, "AES");                Cipher cipher = Cipher.getInstance("AES/ECB/NoPadding");                cipher.init(Cipher.DECRYPT_MODE, skeySpec);                byte[] decryptData = cipher.doFinal(data);                int len = 2 + ByteUtils.byteToInt(decryptData[4]) + 3;                return ArrayUtils.noPadding(decryptData, len);            } catch (Exception e) {                e.printStackTrace();            }            return new byte[] {};        }    }</code></pre>    <p>合并数组与去除补齐工具</p>    <pre>  <code class="language-java">/**    * 数组工具    *     * @author yangle    */    public class ArrayUtils {          /**        * 合并数组        *         * @param firstArray        *            第一个数组        * @param secondArray        *            第二个数组        * @return 合并后的数组        */        public static byte[] concat(byte[] firstArray, byte[] secondArray) {            if (firstArray == null || secondArray == null) {                return null;            }            byte[] bytes = new byte[firstArray.length + secondArray.length];            System.arraycopy(firstArray, 0, bytes, 0, firstArray.length);            System.arraycopy(secondArray, 0, bytes, firstArray.length,                    secondArray.length);            return bytes;        }          /**        * 去除数组中的补齐        *         * @param paddingBytes        *            源数组        * @param dataLength        *            去除补齐后的数据长度        * @return 去除补齐后的数组        */        public static byte[] noPadding(byte[] paddingBytes, int dataLength) {            if (paddingBytes == null) {                return null;            }              byte[] noPaddingBytes = null;            if (dataLength > 0) {                if (paddingBytes.length > dataLength) {                    noPaddingBytes = new byte[dataLength];                    System.arraycopy(paddingBytes, 0, noPaddingBytes, 0, dataLength);                } else {                    noPaddingBytes = paddingBytes;                }            } else {                int index = paddingIndex(paddingBytes);                if (index > 0) {                    noPaddingBytes = new byte[index];                    System.arraycopy(paddingBytes, 0, noPaddingBytes, 0, index);                }            }              return noPaddingBytes;        }          /**        * 获取补齐的位置        *         * @param paddingBytes        *            源数组        * @return 补齐的位置        */        private static int paddingIndex(byte[] paddingBytes) {            for (int i = paddingBytes.length - 1; i >= 0; i--) {                if (paddingBytes[i] != 0) {                    return i + 1;                }            }            return -1;        }    }</code></pre>    <p> </p>    <p>来自:http://www.jianshu.com/p/dd2ae6166532</p>    <p> </p>