单片机学习小组
直播中

红旧衫

9年用户 719经验值
擅长:可编程逻辑 电源/新能源 制造/封装 EDA/IC设计
私信 关注

有关Base64编码的基本知识都总结在这里了

Base64是什么?

Base64编码转换有哪些具体步骤呢?
Base64加密与解密该怎样去实现呢?

回帖(1)

刘旭阳

2022-1-20 11:10:30
一、Base64的介绍



  • Base64是网络上最常见的用于传输8Bit字节码的编码方式之一,Base64就是一种基于64个可打印字符来表示二进制数据的方法。
  • Base64编码是从二进制到字符的过程,可用于在HTTP环境下传递较长的标识信息。采用Base64编码具有不可读性需要解码后才能阅读
  • Base64要求把每三个8Bit的字节转换为四个6Bit的字节(3*8 = 4*6 = 24),然后把6Bit再添两位高位0,组成四个8Bit的字节,也就是说,转换后的字符串理论上将要比原来的长1/3。

规则:



  • .把3个字节变成4个字节。
  • 每76个字符加一个换行符。
  • 最后的结束符也要处理。

编码转换的具体步骤:


  • 第一个字节:根据源字节的第一个字节处理。 规则:源第一字节右移两位去掉低2位高2位补零
  • 第二个字节:根据源字节的第一个字节和第二个字节联合处理。规则:第一个字节高6位去掉然后左移四位,第二个字节右移四位。即:源第一字节低2位 + 源第2字节高4位
  • 第三个字节:根据源字节的第二个字节和第三个字节联合处理,规则:第二个字节去掉高4位并左移两位(得高6位),第三个字节右移6位并去掉高6位(得低2位),相加即可
  • 第四个字节:规则,源第三字节去掉高2位即可

编码更加具体详细的步骤:



  • 第一个字符通过右移2位获得第一个目标字符的Base64表位置,根据这个数值取到表上相应的字符,就是第一//个目标字符。
  • 然后将第一个字符与0x03(00000011)进行与(&)操作并左移4位,接着第二个字符右移4位与前者相或(|),即获得第二个目标字符。
  • 再将第二个字符与0x0f(00001111)进行与(&)操作并左移2位,接着第三个字符右移6位与前者相或(|),获得第三个目标字符。
  • 最后将第三个字符与0x3f(00111111)进行与(&)操作即获得第四个目标字符。
  • 在以上的每一个步骤之后,再把结果与 0x3F 进行 AND 位操作,就可以得到编码后的字符了。

解码:



  • 解码只是编码的逆过程
  • 把编码得到的二进制位连接上再重组得到8位值,得出源码

二、Base64加密与解密的实现

1、Base64加密


/* Base64加密 */
int base64_encode(const unsigned char *sourceData, char *outputData)
{
        uint8_t index = 0;
        int i=0, j=0;
        const int len = strlen((const char *)sourceData);

        //每三组一个进行编码
        for(; i < len; i += 3)
        {
                //第一个字节,根据源字节的第一个字节处理。 规则:源第一字节右移两位,去掉低2位,高2位补零。
                index = ((sourceData >> 2) & 0x3f);
                outputData[j++] = base64char[index];

                //第二个字节,根据源字节的第一个字节和第二个字节联合处理。规则:第一个字节高6位去掉然后左移四位,第二个字节右移四位
                //即:源第一字节低2位 + 源第2字节高4位
                index = ((sourceData << 4) & 0x30);
                if(i+1 < len)
                {
                        index |= ((sourceData[i + 1] >> 4) & 0x0f);
                        outputData[j++] = base64char[index];
                }
                else
                {
                        outputData[j++] = base64char[index];
                        outputData[j++] = '=';
                        outputData[j++] = '=';

                        break;//超出总长可以直接break
                }

                //第三个字节,根据源字节的第二个字节和第三个字节联合处理,
                //规则:第二个字节去掉高4位并左移两位(得高6位),第三个字节右移6位并去掉高6位(得低2位),相加即可
                index = ((sourceData[i + 1] << 2) & 0x3c);
                if((i + 2) < len)
                {
                        index |= ((sourceData[i + 2] >> 6) & 0x03);
                        outputData[j++] = base64char[index];

                        //第四个字节,规则:源第三字节去掉高2位即可
                        index = sourceData[i + 2] & 0x3f;
                        outputData[j++] = base64char[index];
                }
                else
                {
                        outputData[j++] = base64char[index];
                        outputData[j++] = '=';

                        break;
                }
        }

        outputData[j] = '';

        return 0;
}
2、Base64解密

/* Base64解密 */
int base64_decode(const char *base64, unsigned char * deData)
{
        int i = 0, j = 0;
        int trans[4] = {0};
        for (; base64 != ''; i += 4)
        {
                //获取第一与第二个字符,在base表中的索引值
                trans[0] = charIndex(base64char, base64);
                trans[1] = charIndex(base64char, base64[i+1]);

                // 1/3
                deData[j++] = ((trans[0] << 2) & 0xfc) | ((trans[1] >> 4) & 0x03);
                if (base64[i + 2] == '=')
                        continue;
                else
                        trans[2] = charIndex(base64char, base64[i + 2]);

                // 2/3
                deData[j++] = ((trans[1] << 4) & 0xf0) | ((trans[2] >> 2) & 0x0f);
                if (base64[i + 3] == '=')
                        continue;
                else
                        trans[3] = charIndex(base64char, base64[i + 3]);

                // 3/3
                deData[j++] = ((trans[2] << 6) & 0xc0) | (trans[3] & 0x3f);
        }

        deData[j] = '';
        return 0;
}
3、字符串查询特定字符的索引


/* 在字符串中查询特定字符的索引 */
int charIndex(const char* str, char c)
{
        const char *pIndex = strchr(str, c);
        if(pIndex == NULL)
                return -1;
        else
                return (pIndex - str);
}
举报

更多回帖

发帖
×
20
完善资料,
赚取积分