[2021]TEA加密 huoji TEA加密,jiami1 2021-08-21 582 次浏览 0 次点赞 在游戏项目中,一般需要对资源或数据进行加密保护,最简单高效的加密算法就是采用位与或之类的,但是比较容易被人分析出来。 TEA加密算法不但比较简单,而且有很强的抗差分分析能力,加密速度也比较快。可以根据项目需求设置加密轮数来增加加密强度。 1.加密核心函数 ```cpp void EncryptTEA(unsigned int *firstChunk, unsigned int *secondChunk, unsigned int* key) { unsigned int y = *firstChunk; unsigned int z = *secondChunk; unsigned int sum = 0; unsigned int delta = 0x9e3779b9; for (int i = 0; i < 8; i++)//8轮运算(需要对应下面的解密核心函数的轮数一样) { sum += delta; y += ((z << 4) + key[0]) ^ (z + sum) ^ ((z >> 5) + key[1]); z += ((y << 4) + key[2]) ^ (y + sum) ^ ((y >> 5) + key[3]); } *firstChunk = y; *secondChunk = z; } ``` 2.解密核心函数 ```cpp void DecryptTEA(unsigned int *firstChunk, unsigned int *secondChunk, unsigned int* key) { unsigned int sum = 0; unsigned int y = *firstChunk; unsigned int z = *secondChunk; unsigned int delta = 0x9e3779b9; sum = delta << 3; //32轮运算,所以是2的5次方;16轮运算,所以是2的4次方;8轮运算,所以是2的3次方 for (int i = 0; i < 8; i++) //8轮运算 { z -= (y << 4) + key[2] ^ y + sum ^ (y >> 5) + key[3]; y -= (z << 4) + key[0] ^ z + sum ^ (z >> 5) + key[1]; sum -= delta; } *firstChunk = y; *secondChunk = z; } ``` 3.封装对输入数据进行加密函数 ```cpp //buffer:输入的待加密数据buffer,在函数中直接对元数据buffer进行加密;size:buffer长度;key是密钥; void EncryptBuffer(char* buffer, int size, unsigned int* key) { char *p = buffer; int leftSize = size; while (p < buffer + size && leftSize >= sizeof(unsigned int) * 2) { EncryptTEA((unsigned int *)p, (unsigned int *)(p + sizeof(unsigned int)), key); p += sizeof(unsigned int) * 2; leftSize -= sizeof(unsigned int) * 2; } } ``` 4.封装对加密数据进行解密函数 ```cpp //buffer:输入的待解密数据buffer,在函数中直接对元数据buffer进行解密;size:buffer长度;key是密钥; void DecryptBuffer(char* buffer, int size, unsigned int* key) { char *p = buffer; int leftSize = size; while (p < buffer + size && leftSize >= sizeof(unsigned int) * 2) { DecryptTEA((unsigned int *)p, (unsigned int *)(p + sizeof(unsigned int)), key); p += sizeof(unsigned int) * 2; leftSize -= sizeof(unsigned int) * 2; } } ``` 5.测试加密/解密文件例子(windows下) ```cpp //-----设置密钥,必须需要16个字符或以上(这里的长度错误由评论#3楼legion提出修正,表示感谢。) unsigned int *key = (unsigned int *)"testkey123456789"; //-----读取文件 unsigned int pSize = 0; char * pBuffer = NULL; FILE *fp; int err = fopen_s(&fp, sFileName, "rb"); //sFileName是读取的加密/解密文件名 TODO:处理错误 fseek(fp, 0, SEEK_END); pSize = ftell(fp); //得到长度 fseek(fp, 0, SEEK_SET); pBuffer = new char[pSize]; //开辟内存空间 pSize = fread(pBuffer, sizeof(char), pSize, fp); //读取内容 fclose(fp); //关闭文件 //-----对原始文件进行加密 EncryptBuffer(pBuffer, pSize, key); //如果是已经加密过的文件,则对应为解密函数 //DecryptBuffer(pBuffer, pSize, key); //-----将数据写入文件当中 FILE *fDestFile; fopen_s(&fDestFile, sTagetFileName, "wb"); //sTagetFileName是写入的加密/解密文件名 fwrite(pBuffer, sizeof(char), pSize, fDestFile); fclose(fDestFile);//关闭文件 delete[]pBuffer; ``` 转载于 @PCWen https://www.cnblogs.com/chevin/p/5681228.html 本文由 huoji 创作,采用 知识共享署名 3.0,可自由转载、引用,但需署名作者且注明文章出处。 点赞 0
还不快抢沙发