Base64编码及其作用

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

Base64编码的作用:由于某些系统中只能使用ASCII字符。Base64就是用来将非ASCII 字符的数据转换成ASCII字符的一种方法。它使用下面表中所使用的字符与编码。

而且base64特别适合在http,mime协议下快速传输数据。

base64其实不是安全领域下的加密解密算法。虽然有时候经常看到所谓的base64加密解密。其实base64只能算是一个编码算法,对数据内容进行编码来适合传输。虽然base64编码过后原文也变成不能看到的字符格式,但是这种方式很初级,很简单。

Base64编码方法要求把每三个8Bit的字节转换为四个6Bit的字节,其中,转换之后的这四个字节中每6个有效bit为是有效数据,空余的那两个bit用0补上成为一个字节。因此Base64所造成数据冗余不是很严重,Base64是当今比较流行的编码方法,因为它编起来速度快而且简单

举个例子,有三个字节的原始数据:aaaaaabb bbbbccccc ccdddddd(这里每个字母表示一个bit位)

那么编码之后会变成:00aaaaaa00bbbbbb00cccccc

00dddddd

所以可以看出base64编码简单,虽然编码后不是明文,看不出原文,但是解码也很简单

一、编码规则

Base64编码的思想是是采用64个基本的ASCII码字符对数据进行重新编码。它将需要编码的数据拆分成字节数组。以3个字节为一组。按顺序排列24 位数据,再把这24位数据分成4组,即每组6位。再在每组的的最高位前补两个0凑足一个字节。这样就把一个3字节为一组的数据重新编码成了4个字节。当所要编码的数据的字节数不是3的整倍数,也就是说在分组时最后一组不够3个字节。这时在最后一组填充1到2个0字节。并在最后编码完成后在结尾添加1到2个“=”。

例:将对ABC进行BASE64编码:

1、首先取ABC对应的ASCII码值。A(65)B(66)C(67);

2、再取二进制值A(01000001)B(01000010)C(01000011);

3、然后把这三个字节的二进制码接起来(010000010100001001000011);

4、再以6位为单位分成4个数据块,并在最高位填充两个0后形成4个字节的编码后的值,(00010000)(00010100)(00001001)(00000011),其中蓝色部分为真实数据;

5、再把这四个字节数据转化成10进制数得(16)(20)(9)(3);

6、最后根据BASE64给出的64个基本字符表,查出对应的ASCII码字符(Q)(U)(J)(D),这里的值实际就是数据在字符表中的索引。

注:BASE64字符表:ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/

二、解码规则

解码过程就是把4个字节再还原成3个字节再根据不同的数据形式把字节数组重新整理成数据。

三、C#中的实现

编码类:

///

///Base64编码类。

///将byte[]类型转换成Base64编码的string类型。

///

publicclass Base64Encoder

{

byte[] source;

int length, length2;

int blockCount;

int paddingCount;

publicstatic Base64Encoder Encoder = new Base64Encoder();

public Base64Encoder()

{

}

privatevoid init(byte[] input)

{

source = input;

length = input.Length;

if((length % 3) == 0)

{

paddingCount = 0;

blockCount = length / 3;

}

else

{

paddingCount = 3- (length % 3);

blockCount = (length + paddingCount) / 3;

}

length2 = length + paddingCount;

}

publicstring GetEncoded(byte[] input)

{

//初始化

init(input);

byte[] source2;

source2 = newbyte[length2];

for(int x = 0; x < length2; x++)

{

if(x < length)

{

source2[x] = source[x];

}

else

{

source2[x] = 0;

}

}

byte b1, b2, b3;

byte temp, temp1, temp2, temp3, temp4; byte[] buffer = newbyte[blockCount * 4]; char[] result = newchar[blockCount * 4]; for(int x = 0; x < blockCount; x++) {

b1 = source2[x * 3];

b2 = source2[x * 3+ 1];

b3 = source2[x * 3+ 2];

temp1 = (byte)((b1 &252) >>2);

temp = (byte)((b1 &3) <<4);

temp2 = (byte)((b2 &240) >>4);

temp2 += temp;

temp = (byte)((b2 &15) <<2);

temp3 = (byte)((b3 &192) >>6);

temp3 += temp;

temp4 = (byte)(b3 &63);

buffer[x * 4] = temp1;

buffer[x * 4+ 1] = temp2;

buffer[x * 4+ 2] = temp3;

buffer[x * 4+ 3] = temp4;

}

for(int x = 0; x < blockCount * 4; x++)

相关文档
最新文档