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

本文介绍了一种基于C++的简易数据加密和解密方法,利用随机数和异或运算实现字符串的安全传输。该方法适用于TCP等网络传输场景。

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


前言

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


一、实现原理

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

二、实现代码

编码环境 Win10 + VS2015

1.头文件预定义等

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

typedef unsigned char BYTE;

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;
	}
}

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;
}

4.运行结果

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


总结

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

评论 11
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值