2013-01-18 63 views
1

我正在加密和解密。我对密码学非常陌生,当使用弹性城堡时,我面临垫块腐败异常错误的填充异常:调用dofinal时填充块损坏

这是我的加密/解密代码。

私有AESFastEngine引擎;

private BufferedBlockCipher cipher; 

private final KeyParameter key=setEncryptionKey("testinggtestingg"); 

public KeyParameter setEncryptionKey(String keyText) { 
    // adding in spaces to force a proper key 
    keyText += "    "; 

    // cutting off at 128 bits (16 characters) 
    keyText = keyText.substring(0, 16); 

    byte[] keyBytes = keyText.getBytes(); 
    //key = new KeyParameter(keyBytes); 
    engine = new AESFastEngine(); 
    cipher = new PaddedBufferedBlockCipher(engine); 
    return new KeyParameter(keyBytes); 

} 

public String encryptString(String plainText) { 

    try { 
     byte[] plainArray = plainText.getBytes(); 
     cipher.init(true, key); 
     byte[] cipherBytes = new byte[cipher 
       .getOutputSize(plainArray.length)]; 
     int cipherLength = cipher.processBytes(plainArray, 0, 
       plainArray.length, cipherBytes, 0); 
     cipher.doFinal(cipherBytes, cipherLength); 

     return (new String(cipherBytes)); 
    } catch (DataLengthException e) { 
     e.printStackTrace(); 
    } catch (IllegalArgumentException e) { 
     e.printStackTrace(); 
    } catch (IllegalStateException e) { 
     e.printStackTrace(); 
    } catch (InvalidCipherTextException e) { 
     e.printStackTrace(); 
    } catch (Exception ex) { 
     ex.printStackTrace(); 
    } 
    // else 
    return null; 
} 

public String decryptString(String encryptedText) { 
    try { 
     byte[] cipherBytes = encryptedText.getBytes(); 
     cipher.init(false, key); 
       byte[] decryptedBytes = new byte[cipher 
       .getOutputSize(cipherBytes.length)]; 
     int decryptedLength = cipher.processBytes(cipherBytes, 0, 
       cipherBytes.length, decryptedBytes, 0); 
     cipher.doFinal(decryptedBytes,decryptedLength); 
     String decryptedString = new String(decryptedBytes); 

     // crop accordingly 
     int index = decryptedString.indexOf("\u0000"); 
     if (index >= 0) { 
      decryptedString = decryptedString.substring(0, index); 
     } 
     return decryptedString; 
    } catch (DataLengthException e) { 
     e.printStackTrace(); 
    } catch (IllegalArgumentException e) { 
     e.printStackTrace(); 
    } catch (IllegalStateException e) { 
     e.printStackTrace(); 
    } catch (InvalidCipherTextException e) { 
     e.printStackTrace(); 
    } catch (Exception ex) { 
     ex.printStackTrace(); 
    } 
    // else 
    return null; 
} 

回答

2

所有你需要的是精确的字符集。这里你去:

import org.bouncycastle.crypto.BufferedBlockCipher; 
import org.bouncycastle.crypto.DataLengthException; 
import org.bouncycastle.crypto.InvalidCipherTextException; 
import org.bouncycastle.crypto.engines.AESFastEngine; 
import org.bouncycastle.crypto.paddings.PaddedBufferedBlockCipher; 
import org.bouncycastle.crypto.params.KeyParameter; 

public class Main 
{ 
    private BufferedBlockCipher cipher; 
    private final KeyParameter key = setEncryptionKey("testinggtestingg"); 
    private static final String CHARSET = "ISO-8859-1"; 

    public static void main(String[] argv) 
    { 
     Main main = new Main(); 

     String plain = "trallalla"; 
     System.out.println("initial : " + plain); 

     String encrypted = main.encryptString(plain); 
     System.out.println("after encryption : " + encrypted); 

     String decrypted = main.decryptString(encrypted); 
     System.out.println("after decryption : " + decrypted); 
    } 

    public KeyParameter setEncryptionKey(String keyText) 
    { 
     // adding in spaces to force a proper key 
     keyText += "    "; 

     // cutting off at 128 bits (16 characters) 
     keyText = keyText.substring(0, 16); 

     byte[] keyBytes = keyText.getBytes(); 
     // key = new KeyParameter(keyBytes); 
     AESFastEngine engine = new AESFastEngine(); 
     cipher = new PaddedBufferedBlockCipher(engine); 
     return new KeyParameter(keyBytes); 

    } 

