原理
Base64是网络上最常见的用于传输8Bit字节码的编码方式之一,它是一种基于64个可打印字符来表示二进制数据的方法,可用于在HTTP环境下传递较长的标识信息。
Base64要求把每三个8Bit的字节转换为四个6Bit的字节(38 = 46 = 24),然后把6Bit再添两位高位0,组成四个8Bit的字节,也就是说,转换后的字符串理论上将要比原来的长1/3。
理解明文、密文、密钥等概念,并对简单的密文进行破解。
Test1
内容
Convert hex to base64 (编程将十六进制的字符串转换成base64编码):
编程将如下的十六进制字符串:
49276d206b696c6c696e6720796f757220627261696e206c696b65206120706f69736f6e6f7573206d757368726f6f6d
转换成如下的base64编码的字符串:
SSdtIGtpbGxpbmcgeW91ciBicmFpbiBsaWtlIGEgcG9pc29ub3VzIG11c2hyb29t
注意:之后的实验会用到本题的程序。
代码参考
三个十六进制数可以用两个六十四进制数表示,将给定的十六进制字符串读入字符数组,找到最后一个字符的位置,向前遍历,每三个字符按照十六进制表转换成十进制,再转换成两个六十四进制字符保存到另一个字符数组中,最后再把存有六十四进制字符的字符串输出。
#include<stdio.h>
#define NUM 100
int hex2d(char a, char b, char c);
int main(void){
char m[NUM], c[NUM];
char base64[]="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
int i, j, s=0;
FILE *fp;
fp=fopen("data.txt","r");
fscanf(fp, "%s", m);
fclose(fp);
for(i=0; m[i]!='\0'; i++)//i point to the last letter of string
j=i;c[j]=m[i];//c[j]=m[i]='\0'
while(i-3>=0){
s=hex2d(m[i-3], m[i-2], m[i-1]);
c[j-1]=base64[s%64];
c[j-2]=base64[s/64];
i-=3;
j-=2;
}
//handle the rest if have
if(2==i){
s=0;
if('a'<=m[0] && m[0]<='f'){
s+=(m[0]-87)*16;
}else{
s+=(m[0]-48)*16;
}
if('a'<=m[1] && m[1]<='f'){
s+=(m[1]-87);
}else{
s+=(m[1]-48);
}
c[j-1]=base64[s%64];
c[j-2]=base64[s/64];
j-=2;
}
if(1==i){
s=0;
if('a'<=m[0] && m[0]<='f'){
s+=(m[0]-87);
}else{
s+=(m[0]-48);
}
c[j-1]=base64[s];
j--;
}
puts(m);
for(j;c[j]!='\0';j++){
putchar(c[j]);
}
return 0;
}
int hex2d(char a, char b, char c){
//convert hex to 10
int s=0;