c语言实现base64加密

1. base64 c语言实现

#include<stdio.h>
#include <string.h>
char base64[1000];
char base[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
int main()
{
    int i = 0;//需要加密字符串编号
    int j = 0;//加密之后字符串编号
    int len;//字符长度
    int flag;//判断倍数
    char str[1000];
    printf("需要加密的字符串:\n");
    gets_s(str);
    len = (int)strlen(str);//输入字符串的长度
    //123456   78 1234    5678 12     345678 
    flag = len % 3;
    //判断是否为三个倍数
    for (i = 0, j = 0; i <= len - 3; i += 3, j += 4)
    {
        base64[j] = base[str[i] >> 2];//取第一个字符的前6位
        base64[j + 1] = base[(((str[i] & 3) << 4) | str[i + 1] >> 4)];
        //取第一个字符的后两位与第二个字符的前四位
        base64[j + 2] = base[((str[i + 1] & 15) << 2) | str[i + 2] >> 6];
        //取第二个字符的后四位和第三个字符的前两位
        base64[j + 3] = base[str[i + 2] & 63];
        //取第三个字符最后六位
    }
    //123456 78
    if (flag == 1)
    {
        base64[j] = base[str[len - 1] >> 2];
        base64[j + 1] = base[(str[len - 1] << 4) & 63];
        base64[j + 2] = '=';
        base64[j + 3] = '=';
    } else if (flag == 2)//123456 78 1234 567800 
    {
        base64[j] = base[str[len - 2] >> 2];
        base64[j + 1] = base[((str[len - 2] & 3) << 4) | (str[len - 1] >> 4)];
        base64[j + 2] = base[(str[len - 1] << 2)& 63];
        base64[j + 3] = '=';
    }
    printf("经过base64表加密后\n");
    puts(base64);
    return 0;
}

2.语句解读

首先,我是将每三个字符放在一起处理,因为三个字符是24bit,同样是86的倍数。

base64[j] = base[str[i] >> 2];
取第一个字符的前6位,>>是将位数右移,即原为1000 0011 变为了 1000 008位变成了6位

base64[j + 1] = base[(((str[i] & 3) << 4) | str[i + 1] >> 4)];
取第一个字符的后2位与第二个字符的前4位
我在进行移位前先对第一个字符进行了 & 3 的运算
2位的二进制的最大值为3
因为3的二进制是11,如果进行了 1101 & 11 的运算 结果为 0001
目的是使除了我需要部分的数值不变以外,将其他位置改为0
然后左移4位,成为第二个base字符的56两位
在加上第二个字符的后4位

base64[j + 2] = base[((str[i + 1] & 15) << 2) | str[i + 2] >> 6];
取第二个字符的后4位和第三个字符的前两位
同样先进行了 & 15 运算,只取所需要的值,与上面同理
因为我这里是需要第二个字符的后4位,而42进制的最大值为15

base64[j + 3] = base[str[i + 2] & 63];
取第三个字符最后六位

在这里插入图片描述
这一步很重要,因为当最后凑不齐3个字符的时候,要自动补0,补到24位
注意补零所得到的00000类型用‘=’表示

3.验证

这里推荐一个网站,可以快速的得到结果
链接: base64的加密与解密

在这里插入图片描述
ok 没有问题

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值