使用异或运算对数据及文件进行加密处理

1 typedef struct CRYPT_BLOCK {
2   DWORD    dwSize;    // Data的
3   DWORD    dwKey;    // 密钥 循环使用DWORD的每个字节来进行加密 详情见XorEncrypt
4   char    chData[1];    // 加密后的数据
5 } CRYPT_BLOCK, *PCRYPT_BLOCK;
6 
7 typedef boost::shared_ptr<Json::Value> JsonSharedPtr;

 

一个数异或另一个数两次后,该数保持不变。即:

  c = a^b;

  c = c^b;

  c == a;

这一规律就是使用异或运算对数据及文件进行加密处理的基本原理。

 1 bool XorEncrypt(const char* pKey, DWORD dwCbKey, const char* pIn, DWORD dwCbSize, char* pOut)
 2 {
 3   if (pIn == NULL || pOut == NULL || pKey == NULL) {
 4     return false;
 5   }
 6 
 7   for (DWORD i = 0; i < dwCbSize; ++i) {
 8     pOut[i] = pIn[i] ^ pKey[i % dwCbKey];
 9   }
10 
11   return true;
12 }

pKey为密钥数据指针,dwCbKey为密钥数据长度,pIn为需要加密的数据指针,dwCbSize为需要加密的数据长度,pOut为加密后数据指针

 

加密函数:

 1 vector<char> Encrypt(const vector<char> &vecPlainData)
 2 {
 3     vector<char> vecCryptedData;
 4 
 5     do {
 6 
 7         if (vecPlainData.empty()) {
 8             break;
 9         }
10         
11         if (UINT_MAX - vecPlainData.size() < sizeof(CRYPT_BLOCK) - 1) {
12             //溢出
13             break;
14         }
15         
16         //文件里的加密信息是分成一个一个数据块CRYPT_BLOCK存放的
17         //只是用异或简单加密一下,具体加密流程见XorEncrypt函数
18         DWORD dwCryptBlockSize = sizeof(CRYPT_BLOCK) - 1 + vecPlainData.size();
19 
20         vecCryptedData.resize(dwCryptBlockSize);
21         PCRYPT_BLOCK CryptedBlock = (PCRYPT_BLOCK)&vecCryptedData[0];
22         CryptedBlock->dwKey = GenerateKey();
23         CryptedBlock->dwSize = vecPlainData.size();
24 
25         bool bOk = XorEncrypt((char*)&CryptedBlock->dwKey, sizeof CryptedBlock->dwKey, &vecPlainData[0], vecPlainData.size(), CryptedBlock->chData);
26         if (!bOk) {
27             vecCryptedData.clear();
28         }
29     } while (false);
30 
31     return vecCryptedData;
32 }

解密函数:

 1 vector<char> Decrypt(const vector<char> &vecCryptedData)
 2 {
 3     PCRYPT_BLOCK pCryptedBlock = NULL;
 4     vector<char> vecPlainData;
 5 
 6     do {
 7         if (vecCryptedData.size() < sizeof *pCryptedBlock) {
 8             break;
 9         }
10 
11         pCryptedBlock = (PCRYPT_BLOCK)&vecCryptedData[0];
12         
13         if (UINT_MAX - pCryptedBlock->dwSize < sizeof *pCryptedBlock - 1) {
14             //溢出
15             break;
16         }
17         //运算符优先级 sizeof > 加减 > 不等
18         if (pCryptedBlock->dwSize + sizeof *pCryptedBlock - 1 != vecCryptedData.size()) {
19             break;
20         }
21 
22         vecPlainData.resize(pCryptedBlock->dwSize);
23         bool ok = XorEncrypt((char *)&pCryptedBlock->dwKey, sizeof pCryptedBlock->dwKey, pCryptedBlock->chData, pCryptedBlock->dwSize, &vecPlainData[0]);
24         if (!ok) {
25             vecPlainData.clear();
26         }
27 
28     } while (false);
29 
30     return vecPlainData;
31 }

生成Key:

 1 BYTE CHipsLogQueue::RandomByte()
 2 {
 3     unsigned int random;
 4     rand_s(&random);
 5     return BYTE(random);
 6 }
 7 
 8 DWORD CHipsLogQueue::GenerateKey()
 9 {
10     DWORD Key = 0;
11     
12     for (int i = 0; i < 4; ++i) {
13         ((BYTE *)(&Key))[i] = RandomByte();
14     }
15     
16     return Key;
17 }

 

 

 

 

posted on 2019-12-03 10:32  Noora&w  阅读(834)  评论(0编辑  收藏  举报