gpt4 book ai didi

java - 使用 aes/ecb/pkcs5padding 解密字节数组时出现 IllegalBlockSizeException

转载 作者:行者123 更新时间:2023-11-29 05:04:27 25 4
gpt4 key购买 nike

我知道aes加密需要以16为单位,但我的印象是使用Cipher.getInstance("AES/ECB/PKCS5PADDING");填充字节数组来实现这。我的代码如下:

CipherUtils.java

private static byte[] key = {
0x74, 0x68, 0x69, 0x73, 0x49, 0x73, 0x41, 0x53, 0x65, 0x63, 0x72, 0x65, 0x74, 0x4b, 0x65, 0x79
};//"thisIsASecretKey";

public static byte[] EncryptByteArray(byte[] array)
{
try
{
Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5PADDING");
SecretKeySpec secretKey = new SecretKeySpec(key, "AES");
cipher.init(Cipher.ENCRYPT_MODE, secretKey);

return (cipher.doFinal(array));
}
catch (Exception e)
{
e.printStackTrace();

}
return null;
}

public static byte[] DecryptByteArray(byte[] array)
{
try
{
Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5PADDING");
SecretKeySpec secretKey = new SecretKeySpec(key, "AES");
cipher.init(Cipher.DECRYPT_MODE, secretKey);

return cipher.doFinal(array);
}
catch (Exception e)
{
e.printStackTrace();

}
return null;
}

主程序

        fis = new FileInputStream(path);

toDecrypt = new byte[fis.available()+1];

int content;
int i = 0;
while ((content = fis.read()) != -1) {

// convert to byte and display it
toDecrypt[i] = (byte)content;
i += 1;
}

byte[] decryptedStr = CipherUtils.DecryptByteArray(toDecrypt);

FileOutputStream decryptedStream = new FileOutputStream(path);
decryptedStream.write (decryptedStr);
decryptedStream.close();

path 处的文件使用 cipherutils.java 中的函数加密,并使用 FileOutputStream.write 写入文件

更新 - 我正在使用 Gradle 为 Android 构建。

最佳答案

问题是:

toDecrypt = new byte[fis.available()+1];

首先,您正在使用 available() 方法,这绝不是一个好主意。接下来,即使假设它正在 返回文件的长度,您也要向它加 1 - 为什么?当然,您只需要文件中的字节。

最简单的方法就是使用 Files.readAllBytes :

byte[] toDecrypt = Files.readAllBytes(Paths.get(path));
// TODO: Change the method name to follow Java conventions
byte[] decrypted = CipherUtils.DecryptByteArray(toDecrypt);
Files.write(Paths.get(path), decrypted);

现在您也不必担心关闭文件流...(如果您设法解密,您可能无法写入,因为您仍然打开文件阅读你当前的代码。)

我还强烈建议重新审视您的异常“处理”:

  • 捕获异常几乎总是一个坏主意
  • 调用 e.printStackTrace() 然后继续好像什么都没发生几乎总是一个坏主意

关于java - 使用 aes/ecb/pkcs5padding 解密字节数组时出现 IllegalBlockSizeException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30897347/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com