首页
社区
课程
招聘
[分享]base64加密解密算法(完整)
发表于: 2013-10-17 22:31 21510

[分享]base64加密解密算法(完整)

2013-10-17 22:31
21510
在网络上看到了,感觉不错,特发来分享

//base64编码表  
static char base64_table[] = {  
    'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K',  
    'L', 'M','N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V',  
    'W', 'X', 'Y', 'Z', 'a', 'b', 'c', 'd', 'e', 'f', 'g',  
    'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r',  
    's', 't', 'u', 'v', 'w', 'x', 'y', 'z', '0', '1', '2',  
    '3', '4', '5', '6', '7', '8', '9', '+', '/', '\0'
};
static char str_pad = '=';//pad 用“=”标记
//内部申请内存,外部一定要记得释放内存
char *base64_encode(char *str, int length)  
{  
    char *result,*p;  
    if(str == NULL || length <1)return NULL;  
    //分配空间,加密后的字符串长度是原字符串的4/3  
    result = (char *)malloc(((length + 2)/3)*4);  
    p = result;  
    if(result == NULL)  
    {  
    printf("malloc failed\n");  
    return NULL;  
    }  
    //这是剩余字符串长度大于等于3的情况  
    //通过位移来截取字节的位数  
    //第一个字节右移2位,得到base64的第一个目标字符  
    //第一个字节&0x03(00000011)后,再加上第二个字节右移4位,得到base64的第二个目标字符  
    //第二个字节&0x0f (00001111) 后,再加上第三个字节右移4位,得到base64的第三个目标字符  
    //第三个字节&0x3f (00111111) 后,得到base64的第四个目标字符  
    while( length > 2)  
    {  
    *result++ = base64_table[str[0] >> 2];  
    *result++ = base64_table[((str[0] & 0x03) << 4) + (str[1] >> 4)];  
    *result++ = base64_table[((str[1] & 0x0f) << 2) + (str[2] >> 6)];  
    *result++ = base64_table[str[2] & 0x3f];  
    length -= 3;  
    str += 3;  
    }  
    //剩余字符串长度小于3  
    if(length != 0)  
    {  
    *result++ = base64_table[str[0] >> 2];  
    //剩余长度为2  
        if(length > 1)  
        {  
        *result++ = base64_table[((str[0] & 0x03) << 4) + (str[1] >> 4)];  
        *result++ = base64_table[(str[1] & 0x0f) << 2];  
        *result++ = str_pad; //不够的补"="  
        }  
        //剩余字符串长度是1  
        else
        {  
        *result++ = base64_table[(str[0] & 0x03) << 4];  
        *result++ = str_pad;//不够的补"="  
        *result++ = str_pad;//不够的补"="  
        }  
    }  
    *result ='\0';  
    //输出结果  
    //printf("result:%s\n",p);  
    return p;  
}
   
/* Base-64 decoding.  This represents binary data as printable ASCII
** characters.  Three 8-bit binary bytes are turned into four 6-bit
** values, like so:
**
** [11111111] [22222222] [33333333]
**
** [111111] [112222] [222233] [333333]
**
** Then the 6-bit values are represented using the characters "A-Za-z0-9+/".
*/
static int b64_decode_table[256] = {
       -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,  /* 00-0F */
    -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,  /* 10-1F */
    -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,62,-1,-1,-1,63,  /* 20-2F */
    52,53,54,55,56,57,58,59,60,61,-1,-1,-1,-1,-1,-1,  /* 30-3F */
    -1, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9,10,11,12,13,14,  /* 40-4F */
    15,16,17,18,19,20,21,22,23,24,25,-1,-1,-1,-1,-1,  /* 50-5F */
    -1,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,  /* 60-6F */
    41,42,43,44,45,46,47,48,49,50,51,-1,-1,-1,-1,-1,  /* 70-7F */
    -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,  /* 80-8F */
    -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,  /* 90-9F */
    -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,  /* A0-AF */
    -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,  /* B0-BF */
    -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,  /* C0-CF */
    -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,  /* D0-DF */
    -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,  /* E0-EF */
    -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1  /* F0-FF */
};
   
