您的位置:首页 > 编程语言 > C语言/C++

C++ base64加密解密算法

2017-01-01 10:28 363 查看
1、CBase64.h

#ifndef BASE64_H

#define BASE64_H

#include <iostream>

#include <stdio.h>

#include <string>

using namespace std;

class CBase64

{

public:
/* Base64 编码 */
string Base64_encode(const char* data, int data_len);
/* Base64 解码 */
string Base64_decode(const char* data, int data_len);

private:
static char find_pos(char ch);

};

#endif

2、CBase64.cpp

#include "stdafx.h"

#include "CBase64.h"

const char base[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";

/* Base64 编码 */

string CBase64::Base64_encode(const char* data, int data_len)

{
int prepare = 0;
int ret_len;
int temp = 0;
char *ret = NULL;
char *f = NULL;
int tmp = 0;
char changed[4];
int i = 0;
ret_len = data_len / 3;
temp = data_len % 3;
if (temp > 0)
{
ret_len += 1;
}
ret_len = ret_len * 4 + 1;
ret = (char *)malloc(ret_len);

if (ret == NULL)
{
printf("No enough memory.\n");
exit(0);
}
memset(ret, 0, ret_len);
f = ret;
while (tmp < data_len)
{
temp = 0;
prepare = 0;
memset(changed, '\0', 4);
while (temp < 3)
{
if (tmp >= data_len)
{
break;
}
prepare = ((prepare << 8) | (data[tmp] & 0xFF));
tmp++;
temp++;
}
prepare = (prepare << ((3 - temp) * 8));
for (i = 0; i < 4; i++)
{
if (temp < i)
{
changed[i] = 0x40;
}
else
{
changed[i] = (prepare >> ((3 - i) * 6)) & 0x3F;
}
*f = base[changed[i]];
f++;
}
}
*f = '\0';

string strValue(ret);
free(ret);
return strValue;

}

/* 转换算子 */

char CBase64::find_pos(char ch)

{
char *ptr = (char*)strrchr(base, ch);
return (ptr - base);

}

/* Base64 解码 */

string CBase64::Base64_decode(const char *data, int data_len)

{
int ret_len = (data_len / 4) * 3;
int equal_count = 0;
char *ret = NULL;
char *f = NULL;
int tmp = 0;
int temp = 0;
int prepare = 0;
int i = 0;
if (*(data + data_len - 1) == '=')
{
equal_count += 1;
}
if (*(data + data_len - 2) == '=')
{
equal_count += 1;
}
if (*(data + data_len - 3) == '=')
{//seems impossible 
equal_count += 1;
}
switch (equal_count)
{
case 0:
ret_len += 4;//3 + 1 [1 for NULL] 
break;
case 1:
ret_len += 4;//Ceil((6*3)/8)+1 
break;
case 2:
ret_len += 3;//Ceil((6*2)/8)+1 
break;
case 3:
ret_len += 2;//Ceil((6*1)/8)+1 
break;
}
ret = (char *)malloc(ret_len);
if (ret == NULL)
{
printf("No enough memory.\n");
exit(0);
}
memset(ret, 0, ret_len);
f = ret;
while (tmp < (data_len - equal_count))
{
temp = 0;
prepare = 0;
while (temp < 4)
{
if (tmp >= (data_len - equal_count))
{
break;
}
prepare = (prepare << 6) | (find_pos(data[tmp]));
temp++;
tmp++;
}
prepare = prepare << ((4 - temp) * 6);
for (i = 0; i < 3; i++)
{
if (i == temp)
{
break;
}
*f = (char)((prepare >> ((2 - i) * 8)) & 0xFF);
f++;
}
}
*f = '\0';

string strValue(ret);
free(ret);
return strValue;

}

注意:加密解密时,应该考虑到字符编码,不同字符编码加密得到的base64字符串可能不同。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息