2011-04-06 51 views
0

这是我如何创建我的AES加密,但我仍然不断收到BadPaddingException的这个错误解密javax.crypto.BadPaddingException

// Get the key generator    
    KeyGenerator kg = KeyGenerator.getInstance("AES"); 
    kg.init(128); 
    SecretKey sk = kg.generateKey(); 
    byte[] iv = new byte[]{0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0a,0x0b,0x0c,0x0d,0x0e,0x0f}; 
    AlgorithmParameterSpec paramSpec = new IvParameterSpec(iv); 

    ecipher = Cipher.getInstance("AES/CBC/PKCS5Padding"); 
    dcipher = Cipher.getInstance("AES/CBC/PKCS5Padding"); 

    ecipher.init(Cipher.ENCRYPT_MODE, sk,paramSpec); 
    dcipher.init(Cipher.DECRYPT_MODE, sk,paramSpec); 

解密方法的代码

public String decr(String str) { 
     try { 
      byte[] dec = new sun.misc.BASE64Decoder().decodeBuffer(str); 
      byte[] utf8 = dcipher.doFinal(dec); 
      return new String(utf8, "UTF8"); 
     } catch (Exception ex) { 
      return null; 
     } 
    } 

加密的doFinal()块方法

public String encr(String str) { 
     try { 
      byte[] utf8 = str.getBytes("UTF8"); 
      byte[] enc = ecipher.doFinal(utf8); 
      return new sun.misc.BASE64Encoder().encode(enc); 
     } catch (Exception ex) { 
      return null; 
     } 
    } 
+0

你如何进行加密? – axtavt 2011-04-06 18:05:17

+2

你传递给encr然后decr的字符串是什么?我在本地测试了你的代码,它工作得很好 – 2011-04-06 18:18:24

+0

@Justin - 我的字符串是“Hello world”。 – yogsma 2011-04-06 18:39:53

回答

4

您的代码适用于我:

package com.sandbox; 

import java.io.IOException; 
import java.io.UnsupportedEncodingException; 
import java.security.spec.AlgorithmParameterSpec; 

import javax.crypto.BadPaddingException; 
import javax.crypto.Cipher; 
import javax.crypto.IllegalBlockSizeException; 
import javax.crypto.KeyGenerator; 
import javax.crypto.SecretKey; 
import javax.crypto.spec.IvParameterSpec; 

public class EncryptionTest 
{ 
    private final Cipher ecipher; 
    private final Cipher dcipher; 

    public EncryptionTest() throws Exception 
    { 
     KeyGenerator kg = KeyGenerator.getInstance("AES"); 
     kg.init(128); 
     SecretKey sk = kg.generateKey(); 
     byte[] iv = new byte[] { 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f }; 
     AlgorithmParameterSpec paramSpec = new IvParameterSpec(iv); 

     ecipher = Cipher.getInstance("AES/CBC/PKCS5Padding"); 
     dcipher = Cipher.getInstance("AES/CBC/PKCS5Padding"); 

     ecipher.init(Cipher.ENCRYPT_MODE, sk, paramSpec); 
     dcipher.init(Cipher.DECRYPT_MODE, sk, paramSpec); 
    } 

    public String encrypt(String str) throws IllegalBlockSizeException, BadPaddingException, UnsupportedEncodingException 
    { 
     byte[] utf8 = str.getBytes("UTF8"); 
     byte[] enc = ecipher.doFinal(utf8); 
     return new sun.misc.BASE64Encoder().encode(enc); 
    } 

    public String decrypt(String str) throws IOException, IllegalBlockSizeException, BadPaddingException 
    { 
     byte[] dec = new sun.misc.BASE64Decoder().decodeBuffer(str); 
     byte[] utf8 = dcipher.doFinal(dec); 
     return new String(utf8, "UTF8"); 
    } 

    public static void main(String[] args) 
    { 
     try 
     { 
      EncryptionTest sandbox = new EncryptionTest(); 
      System.out.println(sandbox.decrypt(sandbox.encrypt("Hello world"))); 
     } 
     catch (Exception e) 
     { 
      e.printStackTrace(); 
     } 
    } 
} 

此打印出Hello World

+0

我认为你是对的。当我传递一个加密的字符串来分别解密函数时,我的问题就来了。 – yogsma 2011-04-06 20:46:19

相关问题