c语言base64加密

一.程序目的

使用c/c++完成以下下算法:

输入一个字符串,检查该字符串总ascii码值。如果值大于1000则对该字符串进行base64加密输出,否则该字符串与base64编码表进行异或输出

二.程序代码

代码如下:

#include<stdio.h>
#include<string.h>
int main(){
    
    
	char x[1000]="",y[1000]="",z[1000]="";
	char base[]="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
	int i,sum=0,len=0,j;
	printf("请输入字符串:");
	gets(x);
	len=strlen(x);
	for(i=0;i<len;i++){
    
    

		sum=sum+x[i];
	}

	for(i=0,j=0;j<len;i+=4,j+=3){
    
    
		y[i]=base[x[j]>>2];
		y[i+1]=base[(x[j]&0x3)<<4|(x[j+1]>>4)];
		y[i+2]=base[(x[j+1]&0xf)<<2|(x[j+2]>>6)];
		y[i+3]=base[(x[j+2]&0x3f)];
	}
    switch(len%3){
    
    
     case 1:{
    
    
        y[i-2]='=';
		y[i-1]='=';
		break;
    }
     case 2:
        {
    
    
        y[i-1]='=';
        break;
        }
    }

	if(sum>1000){
    
    
		printf("字符串的ASCII值为%d\n",sum);
		printf("输入的字符串ASCII值大于1000\n");
		printf("base64加密:");
		puts(y);
	}
	else{
    
    
		printf("输入的字符串ASCII值小于1000,将与base64编码表进行异或运算\n");
		printf("异或运算后的结果为:");
		for(i=0;i<len;i++){
    
    
			z[i]=x[i]^base[i];
		}
		puts(z);
	}

    }

三.程序分析

1.这里先说一下base64加密

通常一个字节是8位,而base64加密是使这些8位的变为6位,就比如说“ABC”对应的二进制:

01000001 01000010 01000011

转为六位就是:(010000) (010100)(001001)(000011)

而正是其最多只有六位,2的6次方=64,base64由此得名,且base64编码表中总共有64个字符,如下表

点击查看图片来源

通过上表,base64加密“ABC”得:QUJD

若有两个字符,比如“12”的二进制:00110001 00110010

转为六位一组就是 001100 010011 001000(不够自动补0)

本来按这样的规律base64加密是:MTI

但像这种2%3=2的字符串长度,需要再补上‘=’,也就是最后的加密结果是:MTI=

若字符串长度为1,也就是1%3=1,需要在加密过后再补上两个‘=’;

2.代码分析

#include<stdio.h>
#include<string.h>
int main(){
	char x[1000]="",y[1000]="",z[1000]="";//初始化数组
	char base[]="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";//引入base64编码表
	int i,sum=0,len=0,j;
	printf("请输入字符串:");
	gets(x);
	len=strlen(x);//获取字符串长度
	for(i=0;i<len;i++){

		sum=sum+x[i];
	}

这一段主要是初始化数组,输入字符串并计算字符串的ASCII值

for(i=0,j=0;j<len;i+=4,j+=3){
		y[i]=base[x[j]>>2];
		y[i+1]=base[(x[j]&0x3)<<4|(x[j+1]>>4)];
		y[i+2]=base[(x[j+1]&0xf)<<2|(x[j+2]>>6)];
		y[i+3]=base[(x[j+2]&0x3f)];
	}
    switch(len%3){
     case 1:{
        y[i-2]='=';
		y[i-1]='=';
		break;
    }
     case 2:
        {
        y[i-1]='=';
        break;
        }
    }

这一段是对输入的字符串进行base64加密

for循环理论不知道该咋说,只能举个栗子,

比如输入ABC,对应的二进制也就是:01000001 01000010 01000011,让第一组二进制左移两位,也就是010000,得到第一组六位base 010000;

然后再让01000001与0x3(也就是11)进行与运算,也就把01000001的后两位提出来,然后左移四位也就得到010000,就是第二组base的前两位,再与右移四位的01000010(即0100)进行或运算,得到第二组六位base 010100;

第三组base就是让01000010&0xf(也就是1111)得到0010接着左移两位得到001000,01000011右移两位得到01,001000|01得到第三组base 001001;

第四组base就01000011&0x3f(也就是111111)得到000011

添加‘=’的这段代码,我也不会讲,也只能举个栗子

比如输入的字符串是‘1’,经过for循环之后,i的值为4,也就是y数组长度为5,但是从y[i-2]的值就是空的,所以添加‘=’要从y[i-2]开始赋值,由于y[i]里面没有存储值,所以数组长度就是4,而1%3=1,也符合上面的代码(感觉讲的好乱,不过我确实尽力了QAQ)

if(sum>1000){
		printf("字符串的ASCII值为%d\n",sum);
		printf("输入的字符串ASCII值大于1000\n");
		printf("base64加密:");
		puts(y);
	}
	else{
		printf("输入的字符串ASCII值小于1000,将与base64编码表进行异或运算\n");
		printf("异或运算后的结果为:");
		for(i=0;i<len;i++){
			z[i]=x[i]^base[i];
		}
		puts(z);
	}

    }

ASCII值大于1000,作base64加密并输出

ASCII值小于1000,原字符串与base64编码表进行异或运算并输出

四.运行结果及验证

程序运行结果:
在这里插入图片描述

在线base64加密验证:

在这里插入图片描述

ASCII值小于1000,原字符串与base64编码表进行异或运算并输出

猜你喜欢

转载自blog.csdn.net/m0_51295934/article/details/124482048