密码学课程结束了,想着尽可能的 把每种加密算法都能用代码 实现一下。
今天的是base64编码是比较简单的。
1.首先就是将字符串分组,按位进行分,每6位一组;不足6位的补上0.
2.然后分别将6位 变成字节的 形式,就是在每6位的前面加上 两个0凑够8位。
3.然后在一个列表中根据这个值作为 索引找到编码后的字符。
Q:整体上是输入的字符串3个字节一组,然后根据位,每6位 代表一个字符,然后转换成 字节,变成编码后的4个字节一组。 如果不能恰好按照3个字节转换成 编码后的4个字节, 就要在编码后的字节补上=,使其 凑够4个字节一组。
{'A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z', 'a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z', '0','1','2','3','4','5','6','7','8','9',
'+','/'};
#include<stdio.h> #include<string.h> #include<stdlib.h> char List[]={'A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z', 'a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z', '0','1','2','3','4','5','6','7','8','9','+','/'}; //3-->4 //base64编码是根据字符串的长度进行分割的,首先3个一组就是24位 再将24位以6位进行分割,前面补上两个0,保证组成的新的八位范围是0-63,然后根据此索引在上面的数组进行查找 //如果待处理的字符串不能恰好3个一组需要进行补位。首先按照原字符串进行原规则进行编码,编码后发现不足4字节就会补=号 //6-x%6确定补0的个数 // char* base64(char *str,int strlen,int n_zero); int main() { char str[1000];//预存输入的字符串 int n_zero=0;//补0的个数 char* xinde; printf("please input the string needed:");scanf("%s",str) ; if(strlen(str)*8%6) n_zero=6-strlen(str)*8%6; xinde=base64(str,strlen(str),n_zero); printf("base64:%s",xinde); system("pause"); } char* base64(char *str,int strlen,int n_zero)//str是原字符串,strlen是原字符串的长度,第三个参数是需要补的0的个数 { // // (strlen*8+n_zero)/6是补0后的字符串长度 // 4-((strlen*8+n_zero)/6)%4是需要添加的=号个数 char *temp;//用于存放补0后的字符串 和=号 bool bit[1000];//用于操作位 int i,j,cx=0; char c; if(((strlen*8+n_zero)/6)%4){ temp=(char*)malloc((strlen*8+n_zero)/6+4-((strlen*8+n_zero)/6)%4+1); temp[(strlen*8+n_zero)/6+4-((strlen*8+n_zero)/6)%4]=0; } else{ temp=(char*)malloc((strlen*8+n_zero)/6+1); temp[(strlen*8+n_zero)/6+1]=0; } // // 下面是进行位的转换 // for(i=0;i<strlen;i++)//遍历每个字符 { c=str[i]; for(j=0;j<=7;j++)//用于移位 { bit[cx]=(unsigned char)(c<<j)&(unsigned char)(0x80); cx++; } } // 01100100d 0110 1001 i // 进行补零 // for(i=0;i<n_zero;i++) { bit[cx]=0; cx++; } // // 下面进行分组,由8位一个字节,到6位一个字节 // cx=0; for(i=0;i<(strlen*8+n_zero)/6;i++) { temp[i]&=0;//全部位置零 for(j=5;j>=0;j--)//6bit转向8bit { c=bit[cx];//先转成字节,方便进行移位 temp[i]|=(unsigned char)c<<j; cx++; } temp[i]=List[temp[i]];//映射 } // // 6位转8位成功,然后就是涉及到关于=号的添加 ,4-x%4 // if(((strlen*8+n_zero)/6)%4) for(i=(strlen*8+n_zero)/6;i<(strlen*8+n_zero)/6+4-((strlen*8+n_zero)/6)%4;i++) temp[i]='='; return temp; }