android系统AES解密服务器加密数据错误解决方案

之前的做了一个外包项目,里边有一些敏感的信息需要AES加密,但是同样的代码在服务器就可以加密解密,在android系统中就解密失败,会出现pad block corrupted错误,下面给出解决方案, 亲测无问题!

 

AES.java

public class AES {

 

public static final String VIPARA = "0123456789abcdef";  

public static final String bm = "UTF-8";  

 

public static String encrypt(String dataPassword, String cleartext)

throws Exception {

IvParameterSpec zeroIv = new IvParameterSpec(VIPARA.getBytes());

SecretKeySpec key = new SecretKeySpec(dataPassword.getBytes(), "AES");

Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");

cipher.init(Cipher.ENCRYPT_MODE, key, zeroIv);

byte[] encryptedData = cipher.doFinal(cleartext.getBytes(bm));

 

return BASE64.encode(encryptedData);

}

 

public static String decrypt(String dataPassword, String encrypted)

throws Exception {

byte[] byteMi = BASE64.decode(encrypted);

IvParameterSpec zeroIv = new IvParameterSpec(VIPARA.getBytes());

SecretKeySpec key = new SecretKeySpec(dataPassword.getBytes(), "AES");

Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");

cipher.init(Cipher.DECRYPT_MODE, key, zeroIv);

byte[] decryptedData = cipher.doFinal(byteMi);

 

return new String(decryptedData,bm);

}

}

 

 

BASE64.java

 

public class BASE64 {

private static final char[] legalChars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/".toCharArray();

/**

* data[]进行编码

* @param data

* @return

*/

    public static String encode(byte[] data) {

        int start = 0;

        int len = data.length;

        StringBuffer buf = new StringBuffer(data.length * 3 / 2);

 

        int end = len - 3;

        int i = start;

        int n = 0;

 

        while (i <= end) {

            int d = ((((int) data[i]) & 0x0ff) << 16)

                    | ((((int) data[i + 1]) & 0x0ff) << 8)

                    | (((int) data[i + 2]) & 0x0ff);

 

            buf.append(legalChars[(d >> 18) & 63]);

            buf.append(legalChars[(d >> 12) & 63]);

            buf.append(legalChars[(d >> 6) & 63]);

            buf.append(legalChars[d & 63]);

 

            i += 3;

 

            if (n++ >= 14) {

                n = 0;

                buf.append(" ");

            }

        }

 

        if (i == start + len - 2) {

            int d = ((((int) data[i]) & 0x0ff) << 16)

                    | ((((int) data[i + 1]) & 255) << 8);

 

            buf.append(legalChars[(d >> 18) & 63]);

            buf.append(legalChars[(d >> 12) & 63]);

            buf.append(legalChars[(d >> 6) & 63]);

            buf.append("=");

        } else if (i == start + len - 1) {

            int d = (((int) data[i]) & 0x0ff) << 16;

 

            buf.append(legalChars[(d >> 18) & 63]);

            buf.append(legalChars[(d >> 12) & 63]);

            buf.append("==");

        }

 

        return buf.toString();

    }

 

    private static int decode(char c) {

        if (c >= ‘A‘ && c <= ‘Z‘)

            return ((int) c) - 65;

        else if (c >= ‘a‘ && c <= ‘z‘)

            return ((int) c) - 97 + 26;

        else if (c >= ‘0‘ && c <= ‘9‘)

            return ((int) c) - 48 + 26 + 26;

        else

            switch (c) {

            case ‘+‘:

                return 62;

            case ‘/‘:

                return 63;

            case ‘=‘:

                return 0;

            default:

                throw new RuntimeException("unexpected code: " + c);

            }

    }

 

    /**

    * Decodes the given Base64 encoded String to a new byte array. The byte

    * array holding the decoded data is returned.

    */

 

    public static byte[] decode(String s) {

 

        ByteArrayOutputStream bos = new ByteArrayOutputStream();

        try {

            decode(s, bos);

        } catch (IOException e) {

            throw new RuntimeException();

        }

        byte[] decodedBytes = bos.toByteArray();

        try {

            bos.close();

            bos = null;

        } catch (IOException ex) {

            System.err.println("Error while decoding BASE64: " + ex.toString());

        }

        return decodedBytes;

    }

 

    private static void decode(String s, OutputStream os) throws IOException {

        int i = 0;

 

        int len = s.length();

 

        while (true) {

            while (i < len && s.charAt(i) <= ‘ ‘)

                i++;

 

            if (i == len)

                break;

 

            int tri = (decode(s.charAt(i)) << 18)

                    + (decode(s.charAt(i + 1)) << 12)

                    + (decode(s.charAt(i + 2)) << 6)

                    + (decode(s.charAt(i + 3)));

 

            os.write((tri >> 16) & 255);

            if (s.charAt(i + 2) == ‘=‘)

                break;

            os.write((tri >> 8) & 255);

            if (s.charAt(i + 3) == ‘=‘)

                break;

            os.write(tri & 255);

 

            i += 4;

        }

    }

   

}

android系统AES解密服务器加密数据错误解决方案,布布扣,bubuko.com

android系统AES解密服务器加密数据错误解决方案

上一篇:Android自定义控件的实现步骤(一)


下一篇:教你使用Android SDK布局优化工具layoutopt