1. 关于base64编码
Base64编码将3个8位的字符串转换为4个6位的字符串。转换后的编码用64个字符对应。
在网上有很多关于base64加密解密的说法,我感觉很多不是真正的加密,因为如果不是自己设置密匙,总会觉得怪怪的,会认为是采用统一的密匙加密(这样就很容易破解了)。
这边说明我是如何实现base64加密的。看这篇文章之前,必须先看关于base64编码的知识,如http://zh.wikipedia.org/wiki/Base64。
2. base64编码规则的加密算法
base64编码最终用64个字符去对应,假若64个字符可以自己选择,顺序可以变化。就可以形成base64编码规则的加密算法。
这种加密算法的过程很简单。
首先:定义一串65字节的编码字符串(最后一字节作为填充字节),要求字符无重复;
然后:经过base64编码;
最后:生成密文。
解码时需要用编码字符串生成密钥。过程如下:
首先:通过编码字符串生成密钥;
然后:用此密钥进行逆64编码;
最后:生成明文。
从这加密解密过程可以知道,密匙和密钥是不一样的。但这边的加密过程没有经过太多的数学转换,通过密钥生成密匙和通过密匙生成密钥都很简单。所以密匙和密钥都需要保密。
Base64加密其本质还是字符替换的过程。只是经过base64编码改变了原来字符出现的概率。只能用6位字符的概率去破解。
头文件见下面,我的测试程序如下:
int _tmain(int argc, _TCHAR* argv[])
{//自定义的密匙,这边没有将其打乱。
char* base64Code = "ADCBEFGHIJKLMNOPWRSTUVQXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";
char deBase64Code[129];char testBase64[128]="欢迎使用base64加密算法\n\n作者:吴建凰\nEmail:wjh_2010@163.com\n如有问题请用邮件与我联系。\n\t\t\t谢谢";
char testDeBase64[128];int len;
memset(deBase64Code,0,129);
memset(testDeBase64,0,128);printf("明文 = \n%s \n ",testBase64);
//用标准的base64编码
printf("用标准的base64编码\n");
len = StringToStdBase64(testBase64,0,testDeBase64);
len = StdBase64ToString(testDeBase64,len,testBase64);
printf("密文 = \n%s \n len = %d \n",testDeBase64,len);
//用自定义的base64编码
printf("用自定义的base64编码\n");
GetDeBase64Code(base64Code,deBase64Code);
len = StringToBase64(testBase64,0,testDeBase64,base64Code);
len = Base64ToString(testDeBase64,len,testBase64,deBase64Code);
printf("密文 = \n%s \n len = %d \n",testDeBase64,len);return 0;
}
若觉此文章对您有用,需要我帮助请发送邮件到wjh_2010@163.com。谢谢。
附:头文件的说明
/**
* 将字符串转换成自定义的base64编码
*@srcStr 原字符串
*@length 原字符串长度
*@destStr 保存转码后的缓冲区,由于base64转码字符串会增大1/3,所有其缓冲区长度必须为原来的4/3。
*@base64Str 自定义的base64字符串
*@return 成功 返回 destStr字符串的长度
* 失败 返回 -1
*/
DllFun int StringToBase64(char* srcStr,int length,char* destStr, char* base64Str);
/**
* 将字符串转换成标准的base64编码
*@srcStr 原字符串
*@length 原字符串长度
*@destStr 保存转码后的缓冲区,由于base64转码字符串会增大1/3,所有其缓冲区长度必须为原来的4/3。
*@return 成功 返回 destStr字符串的长度
* 失败 返回 -1
*/
DllFun int StringToStdBase64(char* srcStr,int length,char* destStr);
/**
* 将base64字符串转换成常规字符串
*@srcStr base64字符串
*@length base64符串长度,由base64字符串的特点,其长度必须是4的倍数。
*@destStr 保存转码后的缓冲区,由于base64解码后其长度会缩短1/4,所有其缓冲区长度必须大于length的3/4。
*@deBase64Str 与自定义的base64字符串相匹配的解码字符串
*@return 成功 返回 destStr字符串的长度
* 失败 返回 -1
*/
DllFun int Base64ToString(char* srcStr,int length,char* destStr,char* deBase64Str);
/**
* 将转换成标准base64编码的字符串 转换成常规字符串
*@srcStr base64字符串
*@length base64符串长度,由base64字符串的特点,其长度必须是4的倍数。
*@destStr 保存转码后的缓冲区,由于base64解码后其长度会缩短1/4,所有其缓冲区长度必须大于length的3/4。
*@return 成功 返回 destStr字符串的长度
* 失败 返回 -1
*/
DllFun int StdBase64ToString(char* srcStr,int length,char* destStr);
/**
* 获取标准的base64字符串
*@return 返回base64字符串,返回的是常量,不能对其修改,否则后果难想象。
*/
DllFun char* GetStdBase64Str();
/**
* 获取标准的base64解码字符串
*@return 返回base64解码字符串,返回的是常量,不能对其修改,否则后果难想象。
*/
DllFun char* GetStdDeBase64Str();
/**
* 根据自定义base64字符串生成逆base64字符串
*@base64Str base64转码字符串,长度为65个字符,最后一个代表填充字符
*@deBase64Code 逆base64字符串,缓冲区长度为128
*@return
*/
DllFun int GetDeBase64Code(char* base64Str,char*deBase64Code);