1、Base64算法概述java
Base64算法最先應用於解決電子郵件傳輸的問題。它是一種基於64個字符的編碼算法,根據RFC 2045的定義:「Base64內容傳輸編碼是一種以任意8位字節序列組合的描述形式,這種形式不易被人直接識別。」通過Base64編碼後的數據會比原始數據略長,爲原來的4/3倍。通過編碼後的字符串的字符數是以4爲單位的整數倍。Base64算法的編碼和解碼的操做可充當加密和解密的操做,還有一張字符映射表充當了密鑰。儘管如此,Base64算法仍不能叫作加密算法。 2、Base64算法實現原理Base64算法主要是將給定的字符以與字符編碼(如ASCII碼,UTF-8碼)對應的十進制數爲基準,作編碼操做:一、將給定的字符串以字符爲單位,轉換爲對應的字符編碼(如ASCII碼)。二、將得到的字符編碼轉換爲二進制碼。三、對得到的二進制嗎作分組轉換操做,每3個8位二進制碼爲一組,轉換爲每4個6位二進制爲一組(不足6位時地位補0)。這是一個分組變化的過程,3個8位二進制碼和4個6位二進制碼的長度都是24位(3*8=4*6=24)。四、對得到的4-6二進制碼補位,向6位二進制碼添加2位高位0,組成4個8位二進制碼。五、將得到的4-8二進制碼轉換爲十進制碼。六、將得到的十進制碼轉換爲Base64字符表中對應的字符。 算法
舉個例子:有一個字符串:「Ad3」咱們要對其進行加密處理。字符串: Ad3字 符: A d 3ASCII碼: 65 100 51二進制碼: 01000001 01100100 001100114-6二進制碼: 010000 010110 010000 1100114-8二進制碼: 00010000 00010110 00010000 00110011十進制碼 : 16 22 16 51字符表映射碼: Q W Q z所以,字符串「Ad3」通過Base64編碼後就獲得了「QWQz」 Base64的字符表映射碼: apache
3、Base64算法的實現Sun公司自己並無提供Base64算法的相關實現。因此咱們要用到其餘開源組件的Base64算法的實現。如Bouncy Castle和Commons Codec。 ide
一、Bouncy Castle的應用Bouncy Castle實現的只是通常的Base64算法,沒有遵循RFC標準工具
直接將下載的bcprov-jdk16-143.jar包導入工程便可。具體應用以下:[java] package Test; 測試
import java.io.UnsupportedEncodingException; 編碼
import org.bouncycastle.util.encoders.Base64; 加密
/**code
* 封裝Base64的工具類blog
*
*/
class Base64Coder{
public final static String ENCODING="UTF-8";
//加密 www.2cto.com
public static String encoded(String data) throws UnsupportedEncodingException{
byte[] b=Base64.encode(data.getBytes(ENCODING));
return new String(b,ENCODING);
}
//解密
public static String decode(String data) throws UnsupportedEncodingException{
byte[] b=Base64.decode(data.getBytes(ENCODING));
return new String(b,ENCODING);
}
}
/**
* 測試類
*/
public class Base64Test {
public static void main(String[] args) throws UnsupportedEncodingException {
String str="Ad3";
//加密該字符串
String encodedString=Base64Coder.encoded(str);
System.out.println(encodedString);
//解密該字符串
String decodedString=Base64Coder.decode(encodedString);
System.out.println(decodedString);
}
}
package Test;import java.io.UnsupportedEncodingException;import org.bouncycastle.util.encoders.Base64;
/**
* 封裝Base64的工具類
*
*/
class Base64Coder{
public final static String ENCODING="UTF-8";
//加密
public static String encoded(String data) throws UnsupportedEncodingException{
byte[] b=Base64.encode(data.getBytes(ENCODING));
return new String(b,ENCODING);
}
//解密
public static String decode(String data) throws UnsupportedEncodingException{
byte[] b=Base64.decode(data.getBytes(ENCODING));
return new String(b,ENCODING);
}
}
/**
* 測試類
*/
public class Base64Test {
public static void main(String[] args) throws UnsupportedEncodingException {
String str="Ad3";
//加密該字符串
String encodedString=Base64Coder.encoded(str);
System.out.println(encodedString);
//解密該字符串
String decodedString=Base64Coder.decode(encodedString);
System.out.println(decodedString);
}
}
二、Commons Codec的應用Commons Codec即實現了通常的Base64算法,也實現了遵循RFC標準的Base64算法
直接將下載的commons-codec-1.6-bin.zip解壓,將解壓開的文件夾裏面的commons-codec-1.6.jar包導入工程便可。
[java] package Test;
import java.io.UnsupportedEncodingException;
import org.apache.commons.codec.binary.Base64;
/**
* 封裝Base64的工具類
*
*/
class Base64Coder {
public final static String ENCODING = "UTF-8";
// 加密
public static String encoded(String data) throws UnsupportedEncodingException {
byte[] b = Base64.encodeBase64(data.getBytes(ENCODING));
return new String(b, ENCODING);
}
// 加密,遵循RFC標準
public static String encodedSafe(String data) throws UnsupportedEncodingException {
byte[] b = Base64.encodeBase64(data.getBytes(ENCODING),true);
return new String(b, ENCODING);
}
// 解密
public static String decode(String data) throws UnsupportedEncodingException {
byte[] b = Base64.decodeBase64(data.getBytes(ENCODING));
return new String(b, ENCODING);
}
}
/**
* 測試類
*/
public class Base64Test {
public static void main(String[] args) throws UnsupportedEncodingException {
String str = "Ad3";
// 加密該字符串
String encodedString = Base64Coder.encodedSafe(str);
System.out.println(encodedString);
// 解密該字符串
String decodedString = Base64Coder.decode(encodedString);
System.out.println(decodedString);
}
}
package Test;import java.io.UnsupportedEncodingException;import org.apache.commons.codec.binary.Base64;/**
* 封裝Base64的工具類
*
*/
class Base64Coder {
public final static String ENCODING = "UTF-8"; // 加密
public static String encoded(String data) throws UnsupportedEncodingException {
byte[] b = Base64.encodeBase64(data.getBytes(ENCODING));
return new String(b, ENCODING);
} // 加密,遵循RFC標準
public static String encodedSafe(String data) throws UnsupportedEncodingException {
byte[] b = Base64.encodeBase64(data.getBytes(ENCODING),true);
return new String(b, ENCODING);
} // 解密
public static String decode(String data) throws UnsupportedEncodingException {
byte[] b = Base64.decodeBase64(data.getBytes(ENCODING));
return new String(b, ENCODING);
}
}/**
* 測試類
*/
public class Base64Test {
public static void main(String[] args) throws UnsupportedEncodingException {
String str = "Ad3";
// 加密該字符串
String encodedString = Base64Coder.encodedSafe(str);
System.out.println(encodedString);
// 解密該字符串
String decodedString = Base64Coder.decode(encodedString);
System.out.println(decodedString);
}
}