提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
前言
在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校验等),抛砖引玉,希望对大家有点帮助!
本文介绍了一种基于C++的简易数据加密和解密方法,利用随机数和异或运算实现字符串的安全传输。该方法适用于TCP等网络传输场景。
3058

被折叠的 条评论
为什么被折叠?



