用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加密解密

下载: AESWithJCE.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程序中。

  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.  
  58. }

你可能感兴趣的:(算法,Security)