gpt4 book ai didi

javax.crypto.BadPaddingException : pad block corrupted

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

我正在尝试加密和解密某些内容。我的解密失败了 - 我得到了上面的异常。我尝试更改 ctLength 和 ptLength,但无济于事。我究竟做错了什么?
我正在尝试加密:0 0 0 0 0 0 0 0

private Cipher encrypt(byte[] input)
{
try
{
SecretKeySpec key = new SecretKeySpec(keyBytes, "AES");

Cipher cipher = Cipher.getInstance("AES/ECB/PKCS7Padding", "BC");

// encryption pass
cipher.init(Cipher.ENCRYPT_MODE, key);
byte[] cipherText = new byte[cipher.getOutputSize(input.length)];
int ctLength = cipher.update(input, 0, input.length, cipherText, 0);
ctLength += cipher.doFinal(cipherText, ctLength);
FileOutputStream fs = new FileOutputStream(savedScoresFileName);
fs.write(cipherText);

return cipher;
}
catch (Exception e)
{
Log.e("encrtypt", "Exception", e);
}

return null;
}

private String decrypt()
{
try
{
Cipher cipher = Cipher.getInstance("AES/ECB/PKCS7Padding", "BC");

SecretKeySpec key = new SecretKeySpec(keyBytes, "AES");
byte[] cipherText = new byte[32];

FileInputStream fl = new FileInputStream(savedScoresFileName);
fl.read(cipherText);

cipher.init(Cipher.DECRYPT_MODE, key);
byte[] plainText = new byte[cipher.getOutputSize(32)];
int ptLength = cipher.update(cipherText, 0, 32, plainText, 0);
ptLength += cipher.doFinal(plainText, ptLength);

return new String(plainText).substring(0, ptLength);
}
catch (Exception e)
{
Log.e("decrypt", "Exception", e);
}

return null;
}

此代码复制自 this , 有效。

最佳答案

你的代码有很多问题,但你的问题是由你的文件读取代码和你执行加密和解密的奇怪方法引起的。

不要使用update() 方法,只需使用doFinal() 并更正您的文件写入/读取代码。例如。您的解密方法应该类似于:

try {
Cipher cipher = Cipher.getInstance("AES/ECB/PKCS7Padding", "BC");

SecretKeySpec key = new SecretKeySpec(keyBytes, "AES");

// Here you need to accurately and correctly read your file into a byte
// array. Either Google for a decent solution (there are many out there)
// or use an existing implementation, such as Apache Commons commons-io.
// Your existing effort is buggy and doesn't close its resources.
byte[] cipherText = FileUtils.readFileToByteArray(new File(savedScoresFileName));


cipher.init(Cipher.DECRYPT_MODE, key);

// Just one call to doFinal
byte[] plainText = cipher.doFinal(cipherText);

// Note: don't do this. If you create a string from a byte array,
// PLEASE pass a charset otherwise your result is platform dependent.
return new String(plainText);
} catch (Exception e) {
e.printStackTrace();
}

关于javax.crypto.BadPaddingException : pad block corrupted,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21988552/

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