C语言进行base64加密PRO

C语言进行base64加密PRO

六月 04, 2022

,‘。;浅谈base64加密

将3个8位的数据分成4个6位的数据
而不足3的整数的数据加密后就造成不足4的倍数的问题,解决方案就是后面加=,补成4的倍数。
比如对a进行base64加密:0110 0001(从前往后取六位,剩下的两位当下一个六位的前两位就得到:011 000和010 000然后因为不是4的倍数,后后面加两个=)
就得到:YQ==

——————————————————————————————
实例:
对a45进行base64加密
分为四个6位数据:
011000 010011 010000 110101
24 19 16 52
Y T Q 1
第一个:
0110 0001:97
0001 1000:左移两位后
0011 1001:要和0x3f与
0001 1000:与后
第二个:
0110 0001:97
0001 0000:右移四位后
0011 0000:要和0x30与
0001 0000:与后
如果i+1 < 数据bite长度
0011 0010:52
0000 0011:右移四位
0000 1111:要和0x0f与
0000 0011:与后
0001 0000:进行或
0001 0011:得到第二个
否则超过数据bite长度
0001 0000:第二个直接用这个
后面加两个=,因为长度是4的整数
第三个:
0011 0100:52
1101 0000:左移两位后
0011 1100:要和0x3c与
0001 0000:与后
如果i + 2 < 数据bite长度
0001 0000:52
0000 0000:要和进行或
0001 0000:或后
得到第三个
第四个:
0011 0101:53
0011 1111:要和0x3f与
0011 0101:与后
得到第四个
否则:
0001 0000:这个是第三个
再加一个=
——————————————————————————————
我们在表示byte时,不用char 而用 unsinged char
这是因为:
char与unsigned char都占用一个字节(8bit)的内存,unsigned char无符号位,byte也无符号位这一说法。但是将byte的值取出赋值给int,long等其它类型时,系统会最高位进行扩展。如果使用符号类型(char),则以符号位(最高位)扩展,会造成数据错误;如果使用无符号类型(unsigned char),则以零扩展,并不会造成数据错误。因此常用unsigned char常用来表示byte。
参考博客:
http://www.cnblogs.com/E-star/archive/2013/04/16/3024258.html
——————————————————————————————

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int main()
{
char yihuo[128];
int a=0;
char base64[128];
char base64char[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";//base64的数据
char denghao = '=';
unsigned char sourcedata[128];//利用unsigned char 表示 byte
unsigned char weishu = 0;
scanf("%s",&sourcedata);
int l = strlen(sourcedata);
for(int i = 0;i<l;i++){
a = sourcedata[i] + a;//计算输入字符串的ACSCII码值
}
if(a > 1000){
int j = 0;
int datalength = strlen(sourcedata);
for(int i=0;i<datalength;i = i+3){//每三个一组进行加密
//第一个加密数据
weishu = ((sourcedata[i] >> 2) & 0x3f);//取第一个字符的前六位
base64[j++] = base64char[weishu];
//第二个加密数据
weishu = ((sourcedata[i] << 4) & 0x30);//取第一个字符的后两位
if (i + 1 < datalength){//如果i+1小于数据byte长度,则说明不用等号补
weishu |= ((sourcedata[i + 1] >> 4) & 0x0f);//第一个字符的后两位和第二个字符的前四位或处理
base64[j++] = base64char[weishu];
}else{//如果i+1等于字符串长度,说明需要补上等号,弥补不足4的倍数的问题
base64[j++] = base64char[weishu];
base64[j++] = denghao;
base64[j++] = denghao;
break;
}
//第三个加密数据
weishu = ((sourcedata[i + 1] << 2) & 0x3c);//取第二个数据的后四位
if (i + 2 < datalength){//成立,加密两个。因为后面还有一个字符串提供后六位作为第四个加密数据
weishu |= ((sourcedata[i + 2] >> 6) & 0x03);//和第三个字符串的前两位异或
base64[j++] = base64char[weishu];//第三个加密数据

weishu = sourcedata[i + 2] & 0x3f;//取三个字符串的后六位
base64[j++] = base64char[weishu];//第四个
}
else{//没有下一个的前两位,后面补零,第四个加密数据补等号
base64[j++] = base64char[weishu];

base64[j++] = denghao;

break;
}
}
base64[j] = '\0';//空字符,字符串结束标志,作为字符串数组的末尾
printf("%s",base64);
}
else{
for(int i = 0;i < l;i++){//一个一个对应异或
yihuo[i] = sourcedata[i] ^ base64char[i];
}
printf("%s",yihuo);
}

return 0;
}