base64加密java算法

1549年前 (2015-10-27)java技术2952

 

一、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的字符表映射码:


 

Sun公司本身并没有提供Base64算法的相关实现。所以我们要用到其他开源组件的Base64算法的实现。如Bouncy Castle和Commons Codec。

 

 

1、Bouncy Castle的应用

Bouncy Castle实现的只是一般的Base64算法,没有遵循RFC标准

直接将下载的bcprov-jdk16-143.jar包导入工程即可。具体应用如下:

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包导入工程即可。

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。

 

 

 

本文原创,转载必追究版权。

分享给朋友:

相关文章

每次开机checking file system on d

 解决方案:点击左下角(开始)- (运行)输入(CMD)回车 - 进入CMD界面- 输入(d:)回车 - 输入(chkdsk /f)中间有空格。回车,出现提示按Y键,完成后,重启一次会检...

揭秘!如何用一句话找到你的一万微友

 玩微商一年半的时间了,现在的微商如火如荼,很多刚进入微商行业的伙伴都在烦恼一个问题,那就是粉丝、粉丝,我最近调查了身边30多个微友,有25个竟然都是好友问题,有的竟然给我说主动加了50多个...

java.lang.ClassNotFoundException: oracle.jdbc.driver.OralceDriver

 java.lang.ClassNotFoundException: Oracle.jdbc.driver.OracleDriver这个错误;原因可能是 少了驱动 ,少包class...

freeMarker 截取字符串(操作字符串函数 )

<#if c.proSummary!?length gt 25>  <!-- 如果长度 >25 截取25个字-->    ...

freeMarker Jfinal 获取session里的值

问题:freeMaker session取值的常用格式都试过 session["xxx"],session.xxx 直接xxx 都取不出来?????解决:JFinal与Struts...

谈话让别人舒服的程度,决定你成功的高度

谈话让别人舒服的程度,决定你成功的高度

职场上,有这样两种截然相反的人:有人生怕别人舒服,尽量让别人不舒服,而只要自己舒服就行;还有一类人生怕别人不舒服,尽量让别人舒服,哪怕委屈自己。猎头公司猎聘的老总有几十万年薪的,也有几百万的,甚至有过...

评论列表

苍老师人体
苍老师人体
9年前 (2015-10-27)

很不错,受教了!祝您的网站越做越好!!!

萨瓦迪卡 回复:
感谢!同样的祝福也送您[可爱]
9年前 (2015-10-28)
点我收录您
9年前 (2015-10-29)

我觉得 也可以写点别的 不然只有java啥的 受众太小

萨瓦迪卡 回复:
嗯嗯 ,好的,感谢[太开心]
9年前 (2015-10-30)

发表评论

访客

◎欢迎参与讨论,请在这里发表您的看法和观点。