赞
踩
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
在TCP或者其它方式传输数据时,通常是以char数组形式发送和接收,对于字符串信息里面的内容很容易被识别里面的信息,因此自己寻思着写一个简单代码实现数据加密和解密,这样即使数据被别人截获,也无法获取数据中的具体信息。
生成一个字节随机字符,与信息中的每个二进制字符进行异或运算加密,即可生成新的二进制数据,再将二进制信息转换为字符串输出,流程如图所示。
本文只是一个小小示例,可以按照不同规则,对数据取异或进行加密,生成新的数组串,解密反之运算即可。
编码环境 Win10 + VS2015
#include <iostream>
#pragma warning (disable: 4996)//禁止sprintf函数警告
#define MAX_STR_LEN 1024
typedef unsigned char BYTE;
代码如下:
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; } }
测试代码如下,本文写了个无限循环代码,仅作示例
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; }
由于取异或的字节位是随机的,因此输入同样的信息,加密后可生成不同字符,解密后,都能够得到正确的结果。
以上就是一个通过随机数及异或运算加密和解密的实现,程序比较简单,实际应用可以再在数据中增加常用的校验(CRC、XOR校验等),抛砖引玉,希望对大家有点帮助!
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。