我正在研究AES算法,我有这个例外,我无法解决.
javax.crypto.BadPaddingException: Given final block not properly padded
at com.sun.crypto.provider.SunJCE_f.b(DashoA13*..)
at com.sun.crypto.provider.SunJCE_f.b(DashoA13*..)
at com.sun.crypto.provider.AESCipher.engineDoFinal(DashoA13*..)
at javax.crypto.Cipher.doFinal(DashoA13*..)
Run Code Online (Sandbox Code Playgroud)
异常发生在解密部分.我在与解密算法不同的地方初始化密钥
KeyGenerator kgen = KeyGenerator.getInstance("AES");//key generation for AES
kgen.init(128); // 192 and 256 bits may not be available
Run Code Online (Sandbox Code Playgroud)
然后我用我从文件中读取的密文传递给下面的方法
public String decrypt(String message, SecretKey skey) {
byte[] raw = skey.getEncoded();
SecretKeySpec skeySpec = new SecretKeySpec(raw, "AES");
// Instantiate the cipher
Cipher cipher;
byte[] original = null;
try {
cipher = Cipher.getInstance("AES");
cipher.init(Cipher.DECRYPT_MODE, skeySpec);
System.out.println("Original string: "
+ message);
original = cipher.doFinal(message.trim().getBytes()); //here where I …Run Code Online (Sandbox Code Playgroud) 我使用javax.crypto.cipher来加密和解密一些数据.它运作良好.但有时候,解密会出现badPaddingException.如果我比较有failling呼叫succefull呼叫,给密码输入相同,并且密码被初始化以同样的方式.
我如何实现我的密码
dcipher = Cipher.getInstance("PBEWithMD5AndDES");
KeySpec keySpec = new PBEKeySpec(passPhrase.toCharArray(), salt, iterationCount);
SecretKey key = SecretKeyFactory.getInstance("PBEWithMD5AndDES").generateSecret(keySpec);
dcipher.init(Cipher.DECRYPT_MODE, key, paramSpec);
Run Code Online (Sandbox Code Playgroud)
我怎么用它
dec = Base64.decode(str) ;
byte[] utf8 = dcipher.doFinal(dec);
Run Code Online (Sandbox Code Playgroud)
在doFinal上引发了异常.
任何的想法 ?
谢谢 !
哦,顺便说一下,我使用bouncyCastle作为提供者,并将其添加到列表顶部
Security.insertProviderAt(new org.bouncycastle.jce.provider.BouncyCastleProvider(), 1);
Run Code Online (Sandbox Code Playgroud)
为了完整性,并且因为问题仍然不时出现.这是完整的课程.
public class EncryptDecryptUtil {
/** Encryption Cipher */
private static Cipher ecipher;
/** Decription Cipher */
private static Cipher dcipher;
private static Logger logger = Logger.getLogger(EncryptDecryptUtil.class);
/**
* Constructor used to create this object. Responsible for setting and initializing this object's encrypter …Run Code Online (Sandbox Code Playgroud)