灯火互联
管理员
管理员
  • 注册日期2011-07-27
  • 发帖数41778
  • QQ
  • 火币41290枚
  • 粉丝1086
  • 关注100
  • 终身成就奖
  • 最爱沙发
  • 忠实会员
  • 灌水天才奖
  • 贴图大师奖
  • 原创先锋奖
  • 特殊贡献奖
  • 宣传大使奖
  • 优秀斑竹奖
  • 社区明星
阅读:2525回复:0

java加密解密研究3、Base64算法

楼主#
更多 发布于:2012-09-08 09:45

一、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                        3
ASCII码:                     65                      100                    51
二进制码:                01000001      01100100        00110011
4-6二进制码:         010000    010110   010000   110011
4-8二进制码:        00010000     00010110    00010000     00110011
十进制码 :                  16                   22                  16                    51
字符表映射码:          Q                      W                   Q                      z
因此,字符串“Ad3”经过Base64编码后就得到了“QWQz”


Base64的字符表映射码:

49_3710_b04384d04791e78.png[设为封面] [删除]




三、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.atcpu.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);
}
}

具体的应用可以参照Bouncy Castle和Commons Codec的API。




喜欢0 评分0
游客

返回顶部