您的位置:首页 > 移动开发 > Android开发

关于Android中使用AES加密解密的问题

2015-10-09 09:10 573 查看
当你百度java怎么进行aes加密、解密时,会百度到很多这样的代码

代码一(部分):

public static String encode(String key, String src) throws Exception {

            byte[] rawKey = getRawKey(key.getBytes());

            byte[] result = encode(rawKey, src.getBytes());

            return toHex(result);

        }

        public static String decode(String key, String src) throws Exception {

            byte[] rawKey = getRawKey(key.getBytes());

            byte[] enc = toByte(src);

            byte[] result = decode(rawKey, enc);

            return new String(result);

        }

        private static byte[] getRawKey(byte[] key) throws Exception {

            KeyGenerator kgen = KeyGenerator.getInstance("AES");

            SecureRandom sr = SecureRandom.getInstance("SHA1PRNG");

            sr.setSeed(key);

            kgen.init(128, sr); // 192 and 256 bits may not be available

            SecretKey skey = kgen.generateKey();

            byte[] raw = skey.getEncoded();

            return raw;

        }

这种代码,在java里面使用,可以正常运行。

但是当放在Android平台,解密的时候,会报错(错误信息忘记了)

于是百度到得解决方法是这样的

把private static byte[] getRawKey(byte[] key){}方法里面的

SecureRandom sr = SecureRandom.getInstance("SHA1PRNG");

改为

SecureRandom sr = SecureRandom.getInstance("SHA1PRNG", "Crypto");

修改之后发现,Android可以正常加、解密;可是如果Android负责加密、java后台负责解密,就没法正常运行了。

错误信息是java.security.NoSuchProviderException: no such provider: Crypto

所以经过几番查找资料,修改代码,找到了完整的加、解密算法

代码二(完整的AES加、解密代码):

public class AESEncryptorUtils {

    private static final String IV = "qws871bz73msl9x8";// 必须是随机的16位字符串

    private static final String ALGORITHM = "AES/CBC/PKCS5Padding";

    private static SecretKeySpec getKey(String strKey) throws Exception {

        byte[] arrBTmp = strKey.getBytes();

        byte[] arrB = new byte[16]; // 创建一个空的16位字节数组(默认值为0)

        for (int i = 0; i < arrBTmp.length && i < arrB.length; i++) {

            arrB[i] = arrBTmp[i];

        }

        SecretKeySpec skeySpec = new SecretKeySpec(arrB, "AES");

        return skeySpec;

    }

    /**

     * 加密

     *

     * @param data

     * @return

     */

    public static String encrypt(String data, String KEY) {

        try {

            String encryptKey = KEY;

            SecretKeySpec skeySpec = getKey(encryptKey);

            Cipher cipher = Cipher.getInstance(ALGORITHM);

            IvParameterSpec iv = new IvParameterSpec(IV.getBytes());

            cipher.init(Cipher.ENCRYPT_MODE, skeySpec, iv);

            byte[] encrypted = cipher.doFinal(data.getBytes());

            return parseByte2HexStr(encrypted);

        } catch (Exception e) {

            return "";

        }

    }

    /**

     * 解密

     *

     * @param data

     * @return

     */

    public static String decrypt(String data, String KEY) {

        try {

            // System.out.println("key:"+key);

            String decryptKey = KEY;

            // System.out.println("decryptKey:"+decryptKey);

            SecretKeySpec skeySpec = getKey(decryptKey);

            Cipher cipher = Cipher.getInstance(ALGORITHM);

            IvParameterSpec iv = new IvParameterSpec(IV.getBytes());

            cipher.init(Cipher.DECRYPT_MODE, skeySpec, iv);

            byte[] encrypted1 = parseHexStr2Byte(data);

            // System.out.println("encrypted1:"+encrypted1.toString());

            // System.out.println("encrypted1:"+new String(encrypted1));

            byte[] original = cipher.doFinal(encrypted1);

            // System.out.println("original:"+new String(original));

            String originalString = new String(original);

            return originalString;

        } catch (Exception e) {

            return "";

        }

    }

    /**

     * 将二进制转换成16进制

     *

     * @param buf

     * @return

     */

    public static String parseByte2HexStr(byte buf[]) {

        StringBuilder sb = new StringBuilder();

        for (int i = 0; i < buf.length; i++) {

            String hex = Integer.toHexString(buf[i] & 0xFF);

            if (hex.length() == 1) {

                hex = '0' + hex;

            }

            sb.append(hex.toUpperCase());

        }

        return sb.toString();

    }

    /**

     * 将16进制转换为二进制

     *

     * @param hexStr

     * @return

     */

    public static byte[] parseHexStr2Byte(String hexStr) {

        if (hexStr.length() < 1)

            return null;

        byte[] result = new byte[hexStr.length() / 2];

        for (int i = 0; i < hexStr.length() / 2; i++) {

            int high = Integer.parseInt(hexStr.substring(i * 2, i * 2 + 1), 16);

            int low = Integer.parseInt(hexStr.substring(i * 2 + 1, i * 2 + 2),

                    16);

            result[i] = (byte) (high * 16 + low);

        }

        return result;

    }

}

重点在于这两个变量的申明和使用

private static final String IV = "qws871bz73msl9x8";// 必须是随机的16位字符串

private static final String ALGORITHM = "AES/CBC/PKCS5Padding";
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  aec android java 解密 加密