BASE64算法及应用

Base64是网络上最常见的用于传输8Bit字节代码的编码方式之一。使用base64具有以下三个优点,一是信息隐藏加密,避免了明码传输带来的安全性问题,二是把二进制byte流转为可见字符传输,使得很适合在URL中传输,三是避免了在不同平台和不同处理器之间调整大小端和拼接数据的麻烦,具有一定的跨平台和跨编程语言的能力。对于一些不能处理二进制byte流的弱语言或者脚本语言来说,也提供了一个应用窗口。当然他的弱点也相当明显,使原始数据变的比以后大了三分之一。

Base64的算法原理就是把三个字节24bit转为4个字节32bit。三个字节24bit,看作一个整体,每次取出一个6个bit存入新四个字节的低六个bit中,四次正好存四个字节,这样原数据如果为正数是0xff和三个字节,就会变成0x3f的四个字节。如果原数据表示正数,就是0~255,base64编码后,高二位填充为零后,就会变成四个0~63的整数,这样只要选取64个可见字符进行相应的替换,就组成了base64编码。如果使用通用的base64字符替换,网上的在线base64编码就能帮你解码。如果你希望安全些,就要自己打乱那些字符,或者使自己选择的种子字符。常见的字符种子:

static final byte[] cb64={ (byte) ‘A‘, (byte) ‘B‘,  
        (byte) ‘5‘, (byte) ‘6‘, (byte) ‘7‘, (byte) ‘8‘, (byte) ‘9‘,  
        (byte) ‘H‘, (byte) ‘I‘, (byte) ‘J‘, (byte) ‘K‘, (byte) ‘L‘,  
        (byte) ‘v‘, (byte) ‘w‘, (byte) ‘x‘, (byte) ‘y‘, (byte) ‘z‘,  
        (byte) ‘R‘, (byte) ‘S‘, (byte) ‘T‘, (byte) ‘U‘, (byte) ‘V‘,  
        (byte) ‘W‘, (byte) ‘X‘, (byte) ‘Y‘, (byte) ‘Z‘, (byte) ‘a‘,  
        (byte) ‘q‘, (byte) ‘r‘, (byte) ‘s‘, (byte) ‘t‘, (byte) ‘u‘,  
        (byte) ‘C‘, (byte) ‘D‘, (byte) ‘E‘, (byte) ‘F‘, (byte) ‘G‘,  
        (byte) ‘g‘, (byte) ‘h‘, (byte) ‘i‘, (byte) ‘j‘, (byte) ‘k‘,  
        (byte) ‘M‘, (byte) ‘N‘, (byte) ‘O‘, (byte) ‘P‘, (byte) ‘Q‘,  
        (byte) ‘b‘, (byte) ‘c‘, (byte) ‘d‘, (byte) ‘e‘, (byte) ‘f‘,  
        (byte) ‘0‘, (byte) ‘1‘, (byte) ‘2‘, (byte) ‘3‘, (byte) ‘4‘,  
        (byte) ‘l‘, (byte) ‘m‘, (byte) ‘n‘, (byte) ‘o‘, (byte) ‘p‘,  
        (byte) ‘+‘, (byte) ‘/‘ , (byte) ‘=‘};

一个简单的java语言base64编码:

public class XiaoMiBase64 {
	/* ----------------base64 from:http://base64.sourceforge.net/ ----------------- */

	/*
	** Translation Table as described in RFC1113
	*/
	/*
	static final byte[] cb64={ (byte) ‘A‘, (byte) ‘B‘,
        (byte) ‘5‘, (byte) ‘6‘, (byte) ‘7‘, (byte) ‘8‘, (byte) ‘9‘,
        (byte) ‘H‘, (byte) ‘I‘, (byte) ‘J‘, (byte) ‘K‘, (byte) ‘L‘,
        (byte) ‘v‘, (byte) ‘w‘, (byte) ‘x‘, (byte) ‘y‘, (byte) ‘z‘,
        (byte) ‘R‘, (byte) ‘S‘, (byte) ‘T‘, (byte) ‘U‘, (byte) ‘V‘,
        (byte) ‘W‘, (byte) ‘X‘, (byte) ‘Y‘, (byte) ‘Z‘, (byte) ‘a‘,
        (byte) ‘q‘, (byte) ‘r‘, (byte) ‘s‘, (byte) ‘t‘, (byte) ‘u‘,
        (byte) ‘C‘, (byte) ‘D‘, (byte) ‘E‘, (byte) ‘F‘, (byte) ‘G‘,
        (byte) ‘g‘, (byte) ‘h‘, (byte) ‘i‘, (byte) ‘j‘, (byte) ‘k‘,
        (byte) ‘M‘, (byte) ‘N‘, (byte) ‘O‘, (byte) ‘P‘, (byte) ‘Q‘,
        (byte) ‘b‘, (byte) ‘c‘, (byte) ‘d‘, (byte) ‘e‘, (byte) ‘f‘,
        (byte) ‘0‘, (byte) ‘1‘, (byte) ‘2‘, (byte) ‘3‘, (byte) ‘4‘,
        (byte) ‘l‘, (byte) ‘m‘, (byte) ‘n‘, (byte) ‘o‘, (byte) ‘p‘,
        (byte) ‘+‘, (byte) ‘/‘ , (byte) ‘=‘};
        */
	static final String scb64="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";
	static final byte[] cb64 = scb64.getBytes();

