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加密解密
package com.albertsong.aes;
import java.security.Key;
import java.security.Security;
import javax.crypto.Cipher;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec;
import org.bouncycastle.jce.provider.BouncyCastleProvider;
import org.bouncycastle.util.encoders.Hex;
/**
* @author Albert
* @version 1.0
*
*/
public class AESWithJCE {
/**
* @param args
*/
public static void main(String[] args) {
byte[] keybytes = { 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38,
0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38 };
byte[] iv = { 0x38, 0x37, 0x36, 0x35, 0x34, 0x33, 0x32, 0x31, 0x38,
0x37, 0x36, 0x35, 0x34, 0x33, 0x32, 0x31 };
String content ="TEST1234567890ABCDEFGHIJKLMNOPQRSTUVWXYZ";
System.out.println("Original content:");
System.out.println(content);
try {
Security.addProvider(new BouncyCastleProvider());
Key key = new SecretKeySpec(keybytes, "AES");
Cipher in = Cipher.getInstance("AES/CBC/PKCS7Padding","BC");
in.init(Cipher.ENCRYPT_MODE, key, new IvParameterSpec(iv));
byte[] enc = in.doFinal(content.getBytes());
System.out.println("Encrypted Content:");
System.out.println(new String(Hex.encode(enc)));
Cipher out = Cipher.getInstance("AES/CBC/PKCS7Padding", "BC");
out.init(Cipher.DECRYPT_MODE, key, new IvParameterSpec(iv));
byte[] dec = out.doFinal(enc);
System.out.println("Decrypted Content:");
System.out.println(new String(dec));
} catch (Exception ex) {
ex.printStackTrace();
}
}
}
2)不使用JCE的AES-128-CBC加密解密,可以用于J2ME程序中。
package com.albertsong.aes;
import org.bouncycastle.crypto.BufferedBlockCipher;
import org.bouncycastle.crypto.engines.AESFastEngine;
import org.bouncycastle.crypto.modes.CBCBlockCipher;
import org.bouncycastle.crypto.paddings.PaddedBufferedBlockCipher;
import org.bouncycastle.crypto.params.KeyParameter;
import org.bouncycastle.crypto.params.ParametersWithIV;
import org.bouncycastle.util.encoders.Hex;
/**
* @author Albert
* @version 1.0
*
*/
public class AESWithoutJCE {
/**
* @param args
*/
public static void main(String[] args) {
byte[] keybytes = { 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38,
0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38 };
byte[] iv = { 0x38, 0x37, 0x36, 0x35, 0x34, 0x33, 0x32, 0x31, 0x38,
0x37, 0x36, 0x35, 0x34, 0x33, 0x32, 0x31 };
String content ="TEST1234567890ABCDEFGHIJKLMNOPQRSTUVWXYZ";
System.out.println("Original content:");
System.out.println(content);
try {
BufferedBlockCipher engine = new PaddedBufferedBlockCipher(new CBCBlockCipher(new AESFastEngine()));
engine.init(true, new ParametersWithIV(new KeyParameter(keybytes),iv));
byte[] enc = new byte[engine.getOutputSize(content.getBytes().length)];
int size1 = engine.processBytes(content.getBytes(), 0, content.getBytes().length, enc, 0);
int size2 = engine.doFinal(enc, size1);
System.out.println("size2 ="+size2);
byte[] encryptedContent =new byte[size1+size2];
System.arraycopy(enc, 0, encryptedContent, 0, encryptedContent.length);
System.out.println("Encrypted Content:");
System.out.println(new String(Hex.encode(encryptedContent)));
engine.init(false, new ParametersWithIV(new KeyParameter(keybytes),iv));
byte[] dec = new byte[engine.getOutputSize(encryptedContent.length)];
size1 = engine.processBytes(encryptedContent, 0, encryptedContent.length, dec, 0);
size2 = engine.doFinal(dec, size1);
System.out.println("size2 ="+size2);
byte[] decryptedContent =new byte[size1+size2];
System.arraycopy(dec, 0, decryptedContent, 0, decryptedContent.length);
System.out.println("Decrypted Content:");
System.out.println(new String(decryptedContent));
} catch (Exception ex) {
ex.printStackTrace();
}
}
}