zoukankan      html  css  js  c++  java
  • 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:两个操作系统对汉字加密结果是不一样的。

  • 相关阅读:
    利用string 字符串拷贝
    新手学vim配置
    进程描述符task_struct
    并查集
    堆Heap
    Bitset位图
    排序
    sql时间查询
    javascript 中的 call
    css 笔记——设置禁用中文输入法
  • 原文地址:https://www.cnblogs.com/NoSoul/p/2407606.html
Copyright © 2011-2022 走看看