http在數據通信的時候,因爲不像https自帶鏈路加密,所有爲了安全性,使用http協議的時候,需要給請求包進行數據加密,爲了配合服務器端的解密算法,我發送端使用了Des加密。(需要跟其他平臺或者語言做交換的話,各個平臺/語言間的加密模式需要一致,填充方式也需要一致。不得不說的一點是DES已經被破譯過,當然這種破譯的代價並不低,而且並不是那麼簡單。如果要求更高的數據安全級別,可以選擇使用3DES或者AES等。)
一.Des加密
*請注意填充模式,我使用的填充模式是PKCS5Padding,填充的模式解釋可看鏈接:https://www.cnblogs.com/slqt/p/6559828.html
//DES_ECB_eccrypt
int iTrd_Des_Ecb_Encrypt(unsigned char *pucKey, unsigned char *pucBuf, int iLen,unsigned char *pucOutPut)
{
int i = 0;
int iTemp = 0;
int iPadding = 0;
int iOutLen;
const_DES_cblock input;
DES_cblock output;
DES_cblock key;
DES_key_schedule schedule;
iOutLen = iLen;
if(strlen(pucKey) != 8)
{
return 0;
}
memcpy(key,pucKey,8);
DES_set_key_unchecked(&key, &schedule);//想用自己指定的密鑰就只能調用key_unchecked
if (iLen == 0)
return 0;
if(iOutLen%8 != 0)
{
iTemp = ( (iOutLen + 7) / 8 ) * 8;
iPadding = iTemp - iOutLen;
for (i = iOutLen; i < iTemp; i++)
{
//pucBuf[i] = iPadding + '0';
pucBuf[i] = iPadding;
}
iOutLen = iTemp;
}
else
{
for (i = iOutLen; i < iOutLen+8; i++)
{
//pucBuf[i] = '8';
pucBuf[i] = 8;
}
iOutLen += 8;
}
for(i =0; i < iOutLen; i = i + 8)
{
memcpy(input,(pucBuf + i),8);
DES_ecb_encrypt(&input, &output, &schedule, DES_ENCRYPT);//openssl提供的des_ecb加密函數
memcpy(pucOutPut+i,output,8);
}
return iOutLen;
}
註釋的那兩行,起初我補齊字節填充的時候填充的是字符,但是和在線加密工具的校驗結果不一致,後來經過驗證,直接填充數字即可,不需要轉換成字符,需要注意一下這點;在線校驗工具鏈接:http://tool.chacuo.net/cryptdes
二.base64編碼
百度有很多源碼,不過需要自己留心檢查一下,會有一些小坑/小錯誤,需要自己調試的時候注意,例如字符串結束符'\0',別人可能寫'/0',base64的編碼表:大小寫字母A-E 、a-e ,阿拉伯數字0-9 ,以及特殊符號+ 和/ ,在編排這些的時候,源碼裏順序可能給你打亂了。。。都是心機boy
//base64編碼函數
long int Base64EnCode(_UC *src,long int src_len, _UC *dst)
{
long int i = 0, j = 0;
char base64_map[65] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
for (; i < src_len - src_len % 3; i += 3) {
dst[j++] = base64_map[(src[i] >> 2) & 0x3F];
dst[j++] = base64_map[((src[i] << 4) & 0x30) + ((src[i + 1] >> 4) & 0xF)];
dst[j++] = base64_map[((src[i + 1] << 2) & 0x3C) + ((src[i + 2] >> 6) & 0x3)];
dst[j++] = base64_map[src[i + 2] & 0x3F];
}
if (src_len % 3 == 1) {
dst[j++] = base64_map[(src[i] >> 2) & 0x3F];
dst[j++] = base64_map[(src[i] << 4) & 0x30];
dst[j++] = '=';
dst[j++] = '=';
}else if (src_len % 3 == 2) {
dst[j++] = base64_map[(src[i] >> 2) & 0x3F];
dst[j++] = base64_map[((src[i] << 4) & 0x30) + ((src[i + 1] >> 4) & 0xF)];
dst[j++] = base64_map[(src[i + 1] << 2) & 0x3C];
dst[j++] = '=';
}
dst[j] = '\0';
printf("encode length:%ld/n",j);
return j;
}