Base64算法

为了防止无良网站的爬虫抓取文章,特此标识,转载请注明文章出处。LaplaceDemon/SJQ。

http://www.cnblogs.com/shijiaqi1066/p/4288372.html

 

 

 

Base64 算法基本原理

Base64是一种基于64个可打印字符表示二进制数据的表示方法。

对字符串的编码效果

    未编码:sjq security base64

    编码后:c2pxIHNlY3VyaXR5IGJhc2U2NA==

 

Base64的主要特点就是将二进制数据编码成一段字符串。字符串包括:大小写字母各26个,10个数字,“+”,“/”,一共64个字符,以及“=”等号用于作为后缀。

由于log264 = 6,所以每6bit为一个“单元”,对应于一个可打印字符。

例:3 byte = 24 bit = 4 [Base64单元] ,即3个字节需要用4个可打印字符来表示。

 

Base64单元值与可打印字符的对应关系,显示如下:

wps8773.tmp

当原数据长度不是3的整数倍时,如果最后剩下一个输入数据,在编码结果后加2个“=”;如果最后剩下两个输入数据,编码结果后加1个“=”;如果没有剩下任何数据,就什么都不要加,这样才可以保证数据还原的正确性。

 

例:对“Man”进行编码。

wps8793.tmp

Base64常用于在通常处理文本数据的场合,表示、传输、存储一些二进制数据。包括MIME的email、在XML中存储复杂数据。

Base64算法可以用于简易的加解密,其本质是使用替换字符的方式对数据进行加密。严格的说,Base64并不是一种加解密算法。

 

 

 

Java算法实现

Java中常用3种Base64的实现:

  • JDK
  • Commons Codec
  • Bouncy Castle

 

JDK实现

package sjq.security;

import java.io.IOException;

import sun.misc.BASE64Decoder;
import sun.misc.BASE64Encoder;

public class JDKBase64 {
    
    private static String src = "sjq security base64";
    
    public static String encoder(String src){
        BASE64Encoder encoder = new BASE64Encoder();
        String encode = encoder.encode(src.getBytes());
        return encode;
    }
    
    public static String decoder(String code){
        BASE64Decoder decoder = new BASE64Decoder();
        byte[] bs = null;
        try {
            bs = decoder.decodeBuffer(code);
        } catch (IOException e) {
            e.printStackTrace();
        }
        return new String(bs);
    }
    
    public static void main(String[] args) {
        String code = encoder(src);
        System.out.println(code);
        
        String src = decoder(code);
        System.out.println(src);
    }
}

 

说明:

使用Eclipse编写Java代码时,可能找不到BASE64Decoder,BASE64Decoder;只需要在project build path中先移除JRE System Library,再添加库JRE System Library,重新编译后就一切正常了。

 

 

Apache Commons Codec 的实现方式

package sjq.security;

import org.apache.commons.codec.binary.Base64;

public class CommonCodecBase64 {

    private static String src = "sjq security base64";

    public static String encoder(String src) {
        byte[] bytes = Base64.encodeBase64(src.getBytes());
        return new String(bytes);
    }

    public static String decoder(String code) {
        byte[] bytes = Base64.decodeBase64(code.getBytes());
        return new String(bytes);
    }

    public static void main(String[] args) {
        String code = encoder(src);
        System.out.println(code);

        String src = decoder(code);
        System.out.println(src);
    }
}

 

 

 

Bouncy Castle 的实现方式

package sjq.security;

import org.bouncycastle.util.encoders.Base64;

public class BouncyCastleBase64 {

    private static String src = "sjq security base64";

    public static String encoder(String src) {
        byte[] bytes = Base64.encode(src.getBytes());
        return new String(bytes);
    }

    public static String decoder(String code) {
        byte[] bytes = Base64.decode(code.getBytes());
        return new String(bytes);
    }

    public static void main(String[] args) {
        String code = encoder(src);
        System.out.println(code);

        String src = decoder(code);
        System.out.println(src);
    }

}

 

 

说明:

如果下载不到Bouncy Castle的Jar包,则可以使用MAVEN下载Jar包。

<dependency>
    <groupId>org.bouncycastle</groupId>
    <artifactId>bcprov-jdk16</artifactId>
    <version>1.46</version>
</dependency>

 

 

 

为了防止无良网站的爬虫抓取文章,特此标识,转载请注明文章出处。LaplaceDemon/SJQ。

http://www.cnblogs.com/shijiaqi1066/p/4288372.html

posted @ 2015-02-12 16:20  LaplaceDemon  阅读(1081)  评论(0编辑  收藏  举报