有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

Android中AES的java解密算法

public static String Encrypt(String text){
    try {           
        Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
        byte[] keyBytes= new byte[16];
        byte[] b= KEY.getBytes("UTF-8");
        int len= b.length;
        if (len > keyBytes.length) len = keyBytes.length;
        System.arraycopy(b, 0, keyBytes, 0, len);
        SecretKeySpec keySpec = new SecretKeySpec(keyBytes, "AES");
        IvParameterSpec ivSpec = new IvParameterSpec(keyBytes);
        cipher.init(Cipher.ENCRYPT_MODE,keySpec,ivSpec);

        byte[] results = cipher.doFinal(text.getBytes("UTF-8"));
        String result = Base64.encodeToString(results, 0);
        //result = URLEncoder.encode(result.trim(),"UTF-8");
        return result;

    } catch (Exception e) {
        // TODO: handle exception
        return null;
    }
}   

public static String Decrypt(String text){
    try {           
        Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
        byte[] keyBytes= new byte[16];
        byte[] b= KEY.getBytes("UTF-8");
        int len= b.length;
        if (len > keyBytes.length) len = keyBytes.length;
        System.arraycopy(b, 0, keyBytes, 0, len);
        SecretKeySpec keySpec = new SecretKeySpec(keyBytes, "AES");
        IvParameterSpec ivSpec = new IvParameterSpec(keyBytes);
        cipher.init(Cipher.DECRYPT_MODE,keySpec,ivSpec);
        byte[] results = cipher.doFinal(text.getBytes("UTF-8"));
        String result = Base64.encodeToString(results, 0);
        //result = URLEncoder.encode(result.trim(),"UTF-8");
        return result;

    } catch (Exception e) {
        // TODO: handle exception
        Log.d("decryption", e.getMessage());
        return null;
    }
}   

这是加密和解密的代码,我从另一个问题得到了加密算法,它对我来说很好,但我也需要解密,我试着像加密一样模拟它,但它不起作用。异常显示最后一个块未完成


共 (1) 个答案

  1. # 1 楼答案

    问题是你没有按相反的顺序执行相反的顺序。你最终得到了base64编码的数据——所以你需要做的第一件事是base64解码,以获得二进制加密数据。然后解密,然后使用UTF-8将其转换回字符串

    public static String decrypt(String text){
        try {           
            Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
            byte[] keyBytes= new byte[16];
            byte[] b= KEY.getBytes("UTF-8");
            int len= b.length;
            if (len > keyBytes.length) len = keyBytes.length;
            System.arraycopy(b, 0, keyBytes, 0, len);
            SecretKeySpec keySpec = new SecretKeySpec(keyBytes, "AES");
            IvParameterSpec ivSpec = new IvParameterSpec(keyBytes);
            cipher.init(Cipher.DECRYPT_MODE,keySpec,ivSpec);
            byte[] results = cipher.doFinal(Base64.decode(text, 0));
            return new String(results, "UTF-8");
        } catch (Exception e) {
            // TODO: handle exception
            Log.d("decryption", e.getMessage());
            return null;
        }
    }   
    

    当你从某个地方获取代码时,真正理解它在做什么是很重要的,尤其是要理解每个阶段的数据是什么样的:

    • 从纯文本开始
    • UTF-8将其编码为字节数组
    • 加密到另一个字节数组(它不是UTF-8编码的文本)
    • Base64将加密的二进制数据编码为字符串

    任何时候你在做这样的转换,当你想要反转它时,你也需要反转步骤的顺序,以便回到原始数据