Java加密解密的艺术(2)-------电子邮件传输算法Base64

Base64的实现原理

Base64算法主要是将给定的字符以字符编码(ASCII、UTF-8)对应的十进制数为基准,做编码操作:

  • 第一步:将给定的字符串以字符为单位,转换为对应的字符编码(如ASCII码)。
  • 第二步:将获得的字符编码转换成二进制编码。
  • 第三步:对获得的二进制码做分组转换操作,没3个8位二进制码为一组,转换成每四个6位二进制码为一组(不足6位时低位补0).这是一个分组变换的过程(3 * 8 = 6 * 4)。
  • 第四步:对获得的4-6二进制码补位,向6位二进制添加2位高位0,组成4个8位二进制码。
  • 第五步:将获得的4-8二进制码转换为十进制码。
  • 第六步:将获得的十进制码转换为Base64字符表中对应的字符。

演示步骤

字符A
ASCII码65
二进制码01000001
4-6二进制码010000 010000 1
4-8二进制码00010000 000100002
十进制码16 16
字符表映射码Q Q = =3

代码实现

JDK的实现

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

import java.io.IOException;

public class IBase64 {
    private static String src = "A";
    public static void main(String[] args) {
        jdkBase64();
    }

    public static void jdkBase64() {
        BASE64Encoder encoder = new BASE64Encoder();
    String encode = encoder.encode(src.getBytes());
        System.out.println("encode:" + encode);

    BASE64Decoder decoder = new BASE64Decoder();
        try {
        System.out.println("decoder:" + new String(decoder.decodeBuffer(encode)));
    } catch (IOException e) {
        e.printStackTrace();
    	}
	}
}

输出:
JDK_Base64

commons codec实现

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

public class IBase64 {
    private static String src = "A";

    public static void main(String[] args) {
        commonsCodesBase64();
    }

    public static void commonsCodesBase64(){
        byte[] encodeBytes = Base64.encodeBase64(src.getBytes());
        System.out.println("encoder:" + new String(encodeBytes));

        byte[] decodeBytes = Base64.decodeBase64(encodeBytes);
        System.out.println("decoder:" + new String(decodeBytes));
    }
}

输出同上

Bouncy Castle实现

public class IBase64 {
    private static String src = "A";

    public static void main(String[] args) {
        bouncyCastleBase64();
    }


    public static void bouncyCastleBase64(){
        byte[] encodeBytes =  org.bouncycastle.util.encoders.Base64.encode(src.getBytes());
        //全路径名
        System.out.println("encoder:" + new String(encodeBytes));

        byte[] decodeBytes =  org.bouncycastle.util.encoders.Base64.decode(encodeBytes);
        System.out.println("decoder:" + new String(decodeBytes));
    }
}


输出同上


  1. 此处先是却6位(得 010000和01),由于后者不足6位低位补0得(010000和010000) ↩︎

  2. 此处直接在高位添加两个0 ↩︎

  3. 转换的时候,将3B(一个ASCII字符为1B即8位)的数据,先后放入一个24位的缓冲区中,先来的字符占高位。数据不足3byte的话,于缓冲区中剩下的bit用0补足并输出。不断进行,直到全部输入数据转换完成。如果最后剩下两个输入数据,在编码结果后加1个“=”;如果最后剩下一个输入数据,编码结果后加2个“=”;如果没有剩下任何数据,就什么都不要加,这样才可以保证资料还原的正确性。一般来说,编码后的数据比原始数据略长,为原来的3/4。 ↩︎

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值