Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/191.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 异常:错误的最终块长度…aes解密_Java_Android_Encryption - Fatal编程技术网

Java 异常:错误的最终块长度…aes解密

Java 异常:错误的最终块长度…aes解密,java,android,encryption,Java,Android,Encryption,我试图实现的是AES CBC解密 使用 我不是一个真正的android开发人员,下面的代码不必是100%安全的(仅举一个例子) 加密工作很好,但我真的被解密卡住了: 带有:AESCrypt.decrypt(key2,ivBytes,todecode)的行 抛出异常 我认为问题在于“key2”和“todecode”变量的实际数据转换。。。有人知道我错过了什么吗 设置: private static final String TAG = "AESCrypt"; // AESCr

我试图实现的是AES CBC解密 使用

我不是一个真正的android开发人员,下面的代码不必是100%安全的(仅举一个例子) 加密工作很好,但我真的被解密卡住了:

带有:
AESCrypt.decrypt(key2,ivBytes,todecode)的行
抛出异常
我认为问题在于“key2”和“todecode”变量的实际数据转换。。。有人知道我错过了什么吗

设置:

private static final String TAG = "AESCrypt";

// AESCrypt-ObjC uses CBC and PKCS7Padding
private static final String AES_MODE = "AES/CBC/PKCS7Padding";
private static final String CHARSET = "UTF-8";

// AESCrypt-ObjC uses SHA-256 (and so a 256-bit key)
private static final String HASH_ALGORITHM = "SHA-256";





    byte[] key = hexStringToByteArray("E0E1E2E3E5E6E7E8EAEBECEDEFF0F1F2");
    SecretKeySpec key2 = new SecretKeySpec(key, 0, key.length, "AES");
    byte[] ivBytes = hexStringToByteArray("12CEC438810CFA399A81139AF7D648BC");
    byte[] todecode = Base64.decode("CD46009A232420B2CBF6E4148EE17AA4",
            Base64.NO_WRAP);
    try {

        resultbytes = AESCrypt.decrypt(key2, ivBytes, todecode);
        result = resultbytes.toString();

    } catch (Exception e) {

        // TODO Auto-generated catch block
        feedbackBody.append("catch blok \n");
        e.printStackTrace();

    }
    feedbackBody.append(result + " \n");



public static byte[] decrypt(final SecretKeySpec key, final byte[] iv,
        final byte[] decodedCipherText) throws GeneralSecurityException {
    final Cipher cipher = Cipher.getInstance(AES_MODE);
    IvParameterSpec ivSpec = new IvParameterSpec(iv);
    cipher.init(Cipher.DECRYPT_MODE, key, ivSpec);
    byte[] decryptedBytes = cipher.doFinal(decodedCipherText);

    log("decryptedBytes", decryptedBytes);

    return decryptedBytes;
}
编辑:似乎输入数据是此处的故障:

如果我对原始数据进行加密,然后解密,它就可以正常工作了。。。 但是我从别处得到了解密的文件


怀疑字符串中的编码错误:
Base64.decode(“CD46009A232420B2CBF6E4148EE17AA4”,Base64.NO_WRAP)

请尝试使用以下AES加密和解密方法,它们经过长期测试:

 public static String encrytData(String text) throws Exception {

    Cipher cipher = Cipher.getInstance("AES/CBC/PKCS7Padding");
    byte[] static_key = Constants.AES_KEY.getBytes();

    SecretKeySpec keySpec = new SecretKeySpec(static_key, "AES");
    IvParameterSpec ivSpec = new IvParameterSpec(Constants.IV_VECTOR);
    cipher.init(Cipher.ENCRYPT_MODE, keySpec, ivSpec);

    byte[] results = cipher.doFinal(text.getBytes());

    String result = Base64.encodeToString(results, Base64.NO_WRAP|Base64.DEFAULT);
    return result;

}


public static String decryptData(String text)throws Exception{

    byte[] encryted_bytes = Base64.decode(text, Base64.DEFAULT);

    Cipher cipher = Cipher.getInstance("AES/CBC/PKCS7Padding");
    byte[] static_key = Constants.AES_KEY.getBytes();

    SecretKeySpec keySpec = new SecretKeySpec(static_key, "AES");
    IvParameterSpec ivSpec = new IvParameterSpec(Constants.IV_VECTOR);
    cipher.init(Cipher.DECRYPT_MODE, keySpec, ivSpec);

    byte[] decrypted = cipher.doFinal(encryted_bytes);
    String result = new String(decrypted);

    return result;
}

ZeroBytep在AES_模式下添加实现了神奇的效果

private static final String AES_MODE = "AES/CBC/ZeroBytePadding";
此外:
Base64.decode(…)在第4行出现了一些问题,改为hexStringToByteArray(…),现在可以正常工作:D

您的AES_模式是否包括填充?我认为此错误表明加密邮件太短,您确定加密邮件已正确保存为Base64吗。如果包含堆栈跟踪,这将是显而易见的。由密钥引起的错误将具有堆栈跟踪includign cipher.init,而错误的消息将从cipher.dofinaly开始。在查看问题时,您自己的答案没有任何意义。请编辑您的问题以包含完整的加密/解密周期。1。始终将
getBytes()
new String()
与相同的附加字符集字符串一起使用,因为不同的系统可能使用不同的默认值。2.生成一个新的random IV并将其前置到密文,否则它在语义上不安全。3.添加密文身份验证。这可以作为加密然后MAC方案(即HMAC-SHA256)来完成,也可以使用诸如GCM(java支持)、CCM、EAX等身份验证模式。