【问题标题】:AES decryption not working for more than 16 bytesAES 解密不工作超过 16 个字节
【发布时间】:2016-02-07 00:52:32
【问题描述】:

我在使用 Java 中的 AES 加密/解密时遇到了一个非常奇怪的问题。如果我正在加密/解密小于 16 字节的字符串,则密码可以正常工作,但如果我输入大于 16 字节的密码,我会收到错误“给定最终块未正确填充”。我构建了一些小代码作为示例:

package com.company;

import javax.crypto.Cipher;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec;

public class Main {

    public static void main(String[] args) {
        try {
            Cipher aesEncrypt = Cipher.getInstance("AES/CBC/PKCS5Padding");
            Cipher aesDecrypt = Cipher.getInstance("AES/CBC/PKCS5Padding");

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

            IvParameterSpec ivSpec = new IvParameterSpec(new byte[16]);

            aesDecrypt.init(Cipher.DECRYPT_MODE, key, ivSpec);
            aesEncrypt.init(Cipher.ENCRYPT_MODE, key, ivSpec);

            byte[] message = "Hello".getBytes();

            aesEncrypt.update(message);

            byte[] encrypted = aesEncrypt.doFinal();

            aesDecrypt.update(encrypted);

            byte[] decrypted = aesDecrypt.doFinal();

            System.out.println(new String(decrypted, "UTF-8"));
        }
        catch (Exception e){
            e.printStackTrace();
        }
    }
}

当 byte[] 消息为“Hello”时,加密/解密工作正常,但当我将其更改为“HelloMyBabyHelloMyDarling”时,它会引发异常。有谁知道我在这里做错了什么?

【问题讨论】:

  • 请参阅here 了解有关 padding 的一些信息

标签: java encryption cryptography


【解决方案1】:

Cipher#update(byte[]) 返回一个 byte[],由于某种原因你没有使用它。你只是扔掉了除了最后一个块之外的所有东西(Cipher#doFinal() 在应用填充后返回最后一个加密块)。如果你的消息只包含一个块,那么密文和解密后的明文都是完整的。

既然你用的是短信,那么你根本就不需要用Cipher#update。只需使用Cipher#doFinal(byte[])

byte[] message = "Hello".getBytes();
byte[] encrypted = aesEncrypt.doFinal(message);
byte[] decrypted = aesDecrypt.doFinal(encrypted);

如果您尝试加密较长的数据(可能不适合内存),那么您应该将 Cipher#update 结果写入 OutputStream 或使用没有 updatedoFinal 调用的 CipherOutputStream。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-01-11
    • 1970-01-01
    • 1970-01-01
    • 2012-05-30
    • 2017-06-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多