# 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;
}

这是主函数的代码。

# 结束语

总的来说不难,只是对算法的理解和编写代码的练习。

Edited on

Give me a cup of [coffee]~( ̄▽ ̄)~*

lxy WeChat Pay

WeChat Pay

lxy Alipay

Alipay

lxy PayPal

PayPal