# base64 加密
# 要求
输入一个字符串,检查该字符串总 ascii 码值。如果值大于 1000 则对该字符串进行 base64 加密输出,否则该字符串与 base64 编码表进行异或输出。记录博客。
# 想法
对于网安这方面接触也有大半年了,base64 是我最常见的加密方式。感觉不会太难。
# 思路
base64:将三个字符的 ASCII 四等分,变成四个六个二进制位的数据,再根据 base64 编码表翻译过来,大体如下:
下面这个是需加密字符不是 3 的倍数时的加密方法。
# 代码
int zhuan(char str[],int number) { | |
char b[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/="; | |
// 和别的密码表比起来我这多了一个末尾的 “=” 号,是用来填补不足三的倍数时 | |
// 更重要的是方便理解,下面用到时会介绍 | |
char c[100]; | |
int len = number; | |
int v =(len/3)*4;// 加密后的字符长度 | |
int i = 0; | |
int j = 0; | |
if (len % 3 == 0) { | |
for (i = 0, j = 0; j < len; j += 3, i += 4) | |
{ | |
c[i] = str[j] >> 2; // 取出第一个字符的前 6 位并找出对应的结果字符 | |
c[i + 1] = (str[j] & 0x3) << 4 | (str[j + 1] >> 4); // 将第一个字符的后位与第二个字符的前 4 位进行组合并找到对应的结果字符 | |
c[i + 2] = (str[j + 1] & 0xf) << 2 | (str[j + 2] >> 6); // 将第二个字符的后 4 位与第三个字符的前 2 位组合并找出对应的结果字符 | |
c[i + 3] = str[j + 2] & 0x3f; // 取出第三个字符的后 6 位并找出结果字符 | |
} | |
} | |
if (len % 3 == 1) { | |
for (i = 0, j = 0; j < len-1; j += 3, i += 4) | |
{ | |
c[i] = str[j] >> 2; | |
c[i + 1] = (str[j] & 0x3) << 4 | (str[j + 1] >> 4); | |
c[i + 2] = (str[j + 1] & 0xf) << 2 | (str[j + 2] >> 6); | |
c[i + 3] = str[j + 2] & 0x3f; | |
} | |
c[i] = str[j] >> 2; | |
c[i + 1] = (str[j] & 0x3) << 4 | (0 >> 4); | |
c[i + 2] = 64;// 这里就是上面 “=” 放在最后的用处 | |
c[i + 3] = 64; | |
v=v+4;// 上面在 “/3” 时会将余数舍去,这里加上一组 | |
} | |
if (len % 3 == 2) { | |
for (i = 0, j = 0; j < len-2; j += 3, i += 4) | |
{ | |
c[i] = str[j] >> 2; | |
c[i + 1] = (str[j] & 0x3) << 4 | (str[j + 1] >> 4); | |
c[i + 2] = (str[j + 1] & 0xf) << 2 | (str[j + 2] >> 6); | |
c[i + 3] = str[j + 2] & 0x3f; | |
} | |
c[i] = str[j] >> 2; | |
c[i + 1] = (str[j] & 0x3) << 4 | (str[j + 1] >> 4); | |
c[i + 2] = (str[j + 1] & 0xf) << 2 | (0 >> 6); | |
c[i + 3] = 64; | |
v=v+4; | |
} | |
for (x=0; x < v; x++) { | |
printf("%c", b[c[x]]); | |
}// 循环输出 | |
return 0; | |
} |
这是 base64 加密代码,感觉写的有点拉,不过能体现出 base64 的加密逻辑。
int main() { | |
char str[100]="\0"; | |
int a = 0; | |
int i = 0; | |
int number=0; | |
gets(str); | |
for(i=0; i<100; i++) { | |
if(str[i]!='\0'){ | |
number++; | |
} | |
else{ | |
break; | |
} | |
} | |
printf("共%d个字符\n",number); | |
i=0; | |
while (i < number) | |
{ | |
a += str[i]; | |
i++; | |
} | |
if (a > 1000) { | |
printf("加密后:\n"); | |
zhuan(str,number); | |
} | |
else { | |
char a[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/="; | |
int b; | |
printf("加密后:\n"); | |
for(i=0;i<number;i++){ | |
b=a[i]^str[i]; | |
printf("%c",b); | |
} | |
} | |
system("pause"); | |
return 0; | |
} |
这是主函数的代码。
# 结束语
总的来说不难,只是对算法的理解和编写代码的练习。