当前位置:   article > 正文

C++ 一种数据加密和解密方式实现_c++ 简单加解密

c++ 简单加解密

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档


前言

在TCP或者其它方式传输数据时,通常是以char数组形式发送和接收,对于字符串信息里面的内容很容易被识别里面的信息,因此自己寻思着写一个简单代码实现数据加密和解密,这样即使数据被别人截获,也无法获取数据中的具体信息。


一、实现原理

生成一个字节随机字符,与信息中的每个二进制字符进行异或运算加密,即可生成新的二进制数据,再将二进制信息转换为字符串输出,流程如图所示。
本文只是一个小小示例,可以按照不同规则,对数据取异或进行加密,生成新的数组串,解密反之运算即可。
在这里插入图片描述

二、实现代码

编码环境 Win10 + VS2015

1.头文件预定义等

#include <iostream>
#pragma warning (disable: 4996)//禁止sprintf函数警告
#define MAX_STR_LEN 1024

typedef unsigned char BYTE;
  • 1
  • 2
  • 3
  • 4
  • 5

2.加密和解密

代码如下:

namespace CodeConvert 
{
	static BYTE GetTransFlag() //生成随机8位二进制字节
	{
		return (rand() % 256 & 0xFF);//生成一个随机数,取最后一个字节
	}

	int ConvertByteToCode(BYTE *pbDest, const BYTE *pbSrc) //加密
	{
		int nLen = strlen((char*)pbSrc);//获取数据长度(若信息中有0x00间隔,修改函数将长度作为入参)
		if (nLen <= 0)
		{
			return 0;
		}
		BYTE TransFlag = GetTransFlag();//用于异或运算的一字节
		BYTE byTempSrc[MAX_STR_LEN] = { 0 };
		memcpy(byTempSrc, pbSrc, nLen);
		byTempSrc[nLen] = TransFlag;//将运算字节附到信息尾部
		//进行异或加密
		for (int i = 0; i < nLen; ++i)
		{
			byTempSrc[i] ^= TransFlag >> (i % 8);
		}
		//将二进制转换为字符串输出
		char sztmp[4];
		for (int i = 0; i <= nLen; ++i)
		{
			sprintf(sztmp, "%02X", byTempSrc[i]);
			strcat((char*)pbDest, sztmp);
		}
		return (2 * nLen + 2);
	}

	int ConvertCodeToByte(BYTE *pbDest, const BYTE *pbSrc) //解密
	{
		int nLenSrc = strlen((char*)pbSrc);
		int nLenDes = nLenSrc / 2;
		if (nLenDes <= 0)
		{
			return 0;
		}
		//将字符串转换为字节
		BYTE h1, h2;
		BYTE s1, s2;
		for (int i = 0; i < nLenDes; i++)
		{
			h1 = pbSrc[2 * i];
			h2 = pbSrc[2 * i + 1];
			s1 = toupper(h1) - 0x30;
			if (s1 > 9)
				s1 -= 7;
			s2 = toupper(h2) - 0x30;
			if (s2 > 9)
				s2 -= 7;
			pbDest[i] = s1 * 16 + s2;
		}
		//解密为原字符
		for (int i = 0; i < nLenDes - 1; ++i)
		{
			pbDest[i] ^= pbDest[nLenDes - 1] >> (i % 8);
		}
		pbDest[nLenDes - 1] = 0x00;
		return nLenDes - 1;
	}
}
  • 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
  • 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
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65

3.主函数

测试代码如下,本文写了个无限循环代码,仅作示例

int main() 
{
	char szInput[MAX_STR_LEN] = { 0 };
	char szOutput[2 * MAX_STR_LEN] = { 0 };
	char szInputConvert[MAX_STR_LEN] = { 0 };

	while (true)
	{
		memset(szInput, 0, sizeof(szInput));
		memset(szOutput, 0, sizeof(szOutput));
		memset(szInputConvert, 0, sizeof(szInputConvert));
		printf("---------------- begin ------------------\n");
		printf("输入要加密的字符:\n");
		scanf("%s", szInput);
		CodeConvert::ConvertByteToCode((BYTE*)szOutput, (BYTE*)szInput);
		printf("加密以后为:\n%s\n", szOutput);

		printf("输入解密的字符:\n");
		scanf("%s", szInput);
		CodeConvert::ConvertCodeToByte((BYTE*)szInputConvert, (BYTE*)szOutput);
		printf("解密以后为:\n%s\n", szInputConvert);
		printf("---------------- end ------------------\n\n");
	}
	return 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

4.运行结果

由于取异或的字节位是随机的,因此输入同样的信息,加密后可生成不同字符,解密后,都能够得到正确的结果。
在这里插入图片描述


总结

以上就是一个通过随机数及异或运算加密和解密的实现,程序比较简单,实际应用可以再在数据中增加常用的校验(CRC、XOR校验等),抛砖引玉,希望对大家有点帮助!

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Guff_9hys/article/detail/990887
推荐阅读
相关标签
  

闽ICP备14008679号