Java BASE64加密解密

一、Base64算法概述

Base64算法最早應用於解決電子郵件傳輸的問題。它是一種基於64個字符的編碼算法,根據RFC 2045的定義:“Base64內容傳輸編碼是一種以任意8位字節序列組合的描述形式,這種形式不易被人直接識別。”經過Base64編碼後的數據會比原始數據略長,爲原來的4/3倍。經過編碼後的字符串的字符數是以4爲單位的整數倍。Base64算法的編碼和解碼的操作可充當加密和解密的操作,還有一張字符映射表充當了密鑰。儘管如此,Base64算法仍不能叫做加密算法。 二、Base64算法實現原理Base64算法主要是將給定的字符以與字符編碼(如ASCII碼,UTF-8碼)對應的十進制數爲基準,做編碼操作:1、將給定的字符串以字符爲單位,轉換爲對應的字符編碼(如ASCII碼)。2、將獲得的字符編碼轉換爲二進制碼。3、對獲得的二進制嗎做分組轉換操作,每3個8位二進制碼爲一組,轉換爲每4個6位二進制爲一組(不足6位時地位補0)。這是一個分組變化的過程,3個8位二進制碼和4個6位二進制碼的長度都是24位(3*8=4*6=24)。4、對獲得的4-6二進制碼補位,向6位二進制碼添加2位高位0,組成4個8位二進制碼。5、將獲得的4-8二進制碼轉換爲十進制碼。6、將獲得的十進制碼轉換爲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的字符表映射碼: \   

三、Base64算法的實現Sun公司本身並沒有提供Base64算法的相關實現。所以我們要用到其他開源組件的Base64算法的實現。如Bouncy Castle和Commons Codec。   

1、Bouncy Castle的應用Bouncy Castle實現的只是一般的Base64算法,沒有遵循RFC標準

直接將下載的bcprov-jdk16-143.jar包導入工程即可。具體應用如下:[java] package Test; 

 

import java.io.UnsupportedEncodingException; 

 

import org.bouncycastle.util.encoders.Base64; 

/**

 * 封裝Base64的工具類

 *

 */ 

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);

 }

2、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);

 }

}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章