	/*
	** Translation Table to decode (created by author)
	*/
	//static const char cd64[]="|$$$}rstuvwxyz{$$$$$$$>[email protected]$$$$$$XYZ[\\]^_`abcdefghijklmnopq";
	static byte base64_map_rev(byte c)
	{
		byte j;
		for(j = 0; j < 65; j++)
		{
			if(c == cb64[j])
			{
				return j;
			}
		}
		return 0;
	}
	/*
	** decodeblock
	**
	** decode 4 ‘6-bit‘ characters into 3 8-bit binary bytes
	*/
	static byte[] decodeblock(byte[] in)
	{
		byte[] out = new byte[3];

		out[0] = (byte) (in[0] << 2 | in[1] >> 4);
		out[1] = (byte) (in[1] << 4 | in[2] >> 2);
		out[2] = (byte) (((in[2] << 6) & 0xc0) | in[3]);

		return out;
	}

	static byte[] Base64Decode(byte[] b64_inbuf, long b64_len)
	{
		int size = (int)((b64_len*3)/4);
		byte[] b64_outbuf = new byte[size];
		byte[] in= new byte[4];
		byte[] out;// = new byte[3];

	    for (int i = 0; i < b64_len; i++)
	    {
	    	b64_inbuf[i] = base64_map_rev(b64_inbuf[i]);
	    	if (b64_inbuf[i] == 64) {
				size--;
			}
			if (b64_inbuf[i] == 64) {
				size--;
			}
	    }

		for (int i = 0; i < (b64_len/4); i++)
		{
			System.arraycopy(b64_inbuf, i*4, in, 0, in.length);
			out=decodeblock(in);
			System.arraycopy(out, 0, b64_outbuf, i*3, out.length);
		}

		byte[] b64_outbuf2 = new byte[size];
		System.arraycopy(b64_outbuf, 0, b64_outbuf2, 0, size);
		return b64_outbuf2;
	} 

	static byte[] encodeblock(byte[] in, int len )
	{
		System.out.println("AAAAA  len="+len);
		byte[] out = new byte[4];
		System.out.println("AAAAA  in[0]="+in[0]);
		System.out.println("AAAAA  (in[0] >> 2)="+(in[0] >> 2));
		out[0] = (byte) cb64[((in[0] >> 2))&0x3f];
		out[1] = (byte) cb64[((((in[0] & 0x03) << 4) | ((in[1] & 0xf0) >> 4)))&0x3f];
		out[2] = (byte) (len > 1 ? cb64[((((in[1] & 0x0f) << 2) | ((in[2] & 0xc0) >> 6)))&0x3f] : ‘=‘);
		out[3] = (byte) (len > 2 ? cb64[((in[2] & 0x3f))&0x3f] : ‘=‘);

	    return out;
	}

	static byte[] Base64Encode(byte[] inbuf, long len)
	{
		int size = (int)((len*4)/3) + ((((len*4)%3)==0)?0:4);
		byte[] b64_outbuf = new byte[size];

		byte[] in = new byte[3];
		byte[] out;// = new byte[4];
		int i;

		for (i = 0; i < (len/3); i ++)
		{
			System.arraycopy(inbuf, i*3, in, 0, in.length);
			out=encodeblock(in, in.length);
			System.arraycopy(out, 0, b64_outbuf, i*4, out.length);
		}

		if ((len%3) != 0)
		{
			System.arraycopy(inbuf, i*3, in, 0, (int)(len-i*3));
			out=encodeblock(in, (int)(len-i*3));
			System.arraycopy(out, 0, b64_outbuf, i*4, out.length);
		}
		return b64_outbuf;
	}
	public static void main(String[] args) {

		String msg = "Z6V3ARgCAABPAgAAeQYAAKUIAABfEQAAKiMAAOiZAABMmgAA1H" +
				     "UBADh2AQCQygQAJCcFAORGBwAAAAAAAAAAAAAAAABFAQEBAQEB" +
				     "IQEhISEhISEBISEBAQEBAQEBASEhISEhISFhNYE1kTWRNZE1kT" +
				     "WRNZE1kTWxRQEBAQEBASEBISEhISEhASEhAQEBAQEBAQEhISEh" +
				     "ISEhcTWRNZE1kTWhRQEBAQEBASEBISEhISEhASEhAQEBAQEBAQ" +
				     "EhISEhISEhYTWBNYE1kTWBNcFFAQEBAQEBIQEhISEhISEBISEB" +
				     "AQEBAQEBASEhISEhISFxNZE1kTWRNZE1kTWBNYE1AQ==";
		//String data = "1";
		//byte[] result = XiaoMiBase64.encode(data.getBytes());
		//byte[] out = new byte[msg.length()*3/4];
		byte[] out = XiaoMiBase64.Base64Decode(msg.getBytes(), msg.length());
		System.out.println("AAAAA="+out.toString());
		for (int i = 0; i < out.length; i++)
		{
			System.out.println("AAAAA out["+i+"]="+out[i]);
		}

		String str = "abcdefghijklmnopqrstuvwxyz";
		byte[] base64str = Base64Encode(str.getBytes(), str.length());
		System.out.println("AAAAA base64str ="+ new String(base64str));

		byte[] str1 = Base64Decode(base64str, base64str.length);

		System.out.println("AAAAA str1 ="+new String(str1));

	}
}
时间: 2025-01-16 02:19:55

