开启左侧

Base64加密解密

二维码 [复制链接]
288 0
Base64是网络上最常见的8bit字节代码的编码。
The Base64 Alphabet



索引

对应字符

索引

对应字符

索引

对应字符

索引

对应字符

0

A

17

R

34

i

51

z

1

B

18

S

35

J

52

0

2

C

19

T

36

K

53

1

3

D

20

U

37

L

54

2

4

E

21

V

38

M

55

3

5

F

22

W

39

N

56

4

6

G

23

X

40

O

57

5

7

H

24

Y

41

P

58

6

8

I

25

Z

42

Q

59

7

9

J

26

a

43

R

60

8

10

K

27

b

44

S

61

9

11

L

28

c

45

T

62

+

12

M

29

d

46

U

63

/

13

N

30

e

47

V



14

O

31

f

48

W



15

P

32

g

49

X



16

Q

33

h

50

Y



Base64原理:
Base64中的是我们一般的常见的可用字符,如上表所示。所以64个字符如果用二进制来表示则为2的6次方。所以也就是说用到了6位二进制的数可以来表示base64中的所有字符。我们可以将base64用于加密解密。那么就是将我们的一般char型的字符变为base64.字符。

编码规则:如果要将8位的char型字符变为6位的base64字符。我们可以采用如下编码规则。先将3位char型字符归为一组,那么就有了24位。如果要变为6位,那么这24位字符可以变为4组6位的base64字符。这样依次将8位的char型字符转变为6位的base64字符。注意这里所有的转变都是以8位的char型为基础的,转变后的base64也是char型,只是其最高两位都为0。这样在后期的操作时,就可以根据上面的表格来对base64的char型来赋字符了。如果还有剩余的字符那么如果来操作?一般剩余的字符就是1,2位了。
剩余为1位:这里就还有8位,如果要变为6位,那么就在它后面加4位0,这样变化时就可以得到2个6位的base64字符。为了补齐字节数,我们还要在末尾加两个’=’字符。剩余为2位:这里就还有16位,如果要变为6位,那么就在它后面加2位0,这样变化时就可以得到3个6位的base64字符。为了补齐字节数,我们还要在末尾加一个’=’字符。

做了上述操作之后,就变为4的整数倍的base64字符,实质上就最高两位都为0的8位二进制数。如果转换为10进制数,那么就是0~63了。如果要在系统中显示出ABCDEFGHIJKLMNOPQRSTUVWXYZabxdefghijklmnopqrstuvwxyz0123456789+/,那么就要与char型字符中的这些字符对应起来。A~Z是65~90;a~z是97~122;0~9是48~57;+是43;/是47。只要将这0~63变化为对应的这些字符所表示的10进制数就可以了,然后再加上相应的’=’字符就是我们所要的结果。

