C语言进行base64加密PRO

本文深入探讨了Base64加密的基本原理,包括如何将8位数据拆分为6位并处理不足4的倍数的情况,以及如何通过在末尾添加等号来确保长度。此外,还解释了为何在表示字节时使用无符号字符(unsigned char)而非普通字符(char),以避免数据错误。文章提供了一个简单的C语言实现Base64加密的示例代码。
摘要由CSDN通过智能技术生成

,‘。;浅谈base64加密

将3个8位的数据分成4个6位的数据
而不足3的整数的数据加密后就造成不足4的倍数的问题,解决方案就是后面加=,补成4的倍数。
比如对a进行base64加密:0110 0001(从前往后取六位,剩下的两位当下一个六位的前两位就得到:011 000和010 000然后因为不是4的倍数,后后面加两个=)
就得到:YQ==

——————————————————————————————
实例:
对a45进行base64加密
分为四个6位数据:
011000 010011 010000 110101
24 19 16 52
Y T Q 1
第一个:
0110 0001:97
0001 1000:左移两位后
0011 1001:要和0x3f与
0001 1000:与后
第二个:
0110 0001:97
0001 0000:右移四位后
0011 0000:要和0x30与
0001 0000:与后
如果i+1 < 数据bite长度
0011 0010:52
0000 0011:右移四位
0000 1111:要和0x0f与
0000 0011:与后
0001 0000:进行或
0001 0011:得到第二个
否则超过数据bite长度
0001 0000:第二个直接用这个
后面加两个=,因为长度是4的整数
第三个:
0011 0100:52
1101 0000:左移两位后
0011 1100:要和0x3c与
0001 0000:与后
如果i + 2 < 数据bite长度
0001 0000:52
0000 0000:要和进行或
0001 0000:或后
得到第三个
第四个:
0011 0101:53
0011 1111:要和0x3f与
0011 0101:与后
得到第四个
否则:
0001 0000:这个是第三个
再加一个=
——————————————————————————————
我们在表示byte时,不用char 而用 unsinged char
这是因为:
char与unsigned char都占用一个字节(8bit)的内存,unsigned char无符号位,byte也无符号位这一说法。但是将byte的值取出赋值给int,long等其它类型时,系统会最高位进行扩展。如果使用符号类型(char),则以符号位(最高位)扩展,会造成数据错误;如果使用无符号类型(unsigned char),则以零扩展,并不会造成数据错误。因此常用unsigned char常用来表示byte。
参考博客:
http://www.cnblogs.com/E-star/archive/2013/04/16/3024258.html
——————————————————————————————

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int main()
{
    char yihuo[128];
    int a=0;
    char base64[128];
    char base64char[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";//base64的数据
    char denghao = '=';
    unsigned char sourcedata[128];//利用unsigned char 表示 byte
    unsigned char weishu = 0;
    scanf("%s",&sourcedata);
    int l = strlen(sourcedata);
    for(int i = 0;i<l;i++){
            a = sourcedata[i] + a;//计算输入字符串的ACSCII码值
    }
    if(a > 1000){
    int j = 0;
    int datalength = strlen(sourcedata);
    for(int i=0;i<datalength;i = i+3){//每三个一组进行加密
        //第一个加密数据
        weishu = ((sourcedata[i] >> 2) & 0x3f);//取第一个字符的前六位
        base64[j++] = base64char[weishu];
        //第二个加密数据
        weishu = ((sourcedata[i] << 4) & 0x30);//取第一个字符的后两位
        if (i + 1 < datalength){//如果i+1小于数据byte长度,则说明不用等号补
            weishu |= ((sourcedata[i + 1] >> 4) & 0x0f);//第一个字符的后两位和第二个字符的前四位或处理
            base64[j++] = base64char[weishu];
        }else{//如果i+1等于字符串长度,说明需要补上等号,弥补不足4的倍数的问题
            base64[j++] = base64char[weishu];
            base64[j++] = denghao;
            base64[j++] = denghao;
            break;
        }
        //第三个加密数据
        weishu = ((sourcedata[i + 1] << 2) & 0x3c);//取第二个数据的后四位
        if (i + 2 < datalength){//成立,加密两个。因为后面还有一个字符串提供后六位作为第四个加密数据
            weishu |= ((sourcedata[i + 2] >> 6) & 0x03);//和第三个字符串的前两位异或
            base64[j++] = base64char[weishu];//第三个加密数据

            weishu = sourcedata[i + 2] & 0x3f;//取三个字符串的后六位
            base64[j++] = base64char[weishu];//第四个
        }
        else{//没有下一个的前两位,后面补零,第四个加密数据补等号
            base64[j++] = base64char[weishu];

            base64[j++] = denghao;

            break;
        }
    }
    base64[j] = '\0';//空字符,字符串结束标志,作为字符串数组的末尾
    printf("%s",base64);
    }
    else{
        for(int i = 0;i < l;i++){//一个一个对应异或
            yihuo[i] = sourcedata[i] ^ base64char[i];
        }
        printf("%s",yihuo);
    }

        return 0;
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值