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);
}
}
return 0;
}
这是主函数的代码。
结束语
总的来说不难,只是对算法的理解和编写代码的练习。