解码规则:如果要将这些加密后变为base64的字符变为原来的char型字符,这就是相当于原来的编码的逆操作了。先将显示出来的字符变为真正的base64原来的高两位都为0的8位二进制数。然后就可以把4位base64组合起来变为3位char型字符。至于剩下的字符,我这里是2和3位,因为我没有用到’=’字符来计算,只是使用了被作用后的base64字符。那么根据前面的编码理论,那么就只剩下了2位或者3位base64字符了。剩下2位base64,就可以解码出一位char型字符,剩下3位base64字符就可以解码出2位char型字符。






  1. /**************************************************************
  2. *     Copyright (C) 2006-2013 All rights reserved.
  3. *       @Version: 1.0
  4. *       @Created: 2013-05-19 10:40
  5. *        @Author: chin - qin@126.com
  6. *   @Description: 编码规则:
  7.              1、把三上字符转换成4个字符
  8.                 例:字符串“张”
  9.                 11010101 HEX:D5 11000101 HEX:C5
  10.                 00110101 00011100 00010100
  11.                 十进制53 十进制34 十进制20 pad
  12.                 字符’1’ 字符’i’ 字符’U’ 字符’=
  13.                 不足的字符以'='补齐
  14.              2、每76个字符后加一个换行符
  15. *
  16. *       @History:
  17. **************************************************************/
  18. #include <stdio.h>
  19. #include <string.h>
  20. #include <malloc.h>

  21. static char base64_code_ch[64] =
  22. {
  23.     'A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P',
  24.     'Q','R','S','T','U','V','W','X','Y','Z','a','b','c','d','e','f',
  25.     'g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v',
  26.     'w','x','y','z','0','1','2','3','4','5','6','7','8','9','+','/'
  27. };


  28. /**
  29. * @brief base64_to_string
  30. *
  31. * @Param: input
  32. * @Param: input_len
  33. * @Param: output_len
  34. *
  35. * Returns: 成功则返回解码后的字符串和长度,失败返回NULL
  36. */
  37. unsigned char *base64_to_string(const unsigned char *input, size_t input_len, size_t *output_len)
  38. {
  39.     unsigned char *output = NULL, buf[4];
  40.     int pos = 0;
  41.     size_t count = 0, len = 0;

  42.     if(input)
  43.     {
  44.     output = (unsigned char *)malloc(3*(input_len/4) + 1);
  45.     if(output)
  46.     {
  47.         while( *input != '\0' )
  48.         {
  49.         if( *input != '\n' )
  50.         {
  51.             for(pos=0; pos < 64; pos++)
  52.             {
  53.             if( *input == base64_code_ch[pos])
  54.             {
  55.                 buf[count++] = pos;
  56.                 break;
  57.             }
  58.             }
  59.             if(count == 4)
  60.             {
  61.             output[len++] = buf[0] << 2 | buf[1] >> 4;
  62.             output[len++] = buf[1] << 4 | buf[2] >> 2;
  63.             output[len++] = buf[2] << 6 | buf[3];
  64.             count = 0;
  65.             }
  66.             input++;
  67.         }
  68.         else
  69.         {
  70.             input++;
  71.         }
  72.         }
  73.         /*处理后四位,两种情况,有一个=号和有两个=号*/
  74.         if(count == 2)  //两个等于号的情况
  75.         {
  76.         output[len++] = buf[0] << 2 | buf[1] >> 4;
  77.         }
  78.         else if(count == 3)
  79.         {
  80.         output[len++] = buf[0] << 2 | buf[1] >> 4;
  81.         output[len++] = buf[1] << 4 | buf[2] >> 2;
  82.         }

  83.         output[len] = '\0';
  84.         if( output_len )
  85.         *output_len = len;

  86.         return output;
  87.     }
  88.     }

  89.     return NULL;
  90. }

  91. int main(int argc,char *argv[])
  92. {
  93.     size_t encode_len;
  94.     size_t decode_len;
  95.     unsigned char *p2;
  96.     if(argc != 2)
  97.     {
  98.     fprintf(stderr,"Error input !\n");
  99.     return 0;
  100.     }
  101.     encode_len = strlen(argv[1]);
  102.     printf("encode_len= %u\n",encode_len);

  103.     p2 = base64_to_string( (unsigned char *)argv[1], encode_len, &decode_len );
  104.     //p2 = base64_to_string( NULL, encode_len, &decode_len );
  105.     if(p2)
  106.     printf("decode_len = %u,decode = %s\n",decode_len,p2);
  107.     else
  108.     printf("NULL\n");
  109.     free(p2);
  110.     p2 = NULL;

  111.     return 0;
  112. }
