`

Bouncy Castle加密库简介

阅读更多
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
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics