密码学课程结束了,想着尽可能的 把每种加密算法都能用代码 实现一下。
今天的是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;
}