BASE64算法及应用的相关文章

java单向加密算法小结(1)--Base64算法

java单向加密算法小结(1)--Base64算法 从这一篇起整理一下常见的加密算法以及在java中使用的demo,首先从最简单的开始. 简单了解 Base64严格来说并不是一种加密算法,而是一种编码/解码的实现方式. 我们都知道,数据在计算机网络之间是使用字节流的方式进行传递的,所有的信息都要最终转换为0101的二进制,这本身就涉及到编码,解码的应用. Base64,顾名思义,是使用了64个基本的字符来对任意数据进行编码的一种实现方式,那既然有Base64,是不是也有Base32,Base16

java Base64算法的使用

Base64是常见的网络加密算法,Base64编码可用于在HTTP环境下传递较长的标识信息.详见 Base64介绍 1 自定义的base64算法 Base64Encrypt.java public class Base64Encrypt { private static final String CODES = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/="; // base64解密 private

Base64算法

一. Base64算法概述 Base64算法最早应用于解决电子邮件传输的问题.早期,由于“历史问题”,电子邮件只允许ASCII码字符,如果邮件中包含非ASCII码字符,当它通过有“历史问题”的网关时,这个网关会对该字符的二进制位进行调整,即将其8位二进制码的最高位置0,这样用户收到的邮件就会是一封乱码.为了解决这个问题,产生了Base64算法. Base64主要用于将不可打印的字符转换成可打印字符,或者简单的说将二进制数据编码成ASCII字符(注:可打印的). 将二进制数据编码成ASCII字符主

MD5加密算法(信息摘要算法)、Base64算法

1 什么是MD5 信息摘要算法,可以将字符进行加密,每个加密对象在进行加密后都是等长的 应用场景:将用户密码经过MD5加密后再存储到数据库中,这样即使是超级管理员也没有能力知道用户的具体密码是多少:因为MD5加密后的数据时不能够被解密的 步骤: >获取MessageDigest对象 MessageDigest md5 = MessageDigest.getInstance("MD5"); 注意:import java.security.MessageDigest; >通过M

算法系列(十一)BASE64算法实现和使用说明

完整的BASE64定义可见RFC 1421和RFC 2045.编码后的数据比原始数据略长,为原来的4/3.在电子邮件中,根据RFC 822规定,每76个字符,还需要加上一个回车换行.可以估算编码后数据长度大约为原长的135.1%. 转换的时候,将三个byte的数据,先后放入一个24bit的缓冲区中,先来的byte占高位.数据不足3byte的话,于缓冲器中剩下的bit用0补足.然后,每次取出6(因为26=64)个bit,按照其值选择ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefg

标准的Base64算法描述

作者:zhanhailiang 日期:2014-12-19 算法描述: Base64要求把每三个8Bit的字节转换为四个6Bit的字节(38 = 46 = 24),然后把6Bit再添两位高位0,组成四个8Bit的字节,也就是说,转换后的字符串理论上将要比原来的长1/3. 第一个字符通过右移2位获得第一个目标字符的Base64表位置,根据这个数值取到表上相应的字符,就是第一个目标字符. 然后将第一个字符与0x03(00000011)进行与(&)操作并左移4位,接着第二个字符右移4位与前者相或(|)

Base64算法与多版本加密技术

编辑本段VB版 注:其中DigestStrToHexStr为可在程序外部调用加密函数 Option Explicit ' Base64 Encoding/Decoding Algorithm ' By: David Midkiff ([email protected]) ' ' This algorithms encodes and decodes data into Base64 ' format. This format is extremely more efficient than '

python实现base64算法加密

python本身有base64加密的模块,不过是用C写的,封装成了.so文件,无法查看源码,本着学习的心态,自己实现了一遍,算法 原理参考 浅谈Base64编码算法. 代码如下: # coding:utf8 import string import base64 # 编码用64位数组 因为是转换为6个字节的字符 所以64位就够了 letters = list(string.letters) + list(string.digits) + ['+', '/'] def my_base64_enco

传奇的通迅协议与base64算法

传奇的数据根本就没加密. 只要把#(数字)!去掉,中间的那些全部减0x3c,然后,四个字节一组,每个字节取低六位组成6*4=24位,然后分成3个字节,这个是很经典的base64的算法.不过小改了一些,主要是为了传输方便和解包方便,因为把255一个字节缩小到64一个字节,就可以使用其它编码作头和尾的标志. 最新的.net框架应该已经包含了这个算法了吧,直接使用相关函数就行,没必要自己再去编写了.原理你可以到网上查,BASE64编码的好处在于可以把例如汉字等任何文件编码,编码后的文件只包含26个字母