javax.crypto.IllegalBlockSizeException:最后块在解密中不完整 - 解密加密的AES字符串 [英] javax.crypto.IllegalBlockSizeException: last block incomplete in decryption - Decrypting an encrypted AES String

查看:5975
本文介绍了javax.crypto.IllegalBlockSizeException:最后块在解密中不完整 - 解密加密的AES字符串的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我尝试解密从后端服务器接收的字符串〜9?8?m?=?T?G OpenSSL使用AES-256-CBC加密字符串。有代码块:

  public static String decryptText(String textToDecrypt){
try {

byte [] base64TextToDecrypt = Base64.encodeBase64(textToDecrypt.getBytes(UTF-8));

byte [] guid =fjakdsjkld; asfj.getBytes(UTF-8);

byte [] iv = new byte [16];
System.arraycopy(guid,0,iv,0,guid.length);
IvParameterSpec ips = new IvParameterSpec(iv);

byte [] secret = DECRYPTION_SECRET_HASH.getBytes(UTF-8);
SecretKeySpec secretKey = new SecretKeySpec(secret,AES);

密码密码= Cipher.getInstance(AES / CBC / PKCS5Padding);
//解密pass
cipher.init(Cipher.DECRYPT_MODE,secretKey,ips);
byte [] converted = cipher.doFinal(base64TextToDecrypt);
System.out.println(new String(converted));

} catch(异常e){
e.printStackTrace();
Log.e(TAG,Decipher error for+ textToDecrypt,e);
}
return;不幸的是,当我到达









$ b < b $ b

  byte [] converted = cipher.doFinal(base64TextToDecrypt); 

语句抛出以下异常:

  javax.crypto.IllegalBlockSizeException:最后一个块在解密中不完整

任何想法?

解决方案

您应该解码字符串而不是编码平台特定的字符串表示

  byte [] base64TextToDecrypt = Base64.decodeBase64(textToDecrypt); 

或更准确地说:

  byte [] bytesToDecrypt = Base64(base64TextToDecrypt); 




>一般来说,每次你(感觉你必须)使用 String.getBytes():byte [] 方法或 String [])构造函数你可能做错了。您应该首先考虑您要做什么,并指定

在您的情况下,您可以使用 code> converted 变量可能是字符编码的。所以你可以使用下面的片段:

  String plainText = new String(converted,Charset.forName(UTF8)) ; 
System.out.println(plainText);

而不是您现在所拥有的。


I am trying to decrypt the string "~9?8?m???=?T?G" that I receive from a back-end server which uses OpenSSL to encrypt the String using AES-256-CBC. There is the code block:

public static String decryptText(String textToDecrypt) {
    try {

        byte[] base64TextToDecrypt = Base64.encodeBase64(textToDecrypt.getBytes("UTF-8"));

        byte[] guid = "fjakdsjkld;asfj".getBytes("UTF-8");

        byte[] iv = new byte[16];
        System.arraycopy(guid, 0, iv, 0, guid.length);
        IvParameterSpec ips = new IvParameterSpec(iv);

        byte[] secret = DECRYPTION_SECRET_HASH.getBytes("UTF-8");
        SecretKeySpec secretKey = new SecretKeySpec(secret, "AES");

        Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
        // decryption pass
        cipher.init(Cipher.DECRYPT_MODE, secretKey, ips);
        byte[] converted = cipher.doFinal(base64TextToDecrypt);
        System.out.println(new String(converted));

    } catch (Exception e) {
        e.printStackTrace();
        Log.e(TAG, "Decipher error for " + textToDecrypt, e);
    }
    return "";
}

Unfortunately, when I get to the

byte[] converted = cipher.doFinal(base64TextToDecrypt);

statement the following exception is thrown:

javax.crypto.IllegalBlockSizeException: last block incomplete in decryption

Any ideas?

解决方案

You should decode the string instead of encoding the platform specific representation of the string, right at the start of your method.

byte[] base64TextToDecrypt = Base64.decodeBase64(textToDecrypt);

or more precisely:

byte[] bytesToDecrypt = Base64(base64TextToDecrypt);

if you name your variables correctly.

In general, each time you (feel like you have to) use the String.getBytes(): byte[] method or the String(byte[]) constructor you are likely doing something wrong. You should first think about what you are trying to do, and specify a if you do need to use it.

In your case, the output in the converted variable is probably character-encoded. So you you could use the following fragment:

String plainText = new String(converted, Charset.forName("UTF8"));
System.out.println(plainText);

instead of what you have now.

这篇关于javax.crypto.IllegalBlockSizeException:最后块在解密中不完整 - 解密加密的AES字符串的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
相关文章
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