我是靠谱客的博主 光亮钢笔,最近开发中收集的这篇文章主要介绍STM32:Base64加密与解密的实现,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

目录

一、Base64的介绍

二、Base64加密与解密的实现

1、Base64加密

2、Base64解密

3、字符串查询特定字符的索引


一、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[i] >> 2) & 0x3f);
		outputData[j++] = base64char[index];

		//第二个字节,根据源字节的第一个字节和第二个字节联合处理。规则:第一个字节高6位去掉然后左移四位,第二个字节右移四位
		//即:源第一字节低2位 + 源第2字节高4位
		index = ((sourceData[i] << 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] != ''; i += 4)
	{
		//获取第一与第二个字符,在base表中的索引值
		trans[0] = charIndex(base64char, base64[i]);
		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);
}

 

最后

以上就是光亮钢笔为你收集整理的STM32:Base64加密与解密的实现的全部内容,希望文章能够帮你解决STM32:Base64加密与解密的实现所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(46)

评论列表共有 0 条评论

立即
投稿
返回
顶部