码迷,mamicode.com
首页 > 编程语言 > 详细

Base64算法

时间:2015-02-12 17:53:05      阅读:181      评论:0      收藏:0      [点我收藏+]

标签:

Base64 算法基本原理

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

对字符串的编码效果

    未编码:sjq security base64

    编码后:c2pxIHNlY3VyaXR5IGJhc2U2NA==

 

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

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

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

 

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

技术分享

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

 

例:对“Man”进行编码。

技术分享

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>

 

Base64算法

标签:

原文地址:http://www.cnblogs.com/shijiaqi1066/p/4288372.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!