    public String encryptString(String plainText) 
    { 
     try 
     { 
      byte[] plainArray = plainText.getBytes(); 
      cipher.init(true, key); 
      byte[] cipherBytes = new byte[cipher.getOutputSize(plainArray.length)]; 
      int cipherLength = cipher.processBytes(plainArray, 0, plainArray.length, cipherBytes, 0); 
      cipher.doFinal(cipherBytes, cipherLength); 

      return (new String(cipherBytes, CHARSET)); 
     } 
     catch (DataLengthException e) 
     { 
      e.printStackTrace(); 
     } 
     catch (IllegalArgumentException e) 
     { 
      e.printStackTrace(); 
     } 
     catch (IllegalStateException e) 
     { 
      e.printStackTrace(); 
     } 
     catch (InvalidCipherTextException e) 
     { 
      e.printStackTrace(); 
     } 
     catch (Exception ex) 
     { 
      ex.printStackTrace(); 
     } 
     // else 
     return null; 
    } 

    public String decryptString(String encryptedText) 
    { 
     try 
     { 
      byte[] cipherBytes = encryptedText.getBytes(CHARSET); 
      cipher.init(false, key); 
      byte[] decryptedBytes = new byte[cipher.getOutputSize(cipherBytes.length)]; 
      int decryptedLength = cipher.processBytes(cipherBytes, 0, cipherBytes.length, decryptedBytes, 0); 
      cipher.doFinal(decryptedBytes, decryptedLength); 
      String decryptedString = new String(decryptedBytes); 

      // crop accordingly 
      int index = decryptedString.indexOf("\u0000"); 
      if (index >= 0) 
      { 
       decryptedString = decryptedString.substring(0, index); 
      } 
      return decryptedString; 
     } 
     catch (DataLengthException e) 
     { 
      e.printStackTrace(); 
     } 
     catch (IllegalArgumentException e) 
     { 
      e.printStackTrace(); 
     } 
     catch (IllegalStateException e) 
     { 
      e.printStackTrace(); 
     } 
     catch (InvalidCipherTextException e) 
     { 
      e.printStackTrace(); 
     } 
     catch (Exception ex) 
     { 
      ex.printStackTrace(); 
     } 
     // else 
     return null; 
    } 
} 

但是,你为什么使用这个外部库?下面是我使用的代码,并且不需要任何外部库:

import java.io.UnsupportedEncodingException; 
import java.security.InvalidKeyException; 
import java.security.NoSuchAlgorithmException; 

import javax.crypto.*; 
import javax.crypto.spec.*; 


public class Encryption 
{ 
    private static final String ALGORITHME = "Blowfish"; 
    private static final String TRANSFORMATION = "Blowfish/ECB/PKCS5Padding"; 
    private static final String SECRET = "kjkdfjslm"; 
    private static final String CHARSET = "ISO-8859-1"; 


    public static void main(String[] argv) throws InvalidKeyException, NoSuchAlgorithmException, NoSuchPaddingException, UnsupportedEncodingException, IllegalBlockSizeException, BadPaddingException 
    { 
     Encryption main = new Encryption(); 

     String plain = "trallalla"; 
     System.out.println("initial : " + plain); 

     String encrypted = main.encrypt(plain); 
     System.out.println("after encryption : " + encrypted); 

     String decrypted = main.decrypt(encrypted); 
     System.out.println("after decryption : " + decrypted); 
    } 

    public String encrypt(String plaintext) 
    throws NoSuchAlgorithmException, 
    NoSuchPaddingException, 
    InvalidKeyException, 
    UnsupportedEncodingException, 
    IllegalBlockSizeException, 
    BadPaddingException 
    { 

      Cipher cipher = Cipher.getInstance(TRANSFORMATION); 
      cipher.init(Cipher.ENCRYPT_MODE, new SecretKeySpec(SECRET.getBytes(CHARSET), ALGORITHME)); 
      return new String(cipher.doFinal(plaintext.getBytes()), CHARSET);  
    } 

    public String decrypt(String ciphertext) 
    throws NoSuchAlgorithmException, 
    NoSuchPaddingException, 
    InvalidKeyException, 
    UnsupportedEncodingException, 
    IllegalBlockSizeException, 
    BadPaddingException 
    { 
     Cipher cipher = Cipher.getInstance(TRANSFORMATION); 
     cipher.init(Cipher.DECRYPT_MODE, new SecretKeySpec(SECRET.getBytes(), ALGORITHME)); 
     return new String(cipher.doFinal(ciphertext.getBytes(CHARSET)), CHARSET); 
    } 
} 
+0

感谢您的replay.Now我的代码工作正常.......谢谢.. – pradeepds