建议和反馈

请填写你的反馈内容

问答 > 密码学 > 问答详情
已解决

javax.crypto.IllegalBlockSizeException:解密时最后一个块不完整10LK

我正在开发一个android项目,我必须从PHP服务器中的文件解密字符串,使用PHP完成加密。(AES 128算法)

加密代码:

 function aes128Encrypt($key, $data) {
      $key = md5($key);
      return mcrypt_encrypt(MCRYPT_RIJNDAEL_128, $key, $data, MCRYPT_MODE_CBC, str_repeat("\0", 16));
    }

我从URL获取字符串的代码:

String myUri = "http://www.example.com/lib2.php";
HttpClient httpClient = new DefaultHttpClient();
HttpGet get = new HttpGet(myUri);

HttpResponse response = httpClient.execute(get);

String bodyHtml = "";
String xmlFile = "";
bodyHtml = EntityUtils.toString(response.getEntity());
System.out.println(bodyHtml);
xmlFile = decrypt(bodyHtml);
System.out.println(xmlFile);

decrypt()方法:

public static String decrypt(String encData) throws Exception
    {
        Key key = generateKey();

        Cipher c = Cipher.getInstance(algo + "/CBC/PKCS7Padding");

        //Cipher c = Cipher.getInstance(algo);

        IvParameterSpec ivSpec = new IvParameterSpec(ivbytes);

        c.init(Cipher.DECRYPT_MODE, key , ivSpec);

        //byte[] decValue = Base64.decode(encData , Base64.NO_PADDING);

        //byte[] decFin = Base64.decode(decValue, Base64.NO_PADDING);

        //byte[] decFinal = c.doFinal(decValue);

        byte[] decFinal = c.doFinal(encData.getBytes());

        String getAns = new String(decFinal, "UTF8");

        return getAns;
    }

在generateKey()中:

public static Key generateKey()
    {

        try {
            MessageDigest digest = java.security.MessageDigest
                    .getInstance("MD5");

            digest.update(myChar.getBytes());

            key1 = digest.digest();

        } catch (NoSuchAlgorithmException e) {
            e.printStackTrace();
        }



        Key key = new SecretKeySpec(key1,algo);     
        return key;
    }
}

Logcat显示以下异常:

javax.crypto.IllegalBlockSizeException: last block incomplete in decryption

c.doFinal()

我注释掉的代码也是我用来检查的代码。 这段代码有什么问题? 任何帮助将不胜感激。


2019-08-23
0
请先登陆或注册

德玛西亚2019-08-23

问题可能是您将PHP服务器中的值视为Java String 。 PHP mcrypt_encrypt函数返回一个二进制字符串,其中每个字节可以包含任何值。 PHP mcrypt_encrypt不使用任何字符编码。 所以使用EntityUtils.toString()已经是一个错误 - 并且使用String.getBytes()而不指定编码通常也是如此。

您只需要使用getContent()writeTo(OutputStream outstream)来获取二进制密文。 如果您选择第一个选项,则可以围绕它包装CipherInputStream 。 使用"AES/CBC/NoPadding"密码对其进行初始化,您可以直接解密纯文本字符串。 请注意,您可能必须从结果中修剪一定数量的00值字节才能获得明文。


投一票
评论(0)
赞赏(0)
邀请

感谢您的善举,每一次解答会成为新人的灯塔,回答被采纳后获得20算力和相应的LK币奖励