/* Do base-64 decoding on a string. Ignore any non-base64 bytes.
** Return the actual number of bytes generated. The decoded size will
** be at most 3/4 the size of the encoded, and may be smaller if there
** are padding characters (blanks, newlines).
*/
int base64_decode( const char* str, unsigned char* space, int size )
{
   const char* cp = NULL;
   int space_idx = 0, phase = 0;
   int d = 0, prev_d = 0;
   unsigned char c;
   space_idx = 0;
   phase = 0;
   for ( cp = str; *cp != '\0'; ++cp )
   {
    d = b64_decode_table[(int)*cp];
    if ( d != -1 )
    {
     switch ( phase )
     {
     case 0:
      ++phase;
      break;
     case 1:
      c = ( ( prev_d << 2 ) | ( ( d & 0x30 ) >> 4 ) );
      if ( space_idx < size )
       space[space_idx++] = c;
      ++phase;
      break;
     case 2:
      c = ( ( ( prev_d & 0xf ) << 4 ) | ( ( d & 0x3c ) >> 2 ) );
      if ( space_idx < size )
       space[space_idx++] = c;
      ++phase;
      break;
     case 3:
      c = ( ( ( prev_d & 0x03 ) << 6 ) | d );
      if ( space_idx < size )
       space[space_idx++] = c;
      phase = 0;
      break;
     }
     prev_d = d;
    }
   }
   return space_idx;
}

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 0
支持
分享
最新回复 (13)
雪    币: 103
活跃值: (126)
能力值: ( LV7,RANK:110 )
在线值:
发帖
回帖
粉丝
2
最近做邮件客户端 刚好用的上……顶
2013-10-17 23:35
0
雪    币: 101
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
mark
2013-10-18 00:19
0
雪    币: 245
活跃值: (13)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
谢谢楼主分享
2013-10-18 01:00
0
雪    币: 10014
活跃值: (2012)
能力值: ( LV4,RANK:40 )
在线值:
发帖
回帖
粉丝
5
这么简单不知强度如何?
2013-10-18 13:56
0
雪    币: 185
活跃值: (25)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
base64 无强度。 因为这根本就不是用于保密的。

公开的。任何人都可以解密,
2013-10-18 15:21
0
雪    币: 10014
活跃值: (2012)
能力值: ( LV4,RANK:40 )
在线值:
发帖
回帖
粉丝
7
不能用于保密那加密有什么意义啊?
2013-10-19 19:24
0
雪    币: 39
活跃值: (52)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
看起來就是 8x3 = 6x4, table 轉換,學習了
2013-11-1 09:49
0
雪    币: 1034
活跃值: (16)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
说加密解密不贴切,应该是BASE64编码。。。尤其在互联网的应用上,需要把数据用可见字符进行编码。
2013-11-20 16:30
0
雪    币: 10014
活跃值: (2012)
能力值: ( LV4,RANK:40 )
在线值:
发帖
回帖
粉丝
10
那可以把二进制码用16进制码显示
2013-11-20 22:02
0
雪    币: 1034
活跃值: (16)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
没明白你想怎么表示。。
2013-11-21 15:41
0
雪    币: 12
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
标题的问题 base64不应该算加密!
2013-11-21 20:44
0
雪    币: 43
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
13
这个不是标准的吧。用这个编码了,别人不知道你的算法,能解码出来吗?
2013-11-22 22:35
0
雪    币: 1034
活跃值: (16)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
14
没有验证lz的程序。。但是BASE64的算法是公开的,只要遵守了BASE64的规范,谁去解码都都能恢复出来。。
2013-11-23 14:05
0
游客
登录 | 注册 方可回帖
返回
//