,‘。;浅谈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; }
|