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

系统 1777 0

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.   

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


更多文章、技术交流、商务合作、联系博主

微信扫码或搜索:z360901061

微信扫一扫加我为好友

QQ号联系: 360901061

您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请用微信扫描下面二维码支持博主2元、5元、10元、20元等您想捐的金额吧,狠狠点击下面给点支持吧,站长非常感激您!手机微信长按不能支付解决办法:请将微信支付二维码保存到相册,切换到微信,然后点击微信右上角扫一扫功能,选择支付二维码完成支付。

【本文对您有帮助就好】

您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请用微信扫描上面二维码支持博主2元、5元、10元、自定义金额等您想捐的金额吧,站长会非常 感谢您的哦!!!

发表我的评论
最新评论 总共0条评论