本篇文章主要在JDK6.0的基礎上介紹另外兩種第三方加密組件庫,分別為Bouncy Castle和Apache Commons Codec.雖然SUN內部也提供了Base64加密算法,相關(guān)API可能參照文檔,但下面將要介紹的兩種組件分別在此基礎上提供了更加靈活的運用, Base64是網(wǎng)絡(luò )上最常見(jiàn)的用于傳輸8Bit字節代碼的編碼方式之一,大家可以查看RFC2045~RFC2049,上面有MIME的詳細規范。
Base64要求把每三個(gè)8Bit的字節轉換為四個(gè)6Bit的字節(3*8 = 4*6 = 24),然后把6Bit再添兩位高位0,組成四個(gè)8Bit的字節,也就是說(shuō),轉換后的字符串理論上將要比原來(lái)的長(cháng)1/3。
關(guān)于這個(gè)編碼的規則:
把3個(gè)字符變成4個(gè)字符..
每76個(gè)字符加一個(gè)換行符..
最后的結束符也要處理..
例子:
轉換前 10101101 10111010 01110110
轉換后 00101011 00011011 00101001 00110110
十進(jìn)制 43 27 41 54
對應碼表中的值 r b p 2
所以上面的24位編碼,編碼后的Base64值為 rbp2
首先我們是一下SUN內部對BASE64加密算法的實(shí)現:
String str = "base64加密測試";
byte[] input = str.getBytes();
//Base64編碼
byte[] data = Base64.encode(input);
//Base64解碼
byte[] output = Base64.decode(data);
我們也可以直接編碼一個(gè)字符串如:
String encoded = Base64.encode("Hello, world!"); //編碼
String decoded = Base64.decode(encoded); //解碼我們還可以在進(jìn)行編碼時(shí)直接指定編碼格式:
String encoded = Base64.encode("Hello, world!", "UTF-8"); //編碼
String decoded = Base64.decode(encoded, "UTF-8"); //解碼對于大一點(diǎn)的數據如果使用輸入輸出流來(lái)直接進(jìn)行編碼會(huì )達到更好的效果。而直接通過(guò)流進(jìn)行操作,SUN公司也提供了相關(guān)API說(shuō)明如:
InputStream inputStream = new FileInputStream("source.jpg");
OutputStream outputStream = new FileOutputStream("encoded.b64");
Base64.encode(inputStream, outputStream);
outputStream.close();
inputStream.close();In similar manner, a stream can be decoded:
InputStream inputStream = new FileInputStream("encoded.b64");
OutputStream outputStream = new FileOutputStream("decoded.jpg");
Base64.decode(inputStream, outputStream);
outputStream.close();
inputStream.close();
更進(jìn)上步說(shuō),還可以直接操作java.io.File對象。如:
//直接從文件中讀取數據進(jìn)行編碼
File source = new File("source.jpg");
File encoded = new File("encoded.b64");
Base64.encode(source, encoded);
//編碼到另一個(gè)文件中
File encoded = new File("encoded.b64");
File decoded = new File("decoded.jpg");
Base64.decode(encoded, decoded);上面為SUN為我們提供的基本算法.
Commons Codec 也提供了Base64加密算法,并且尊循RFC 2045,其提供的API可參照如下:
//Base64編碼
byte[] data = Base64.encodeBase64(input);
//Base64解碼
byte[] output = Base64.decodeBase64(data);
另Common Codec還提供了Base64InputStream / Base64OutputStream API,我們可以以流的形式來(lái)讀取數據,并進(jìn)行加密,
Base64InputStream input = new Base64InputStream(is,false);
DataInputStream dis = new DataInputStream(input);
byte[] data = new byte[contentLength];
dis.readFully(data);
dis.close();
System.out.println(new String(data));
其中is:為網(wǎng)絡(luò )輸入流,contentLength:為數據長(cháng)度。
//我們可以直接創(chuàng )建一個(gè)Base64OutputStream,來(lái)封裝另一個(gè)現存的輸出流
Base64OutputStream encodingStream = new Base64OutputStream(myOutputStream);
//我們直接編碼數據到一個(gè)現存的文件中
Base64OutputStream encodingStream = new Base64OutputStream(new FileOutputStream("encoded.b64"));
//把數據寫(xiě)入流中,和普通流操作一樣
encodingStream.write(bytes);
//關(guān)閉流
encodingStream.close();
//指定每行顯示的個(gè)數,默認為 76,但我們可以自行指定,但最少不能小于壹
Base64OutputStream encodingStream = new Base64OutputStream(myOutputStream, 48);
用 Base64InputStream進(jìn)行解碼
//直接始從文件中讀取
Base64InputStream decodingStream = new Base64InputStream(new FileInputStream("encoded.b64"));
//讀取字節數據
decodingStream.read(bytes);
//關(guān)閉流
decodingStream.close();
另Hex 16進(jìn)制算法與64算法在A(yíng)PI上很相似,讀取可參照相關(guān)API。
聯(lián)系客服