学长的新题

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

这是主函数的代码。

结束语

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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值