Bouncy Castle Crypto是一个Java实现的加密包,同时也有C#版本。它包含一套轻量级的API可以在包括J2ME在内的绝大多数环境中运行。部分手机不支持JSR177也可使用该加密包实现加密功能。Bouncy Castle加密包包含了大多数流行的加密实现(如:AES、DES、Blowfish等)、散列算法(如:MD5、SHA等)、字节字符编码(如:Base64)等。
下面一个段测试代码(包括MD5,Base64以及AES加密):
public void test() {
String clearText = "Hello World!";
String password = "hi";
//md5
MD5Digest digest = new MD5Digest();
digest.update(password.getBytes(), 0, password.length());
int md5Num = digest.getByteLength();
byte[] md5Buf = new byte[md5Num];
digest.doFinal(md5Buf, 0);
//base64
byte[] base64Buf = Base64.encode(md5Buf);
byte[] key = new byte[16];//设置key长度为128位
System.arraycopy(base64Buf, 0, key, 0, 16);
//AES加密
byte[] cipherBuf = null;
cipherBuf = AESEncode(clearText.getBytes(), key);
//AES解密
String decryptText = AESDecode(cipherBuf, key);
System.out.println("md5:" + new String(md5Buf));
System.out.println("base64:" + new String(base64Buf));
System.out.println("key:" + new String(key));
System.out.println("cipher:" + new String(cipherBuf));
System.out.println("clear:" + decryptText);
}
Base64编码后的字符串是由a~z,A~Z,+,/这64个字符组合而成,末尾补齐用“=”号表示。
AES加密算法对key的长度有限制,它只支持128,192和256位的key。所以代码中接key设置成16个字节。
下面是AES加密的代码:
public byte[] AESEncode(byte[] clearText, byte[] key) {
byte[] rv = null;
BufferedBlockCipher cipher = new PaddedBufferedBlockCipher(new AESEngine());
cipher.init(true, new KeyParameter(key));
rv = new byte[cipher.getOutputSize(clearText.length)];
int oLen = cipher.processBytes(clearText, 0, clearText.length, rv, 0);
try {
cipher.doFinal(rv, oLen);
} catch (DataLengthException e) {
} catch (IllegalStateException e) {
} catch (InvalidCipherTextException e) {
}
return rv;
}
下面是AES解密的代码:
public String AESDecode(byte[] cipherText, byte[] key) {
byte[] rv = null;
BufferedBlockCipher cipher = new PaddedBufferedBlockCipher(new AESEngine());
cipher.init(false, new KeyParameter(key));
rv = new byte[cipher.getOutputSize(cipherText.length)]; //该大小会大于实际的大小
int oLen = cipher.processBytes(cipherText, 0, cipherText.length, rv, 0);
try
{
cipher.doFinal(rv, oLen);
} catch (DataLengthException e) {
} catch (IllegalStateException e) {
} catch (InvalidCipherTextException e) {
}
return new String(rv).trim();
}
代码中rv的初始化长度会大于实际解密后数据的长度,所以生成的String要去掉空格。
Bouncy Castle官网:http://www.bouncycastle.org/
JavaTM Cryptography Extension (JCE) 参考指南:
http://download.oracle.com/javase/1.4.2/docs/guide/security/jce/JCERefGuide.html