`
jgsj
  • 浏览: 963613 次
文章分类
社区版块
存档分类
最新评论

base64 加密算法的实现

 
阅读更多

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];

chartestBase64[128]="欢迎使用base64加密算法\n\n作者:吴建凰\nEmail:wjh_2010@163.com\n如有问题请用邮件与我联系。\n\t\t\t谢谢";
chartestDeBase64[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字符串转换成常规字符串
*@srcStrbase64字符串
*@lengthbase64符串长度,由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编码的字符串 转换成常规字符串
*@srcStrbase64字符串
*@lengthbase64符串长度,由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字符串
*@base64Strbase64转码字符串,长度为65个字符,最后一个代表填充字符
*@deBase64Code逆base64字符串,缓冲区长度为128
*@return
*/
DllFun int GetDeBase64Code(char* base64Str,char*deBase64Code);

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics