一、Base64的介绍
- Base64是网络上最常见的用于传输8Bit字节码的编码方式之一,Base64就是一种基于64个可打印字符来表示二进制数据的方法。
- Base64编码是从二进制到字符的过程,可用于在HTTP环境下传递较长的标识信息。采用Base64编码具有不可读性,需要解码后才能阅读。
- Base64要求把每三个8Bit的字节转换为四个6Bit的字节(3*8 = 4*6 = 24),然后把6Bit再添两位高位0,组成四个8Bit的字节,也就是说,转换后的字符串理论上将要比原来的长1/3。
规则:
- .把3个字节变成4个字节。
- 每76个字符加一个换行符。
- 最后的结束符也要处理。
编码转换的具体步骤:
- 第一个字节:根据源字节的第一个字节处理。 规则:源第一字节右移两位,去掉低2位,高2位补零。
- 第二个字节:根据源字节的第一个字节和第二个字节联合处理。规则:第一个字节高6位去掉然后左移四位,第二个字节右移四位。即:源第一字节低2位 + 源第2字节高4位
- 第三个字节:根据源字节的第二个字节和第三个字节联合处理,规则:第二个字节去掉高4位并左移两位(得高6位),第三个字节右移6位并去掉高6位(得低2位),相加即可
- 第四个字节:规则,源第三字节去掉高2位即可
编码更加具体详细的步骤:
- 第一个字符通过右移2位获得第一个目标字符的Base64表位置,根据这个数值取到表上相应的字符,就是第一//个目标字符。
- 然后将第一个字符与0x03(00000011)进行与(&)操作并左移4位,接着第二个字符右移4位与前者相或(|),即获得第二个目标字符。
- 再将第二个字符与0x0f(00001111)进行与(&)操作并左移2位,接着第三个字符右移6位与前者相或(|),获得第三个目标字符。
- 最后将第三个字符与0x3f(00111111)进行与(&)操作即获得第四个目标字符。
- 在以上的每一个步骤之后,再把结果与 0x3F 进行 AND 位操作,就可以得到编码后的字符了。
解码:
- 解码只是编码的逆过程
- 把编码得到的二进制位连接上再重组得到8位值,得出源码
二、Base64加密与解密的实现
1、Base64加密
/* Base64加密 */
int base64_encode(const unsigned char *sourceData, char *outputData)
{
uint8_t index = 0;
int i=0, j=0;
const int len = strlen((const char *)sourceData);
//每三组一个进行编码
for(; i < len; i += 3)
{
//第一个字节,根据源字节的第一个字节处理。 规则:源第一字节右移两位,去掉低2位,高2位补零。
index = ((sourceData
>> 2) & 0x3f);
outputData[j++] = base64char[index];
//第二个字节,根据源字节的第一个字节和第二个字节联合处理。规则:第一个字节高6位去掉然后左移四位,第二个字节右移四位
//即:源第一字节低2位 + 源第2字节高4位
index = ((sourceData << 4) & 0x30);
if(i+1 < len)
{
index |= ((sourceData[i + 1] >> 4) & 0x0f);
outputData[j++] = base64char[index];
}
else
{
outputData[j++] = base64char[index];
outputData[j++] = '=';
outputData[j++] = '=';
break;//超出总长可以直接break
}
//第三个字节,根据源字节的第二个字节和第三个字节联合处理,
//规则:第二个字节去掉高4位并左移两位(得高6位),第三个字节右移6位并去掉高6位(得低2位),相加即可
index = ((sourceData[i + 1] << 2) & 0x3c);
if((i + 2) < len)
{
index |= ((sourceData[i + 2] >> 6) & 0x03);
outputData[j++] = base64char[index];
//第四个字节,规则:源第三字节去掉高2位即可
index = sourceData[i + 2] & 0x3f;
outputData[j++] = base64char[index];
}
else
{
outputData[j++] = base64char[index];
outputData[j++] = '=';
break;
}
}
outputData[j] = '