一.程序目的
使用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编码表进行异或运算并输出
|