我在java类中发现了一个解密错误:
javax.crypto.IllegalBlockSizeException :
Input length must be multiple of 16 when decrypting with padded cipher.
我能做些什么来解决这个问题?
更新:
我忘了提到它工作了一次,当第二次我试图再次执行它时,它抛出了上面提到的错误。
package com.tb.module.service;
import java.security.Key;
import java.security.spec.InvalidKeySpecException;
import javax.crypto.Cipher;
import javax.crypto.spec.SecretKeySpec;
import sun.misc.*;
/**
* This class is used for encrypt and decrypt the password field.
*
*/
public class PswdEnc {
private static final String ALGO = "AES";
private static final byte[] keyValue = new byte[] { 'T', 'h', 'e', 'B', 'e', 's', 't','S', 'e', 'c', 'r','e', 't', 'K', 'e', 'y' };
public static String encrypt(String Data) throws Exception {
Key key = generateKey();
Cipher c = Cipher.getInstance(ALGO);
c.init(Cipher.ENCRYPT_MODE, key);
byte[] encVal = c.doFinal(Data.getBytes());
String encryptedValue = new BASE64Encoder().encode(encVal);
return encryptedValue;
}
public static String decrypt(String encryptedData) throws Exception {
Key key = generateKey();
Cipher c = Cipher.getInstance(ALGO);
c.init(Cipher.DECRYPT_MODE, key);
byte[] decordedValue = new BASE64Decoder().decodeBuffer(encryptedData);
byte[] decValue = c.doFinal(decordedValue);
String decryptedValue = new String(decValue);
return decryptedValue;
}
private static Key generateKey() throws Exception {
Key key = new SecretKeySpec(keyValue, ALGO);
return key;
}
}
您使用的算法“AES”是“AES/ECB/Nopadding”的缩写。这意味着您正在使用具有128位密钥大小和块大小的AES算法,使用ECB操作模式,并且没有填充。
换句话说:您只能对128位或16字节的数据块进行加密。这就是为什么您会得到IllegalBlocksizeException
异常。
如果要加密大小不是16字节的倍数的数据,要么必须使用某种填充,要么使用密码流。例如,您可以通过指定“AES/CBC/Nopadding”作为算法来使用CBC模式(一种有效地将分组密码转换为流密码的操作模式),或者通过指定“AES/ECB/PKCS5”来使用PKCS5填充,这将以非常特定的格式在数据末尾自动添加一些字节,以使密文的大小为16字节的倍数,并且解密算法将理解它必须忽略一些数据。
无论如何,我强烈建议你现在停止你正在做的事情,去学习一些关于密码学的入门材料。例如,在Coursera上检查Crypto I。你应该很好地理解选择一种模式或另一种模式的含义,它们的优点是什么,最重要的是,它们的缺点是什么。如果没有这些知识,就很容易建立非常容易崩溃的系统。
更新:根据您对这个问题的评论,在数据库中存储密码时不要加密!!!!!你永远都不应该这么做。您必须对密码进行哈希,适当加盐,这与加密完全不同。真的,拜托,别做你想做的事...通过加密密码,它们可以被解密。这意味着,作为数据库管理员和知道密钥的人,您将能够读取存储在数据库中的每一个密码。要么你知道这一点,正在做一些非常非常糟糕的事情,要么你不知道这一点,应该感到震惊并停止它。
TCP客户端代码: 对于相同的代码,当消息很小时,它会被正确解密。但是当消息很长时,我会得到illegalBlocksize异常。我尝试使用aes/cbc/pkcs5padding来填充消息,并且blocksize是16的倍数。但我还是得到了相同的错误或BadPaddingException。如果am指定PKCS5Padding作为填充技术,那么应该正确填充消息,而不应该给出此错误。为什么不起作用
虽然对于调试来说,当我试图解密(使用相同的代码)app1上的加密url时,它工作得很好。但不知道是什么原因导致了APP2的异常? 这是代码
运行以下代码时,如何解决此错误? 产出:
使用密钥加密和解密的新值(value1)。 两个示例加密值(enctypedValue1,enctypedValue2)正在使用相同的密钥进行解密。encryptedValue2在使用相同密钥解密时出现问题。 使用密钥加密和解密的新值(value4)。 在解密encryptedValue2时,我得到以下异常: 以下是我到目前为止得出的结论。 如果这个问题发生了,它应该发生在所有的值上。 这是一个特
我有一个安全课程的项目,但我有一个问题。 基本上,我试图加密然后解密一个密码,但我得到这个解密错误。 我这样做对吗。我在关注2012年的一篇文章。还安全吗? 我还尝试替换算法,但似乎没有任何效果: “AES”、“RSA/ECB/PKCS1Padding”、“PbeWithHMACSHA256andDesede”..以及更多
服务器端: 客户端(解密):