Base64

    Base64加密算法主要原理是根据3*8=4*6=24这一原理,由于ASCII码范围是0~127,二进制表示为0000 0000~0111 1111。所以3个8位的字符通过位运算能与4个6位(实际也是8位不过前2为全为0)的表示相同的内容。所以加密后的字符串要比源字符串多1/3。例如:

源字符串(3个):0010 1101    0011 1010    0111 0110

目标字符串(4个): 0000 1011    0001 0011    0010 1001    0011 0110

当源字符串不足3个的时候,用全0来补足 ,转换后用=号来代替。

迅雷的“专用地址”是用Base64加密。 

一、在地址的前后分别添加AA和ZZ

二、对新的字符串进行Base64编码

三、在上面得到的字符串前加上"thunder://" 

Windows平台:

#include <stdio.h>
#include <string.h>

#define MaxLength 10000

char Str[MaxLength];
char Res[MaxLength];
char Base64Encode[64]= {'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','+','/'
};
int Base64Decode[128]= {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 62, -1, -1, -1, 63,
52, 53, 54, 55, 56, 57, 58, 59, 60, 61, -1, -1, -1, -1, -1, -1,
-1, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14,
15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, -1, -1, -1, -1, -1,
-1, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40,
41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, -1, -1, -1, -1, -1
};
int Cnt;

void Encode(char *S)
{
int i=0,j,Len=strlen(S);
char In[3];
Cnt=0;
while(i<Len)
{
In[0]=S[i++];
if(i==Len)
{
Res[Cnt++]=Base64Encode[In[0]>>2&0x3f];
Res[Cnt++]=Base64Encode[(In[0]&0x03)<<4];
Res[Cnt++]='=';
Res[Cnt++]='=';
break;
}
In[1]=S[i++];
if(i==Len)
{
Res[Cnt++]=Base64Encode[In[0]>>2&0x3f];
Res[Cnt++]=Base64Encode[((In[0]&0x03)<<4)|((In[1]&0xf0)>>4)];
Res[Cnt++]=Base64Encode[(In[1]&0x0f)<<2];
Res[Cnt++]='=';
break;
}
In[2]=S[i++];
Res[Cnt++]=Base64Encode[In[0]>>2&0x3f];
Res[Cnt++]=Base64Encode[((In[0]&0x03)<<4)|((In[1]&0xf0)>>4)];
Res[Cnt++]=Base64Encode[((In[1]&0x0f)<<2)|((In[2]&0xc0)>>6)];
Res[Cnt++]=Base64Encode[In[2]&0x3f];
}
return;
}

int Decode(char *S)
{
int i,Len=strlen(S);
char Out[4];
if(Len%4!=0)
{
printf("该字符串不是Base64加密的字符串");
return 0;
}
for(i=0; i<Len; ++i)
{
if(!((S[i]>='A'&&S[i]<='Z')||(S[i]>='a'&&S[i]<='z')||(S[i]>='0'&&S[i]<='9')||S[i]=='+'||S[i]=='/'||S[i]=='='))
{
printf("该字符串含有非法字符");
return 0;
}
}
Cnt=i=0;
while(i<Len)
{
do
{
Out[0]=Base64Decode[S[i++]];
}
while(i<Len&&Out[0]==-1);
if(Out[0]==-1)
{
break;
}
do
{
Out[1]=Base64Decode[S[i++]];
}
while(i<Len&&Out[1]==-1);
if(Out[1]==-1)
{
break;
}
Res[Cnt++]=(Out[0]<<2)|((Out[1]&0x30)>>4);
do
{
Out[2]=S[i++];
if(Out[2]==61)
{
return 1;
}
Out[2]=Base64Decode[Out[2]];
}while(i<Len&&Out[2]==-1);
if(Out[2]==-1)
{
break;
}
Res[Cnt++]=((Out[1]&0x0f)<<4)|((Out[2]&0x3c)>>2);
do
{
Out[3]=S[i++];
if(Out[3]==61)
{
return 1;
}
Out[3]=Base64Decode[Out[3]];
}while(i<Len&&Out[3]==-1);
if(Out[3]==-1)
{
break;
}
Res[Cnt++]=((Out[2]&0x03)<<6)|Out[3];
}
return 1;
}

int main()
{
while(gets(Str)!=NULL)
{
Encode(Str);
Res[Cnt]='\0';
puts(Res);
gets(Str);
if(Decode(Str))
{
Res[Cnt]='\0';
puts(Res);
}
}
return 0;
}
/*
Input:
Hello World!
SGVsbG8gV29ybGQh
Output:
SGVsbG8gV29ybGQh
Hello World!
*/

Linux平台:

加密:

echo "" | base64

解密:

echo "" | base64 -d

PS:两个操作系统对汉字加密结果是不一样的。

原文地址:https://www.cnblogs.com/NoSoul/p/2407606.html