coco2d-x 文件加密 (lua、xml)

最近发现很多朋友需要加密的一些小知识,也有好几个人问道我,我也不可能一一回答,这里就给一个blog吧,希望能帮到你们!

说到加密,无非就是先把文件读取到内存中,然后通过一些算法进行加密后把它存回去就OK了,这就加密好了!往往一个加密算法都对应了一个解密算法,你只要在你的工程里面用到这个文件的时候(工程里面用这些文件的时候都是先把文件读取到内存的,这个应该都懂),文件读取到内存后先把它解密一下然后再使用,这样就实现了加密解密了!对于加密的算法问题,完全可以自己写,自己想一个方法。也可以拿开源的,如AES。

之前也说过,对于文件的解密,只要在将文件读取到内存时执行一下解密函数,然后在对它操作就OK的!我有上传我的加密小工具,下载地址:点击在这里。下载后请认真阅读README,根据readme认真配置你的工具。

接下来,我给出解密代码,同样的,还是再说一遍我给出的解密函数请放在读取文件后,使用文件前!对于lua加密,请查阅我的lua加密博文,你只要把我现在给的加密函数放在那个异或解密的地方就实现了AES解密!废话不多说,给出解密代码

//生成密钥
char* createKey(const char* keyStr, int keyLen, char* outKey)
{
	memset(outKey, 0, 32);
	int cryptLen = 0;    //加密文本的长度;
	unsigned char strPer[16];     //加密前文本;
	unsigned char keyPer[16];      //加密key;
	memset(keyPer, 0, 16);
	if (keyLen  >= 16)  
	{
		memcpy(keyPer, keyStr, 16);
	}
	else //传入字节不足32;
	{
		memcpy(keyPer, keyStr , keyLen );
	}

	while(true)
	{
		//生成key;		
		memcpy(outKey + 16, keyPer, 16);
		//循环结束;
		if (cryptLen >= keyLen)  return outKey;
		memset(strPer, 0, 16);
		if (keyLen - cryptLen >= 16)  
		{
			memcpy(strPer, keyStr + cryptLen, 16);
		}
		else //剩余字节不足32位;
		{
			memcpy(strPer, keyStr + cryptLen, keyLen - cryptLen);
		}
		//AES加密;
		unsigned long rk[60];
		int nrounds = rijndaelSetupEncrypt(rk, (const unsigned char *)(outKey), 256);
		memcpy(outKey, keyPer, 16 );  //存储此轮的key;
		rijndaelEncrypt(rk, nrounds, strPer, keyPer);
		cryptLen += 16;

	}
	return NULL;
}
//-----------------------------------------------------------------------------

//-----------------------------------------------------------------------------
//解密函数
bool decrypt(const char* inStr, int inLen, const char* outStr, int& outLen, const char* keyStr, int keyLen)
{
	if (inLen%16 != 0) return false;
	
	char key[256];  //密钥;
	createKey(keyStr, keyLen, key);   //生成密钥;	
	unsigned long rk[60];
	int nrounds;
	int round = inLen/16;	
	char* encryStr = new char[inLen];
	nrounds = rijndaelSetupDecrypt(rk, (const unsigned char*)key, 256);
	outLen = 0;
	int time = 0;  //循环的次数;
	while (1)
	{
		unsigned char plaintext[16];   //加密前的数据;
		unsigned char ciphertext[16];  //加密后的数据;
		memcpy(ciphertext, inStr + 16*time, 16);
		rijndaelDecrypt(rk, nrounds, ciphertext, plaintext);
		memcpy(encryStr + 16*time,  plaintext, 16);  //把加密后的数据重新存入pData;
		outLen += 16;
		if (++time >= round ) break;
	}
	char randNum = encryStr[outLen - 1];          //随机数;
	char fillNum =  encryStr[0] ^ randNum;	     //填充数;
	outLen = outLen - 1 - fillNum;
	memcpy((void*)outStr, encryStr + 1, outLen);
	delete[] encryStr;
	return true;
}
//-----------------------------------------------------------------------------

请支持原创


还有不懂,请加QQ:497867831      亲,如果有帮到你,记得给好评哦!

你可能感兴趣的:(coco2d-x 文件加密 (lua、xml))