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