最近发现很多朋友需要加密的一些小知识,也有好几个人问道我,我也不可能一一回答,这里就给一个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 亲,如果有帮到你,记得给好评哦!