用Bouncy Castle实现AES-128-CBC加密解密

Bouncy Castle Crypto APIs 是一个开源的轻量级Java 加密解密包,实现了JCE/JCA的provider,支持AES等多种加密解密算法。
详情请见主页:http://www.bouncycastle.org/java.html
本文的示例代码使用了http://www.bouncycastle.org/download/bcprov-jdk16-139.jar
1)使用JCE的AES-128-CBC加密解密

Java代码   收藏代码
  1. package  com.albertsong.aes;  
  2.   
  3. import  java.security.Key;  
  4. import  java.security.Security;  
  5.   
  6. import  javax.crypto.Cipher;  
  7. import  javax.crypto.spec.IvParameterSpec;  
  8. import  javax.crypto.spec.SecretKeySpec;  
  9.   
  10. import  org.bouncycastle.jce.provider.BouncyCastleProvider;  
  11. import  org.bouncycastle.util.encoders.Hex;  
  12.   
  13. /**  
  14.  * @author Albert  
  15.  * @version 1.0  
  16.  *   
  17.  */   
  18. public   class  AESWithJCE {  
  19.   
  20.     /**  
  21.      * @param args  
  22.      */   
  23.     public   static   void  main(String[] args) {  
  24.         byte [] keybytes = {  0x31 0x32 0x33 0x34 0x35 0x36 0x37 0x38 ,  
  25.                 0x31 0x32 0x33 0x34 0x35 0x36 0x37 0x38  };  
  26.         byte [] iv = {  0x38 0x37 0x36 0x35 0x34 0x33 0x32 0x31 0x38 ,  
  27.                 0x37 0x36 0x35 0x34 0x33 0x32 0x31  };  
  28.         String content ="TEST1234567890ABCDEFGHIJKLMNOPQRSTUVWXYZ" ;  
  29.         System.out.println("Original content:" );  
  30.         System.out.println(content);  
  31.         try  {  
  32.             Security.addProvider(new  BouncyCastleProvider());  
  33.             Key key = new  SecretKeySpec(keybytes,  "AES" );  
  34.             Cipher in = Cipher.getInstance("AES/CBC/PKCS7Padding" , "BC" );  
  35.             in.init(Cipher.ENCRYPT_MODE, key, new  IvParameterSpec(iv));  
  36.             byte [] enc = in.doFinal(content.getBytes());  
  37.             System.out.println("Encrypted Content:" );  
  38.             System.out.println(new  String(Hex.encode(enc)));  
  39.               
  40.             Cipher out = Cipher.getInstance("AES/CBC/PKCS7Padding" "BC" );  
  41.             out.init(Cipher.DECRYPT_MODE, key, new  IvParameterSpec(iv));  
  42.             byte [] dec = out.doFinal(enc);  
  43.             System.out.println("Decrypted Content:" );  
  44.             System.out.println(new  String(dec));  
  45.         } catch  (Exception ex) {  
  46.             ex.printStackTrace();  
  47.         }  
  48.   
  49.     }  
  50.   
  51. }  

 2)不使用JCE的AES-128-CBC加密解密,可以用于J2ME程序中。

Java代码   收藏代码
  1. package  com.albertsong.aes;  
  2.   
  3. import  org.bouncycastle.crypto.BufferedBlockCipher;  
  4. import  org.bouncycastle.crypto.engines.AESFastEngine;  
  5. import  org.bouncycastle.crypto.modes.CBCBlockCipher;  
  6. import  org.bouncycastle.crypto.paddings.PaddedBufferedBlockCipher;  
  7. import  org.bouncycastle.crypto.params.KeyParameter;  
  8. import  org.bouncycastle.crypto.params.ParametersWithIV;  
  9. import  org.bouncycastle.util.encoders.Hex;  
  10.   
  11. /**  
  12.  * @author Albert  
  13.  * @version 1.0  
  14.  *  
  15.  */   
  16. public   class  AESWithoutJCE {  
  17.   
  18.     /**  
  19.      * @param args  
  20.      */   
  21.     public   static   void  main(String[] args) {  
  22.         byte [] keybytes = {  0x31 0x32 0x33 0x34 0x35 0x36 0x37 0x38 ,  
  23.                 0x31 0x32 0x33 0x34 0x35 0x36 0x37 0x38  };  
  24.         byte [] iv = {  0x38 0x37 0x36 0x35 0x34 0x33 0x32 0x31 0x38 ,  
  25.                 0x37 0x36 0x35 0x34 0x33 0x32 0x31  };  
  26.         String content ="TEST1234567890ABCDEFGHIJKLMNOPQRSTUVWXYZ" ;  
  27.         System.out.println("Original content:" );  
  28.         System.out.println(content);  
  29.         try  {  
  30.             BufferedBlockCipher engine = new  PaddedBufferedBlockCipher( new  CBCBlockCipher( new  AESFastEngine()));  
  31.             engine.init(true new  ParametersWithIV( new  KeyParameter(keybytes),iv));  
  32.             byte [] enc =  new   byte [engine.getOutputSize(content.getBytes().length)];  
  33.             int  size1 = engine.processBytes(content.getBytes(),  0 , content.getBytes().length, enc,  0 );  
  34.             int  size2 = engine.doFinal(enc, size1);  
  35.             System.out.println("size2 =" +size2);  
  36.             byte [] encryptedContent = new   byte [size1+size2];  
  37.             System.arraycopy(enc, 0 , encryptedContent,  0 , encryptedContent.length);  
  38.             System.out.println("Encrypted Content:" );  
  39.             System.out.println(new  String(Hex.encode(encryptedContent)));  
  40.               
  41.               
  42.             engine.init(false new  ParametersWithIV( new  KeyParameter(keybytes),iv));  
  43.             byte [] dec =  new   byte [engine.getOutputSize(encryptedContent.length)];  
  44.             size1 = engine.processBytes(encryptedContent, 0 , encryptedContent.length, dec,  0 );  
  45.             size2 = engine.doFinal(dec, size1);  
  46.             System.out.println("size2 =" +size2);  
  47.             byte [] decryptedContent = new   byte [size1+size2];  
  48.             System.arraycopy(dec, 0 , decryptedContent,  0 , decryptedContent.length);  
  49.             System.out.println("Decrypted Content:" );  
  50.             System.out.println(new  String(decryptedContent));  
  51.   
  52.         } catch  (Exception ex) {  
  53.             ex.printStackTrace();  
  54.         }  
  55.   
  56.     }  
  57.   

你可能感兴趣的:(java,加密,解密)