电子邮件传输算法-Base64

1、base64由来

由于历史问题,电子邮件只允许ascII码字符,若是传输带有非ascII码的邮件就可能会出现乱码。因此,base64是将非ascII码的数据映射成ascII码的数据来传输的。

Base64 编码是一种将二进制数据映射到一个可印刷字符集上的技术。

2、应用

Base64位算法有编码和解码操作,可以适当的充当加密和解密操作;经常被用来做一个简单的 “加密”来保护某些数据。

3、消息传递模型

操作流程如下:

1》甲方对数据做Base64编码处理

2》甲方将编码后的数据发送给乙方

3》乙方获得数据后对数据做 Base64解码处理

4、算法实现

1> jdk自带 Bouncy Castle 实现

import java.io.UnsupportedEncodingException;

import org.apache.commons.lang.StringUtils;
import org.bouncycastle.util.encoders.Base64;

public class Base64Coder {

	/***
	 * base64 加密
	 * @param data 即将加密的明文
	 * @return
	 */
	public static String encode(String data){
		if(StringUtils.isBlank(data)){
			return null;
		}
		try {
			byte[] b = Base64.encode(data.getBytes("utf-8"));
			return new String(b);
		} catch (UnsupportedEncodingException e) {
			e.printStackTrace();
		}
		return null;
	}
	
	/**
	 * base64 解密
	 * @param data 需要解密的密文
	 * @return
	 */
	public static String decode(String data){
		if(StringUtils.isBlank(data)){
			return null;
		}
		try {
			byte[] b = Base64.decode(data.getBytes("utf-8"));
			return new String(b);
		} catch (UnsupportedEncodingException e) {
			e.printStackTrace();
		}
		return null;
	}
	
	public static void main(String[] args) {
		String data = "java base64 加解密测试";
		String encodeStr = Base64Coder.encode(data);
		System.out.println("明文:"+ data +"--base64 加密后:"+ encodeStr);
		String decodeStr = Base64Coder.decode(encodeStr);
		System.out.println("密文:"+ encodeStr +"--base64 解密后:"+ decodeStr);
        
        // 打印结果
        /**
         明文:java base64 加解密测试--base64 加密后:amF2YSBiYXNlNjQg5Yqg6Kej5a+G5rWL6K+V
         密文:amF2YSBiYXNlNjQg5Yqg6Kej5a+G5rWL6K+V--base64 解密后:java base64 加解密测试
         */
	}
}

2>开源组件包 Commons Codec实现

jar包下载:http://commons.apache.org/proper/commons-codec/download_codec.cgi

-->  commons-codec-1.10.jar

import java.io.UnsupportedEncodingException;

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

/**
 * Commons Codec实现
 * jar下载 :http://commons.apache.org/proper/commons-codec/download_codec.cgi
 */
public class Base64Coder2 {

	/**
	 * base64 加密 
	 * @param data 加密明文
	 * @return
	 */
	public static String encode(String data){
	    if(StringUtils.isBlank(data)){
	    	return null;
	    }	
	    try {
			byte[] b = Base64.encodeBase64(data.getBytes("utf-8"));
			return new String(b);
		} catch (UnsupportedEncodingException e) {
			e.printStackTrace();
		}
	    return null;
	}
	
	/**
	 * base64 解密 
	 * @param data 解密密文
	 * @return
	 */
	public static String decode(String data){
	    if(StringUtils.isBlank(data)){
	    	return null;
	    }
	    try {
			byte[] b = Base64.decodeBase64(data.getBytes("utf-8"));
			return new String(b);
		} catch (UnsupportedEncodingException e) {
			e.printStackTrace();
		}
	    return null;
	}
	
	public static void main(String[] args) {
		String data = "java base64 commons coder 加解密测试";
		String encodeStr = Base64Coder2.encode(data);
		System.out.println("明文:"+ data +"--base64 加密后:"+ encodeStr);
		String decodeStr = Base64Coder2.decode(encodeStr);
		System.out.println("密文:"+ encodeStr +"--base64 解密后:"+ decodeStr);
		/*** 结果:
		 * 明文:java base64 commons coder 加解密测试--base64 加密后:amF2YSBiYXNlNjQgY29tbW9ucyBjb2RlciDliqDop6Plr4bmtYvor5U=
           密文:amF2YSBiYXNlNjQgY29tbW9ucyBjb2RlciDliqDop6Plr4bmtYvor5U=--base64 解密后:java base64 commons coder 加解密测试
		 */
	}
}

3> jdk自带 Bouncy Castle 与 开源组件包 Commons Codec 实现的比较

 Bouncy Castle 遵循了一般的 Base64算法编码,构建定长的 Base64编码使用"."符号作为填充符;Commons Codec 使用了不定长Base64编码,抛弃了填充符。从实用性而已,通过 url 参数传输数据往往要求数据长度尽可能的缩短,以缩短url长度,方便网络传输,因此:Commons Codec 是最好的选择。

 

转载于:https://my.oschina.net/u/1387400/blog/1499728

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值