复制代码
  1. /**************************************************************
  2. *     Copyright (C) 2006-2013 All rights reserved.
  3. *       @Version: 1.0
  4. *       @Created: 2013-05-19 10:40
  5. *        @Author: chin - qin@126.com
  6. *   @Description: 编码规则:
  7.              1、把三上字符转换成4个字符
  8.                 例:字符串“张”
  9.                 11010101 HEX:D5 11000101 HEX:C5
  10.                 00110101 00011100 00010100
  11.                 十进制53 十进制34 十进制20 pad
  12.                 字符’1’ 字符’i’ 字符’U’ 字符’=
  13.                 不足的字符以'='补齐
  14.              2、每76个字符后加一个换行符
  15. *
  16. *       @History:
  17. **************************************************************/
  18. #include <stdio.h>
  19. #include <string.h>
  20. #include <malloc.h>

  21. static char base64_code_ch[64] =
  22. {
  23.     'A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P',
  24.     'Q','R','S','T','U','V','W','X','Y','Z','a','b','c','d','e','f',
  25.     'g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v',
  26.     'w','x','y','z','0','1','2','3','4','5','6','7','8','9','+','/'
  27. };


  28. /**
  29. * @brief string_to_base64
  30. *
  31. * @Param: input  输入字符串
  32. * @Param: input_len  输入字符串长度
  33. * @Param: out_len 编码后字符串长度
  34. *
  35. * Returns: 成功返回编码后的字符串,失败返回NULL
  36. */
  37. unsigned char *string_to_base64(const unsigned char *input, size_t input_len, size_t *out_len )
  38. {
  39.     unsigned char *output = NULL;
  40.     int i = 0;
  41.     size_t tmp_len = 0;
  42.     size_t len = 0;
  43.     unsigned int count = 0;

  44.     if(input)
  45.     {
  46.     tmp_len = input_len / 3;
  47.     output = (unsigned char *)malloc( 4*(tmp_len + 1) + input_len / 76 + 1 );
  48.     for(i=0; i < 3*tmp_len; i += 3)
  49.     {
  50.         output[len++] = base64_code_ch[input >> 2];
  51.         output[len++] = base64_code_ch[(input & 0x03) << 4 | input[i + 1] >> 4];
  52.         output[len++] = base64_code_ch[(input[i + 1] & 0x0F) << 2 | input[i + 2] >> 6];
  53.         output[len++] = base64_code_ch[input[i + 2] & 0x3F];
  54.         count++;
  55.         if( count % 19 == 0)
  56.         {
  57.         output[len++] = '\n';
  58.         count = 0;
  59.         }
  60.     }
  61.     /*分开做,为了简洁可读性*/
  62.     tmp_len = input_len % 3;
  63.     if(tmp_len != 0)
  64.     {
  65.         if(tmp_len == 1)
  66.         {
  67.         output[len++] = base64_code_ch[input >> 2];
  68.         output[len++] = base64_code_ch[(input & 0x03) << 4];
  69.         output[len++] = '=';
  70.         output[len++] = '=';
  71.         count++;
  72.         }
  73.         else
  74.         {
  75.         output[len++] = base64_code_ch[input >> 2];
  76.         output[len++] = base64_code_ch[(input & 0x03) << 4 | input[i + 1] >> 4];
  77.         output[len++] = base64_code_ch[(input[i + 1] & 0x0F) << 2];
  78.         output[len++] = '=';
  79.         count++;
  80.         }
  81.     }
  82.     if( count % 19 == 0)
  83.     {  
  84.         output[len++] = '\n';
  85.     }
  86.     output[len] = '\0';
  87.     /*返回编码后的长度和字符串*/
  88.     if(out_len)
  89.         *out_len = len;
  90.     return output;
  91.     }

  92.     return NULL;
  93. }


  94. int main(int argc,char *argv[])
  95. {
  96.     size_t encode_len;
  97.     size_t src_len;
  98.     unsigned char *p1;

  99.     if(argc != 2)
  100.     {
  101.     fprintf(stderr,"Error input !\n");
  102.     return 0;
  103.     }
  104.     src_len = strlen(argv[1]);
  105.     printf("src_len = %u\n",src_len);
  106.     p1 = string_to_base64( (unsigned char *)argv[1], src_len, &encode_len );
  107.     if(p1)
  108.     printf("encode_len = %u,encode = %s\n",encode_len,p1);

  109.     free(p1);
  110.     p1 = NULL;

  111.     return 0;
  112. }
复制代码



赞助本站





上一篇:强大的grep用法详解:grep与正则表达式
下一篇:高斯日记
学会善用【论坛搜索】功能,很多你要寻找的答案就在这里面;
资源共享区【解压密码】集合,【爱好街币】的作用与获取方式;
您需要登录后才可以回帖 登录 | 注册

本版积分规则

发新帖 回复

104

主题

104

帖子

233

街币
更多

精彩推荐

新人报到专用贴
新人报到专用贴
==新人报道格式(选填)== 【我的昵称】: 【我的性别
爱好街资源共享区文件解压密码
爱好街资源共享区文件解压密码
因本站分享的文件实在太多,目前收集整理已经接近4T,所以有些文
独立团VIP教程第1-7版全套打包下载(含课件源码工具等)
独立团VIP教程第1-7版全套打包
独立团第1版易语言教程 独立团第一版1易语言入门 1-1-1外
爱好街链接地址失效有奖报错
爱好街链接地址失效有奖报错
我们的成长离不开大家的支持!! 各位爱好街的会员:
魔鬼作坊vip教程辅助制作培训之零基础绝密汇编语言入门课程
魔鬼作坊vip教程辅助制作培训
这套课程为汇编入门教程,学习游戏逆向反汇编需要用到的基础知
万挂作坊教程+封包+E模块(全套下载)
万挂作坊教程+封包+E模块(全套
万挂-封包 封包加密解密-01 封包加密解密-02 封包加密

免责声明:
在爱好街发布的文章与主题属会员个人意见,与本站立场无关,文章内容由作者与爱好街享有相关版权,如需转载请注明出处或取得会员与本站的许可,否则本站将追究相应的法律责任,如部分内容有侵犯任何版权问题,请立即告知本站,本站将及时予以删除并致以最深的歉意。另外不得将本站内容用于商业或者非法用途,否则,一切后果请用户自负。

Mail To:MasTer@AiHaiJie.Com

快速回复
快速回复 返回顶部 返回列表