这篇文章是对Cocos2d-x游戏资源加密解决方案的补充吧。说AES 数据的加密,解密过程。可以应用到cocos2d-x的数据加解密上面,比如玩家分数加密,写入到UserDefault写xml文件上面。
AES简单介绍
作为加密很有aes、des 、3des,三者对称加密中,AES256目前是3者中最安全的。比如:你现在的数据是”abcd”,这个时候你不想人家知道,最简单的办法就是^”密码”,界面再^”密码”。当然这个是很容易给解出来的。如果你想好一点加密数据就用AES,现在的网络有很多源代码,笔者找过的库有aes-des-3des,aes-src-18-02-14,Botan-1.10.8,OpenAES-0.9.0,openssl-1.0.1i,xyssl_0.9,cryptopp562,通过对比,最终选择了xyssl_0.9里面的AES库的解密速度快,在安卓下可以使用,最重要的是在cocos2d-x下的项目上做个实验,效率可以。AES有下面三个特点。
- 是对称加密算法,即密钥是相同。
- 密钥长度有128,192或256比特。密钥长的好。
- 消耗资源,毕竟要解密,是需要时间的。
AES加解密
加解步骤
- 初始化IV 和key,不同平台可能默认不同初始化,一定要自己memset。
- 设置aes_setkey_enc。
- cbc模式,当然你也可以用其他模式。
aes加解密代码示例
#include "aes.h" void AesEncDec(char* in_buffer, char* out_buffer,bool b_enc) { aes_context aes_ctx; unsigned char IV[16]; unsigned char key[32]; memset(key, 0, 32); memset(IV, 0, sizeof(IV)); char password[32] = "123456"; memcpy(key, password, strlen(password)); int length = strlen(in_buffer);//注意strlen第一个字符串结束符'\0'为止,如果中间有'\0' ,后面的就失败,自己可固定长度,感谢味精指出 int enc_buff_length = length + 16 - length % 16; if (b_enc) { aes_setkey_enc(&aes_ctx, key, 256); aes_crypt_cbc(&aes_ctx, AES_ENCRYPT, enc_buff_length, IV, (unsigned char*)in_buffer, (unsigned char*)out_buffer); } else { aes_setkey_dec(&aes_ctx, key, 256); aes_crypt_cbc(&aes_ctx, AES_DECRYPT, length, IV, (unsigned char*)in_buffer, (unsigned char*)out_buffer); } } //AES测试代码 char buffer[32] = {"123456789123"}; //int length = strlen(buffer); AesEncDec(buffer, buffer, true); AesEncDec(buffer, buffer, false);
文件加解密
作为文件,他只是数据存储,你只关心他数据本身的加解密。无论是在游戏,或者其他应用。我关于cocos2d-x png图片的资源加密保护,用这方法。在游戏引擎里面你也只把文件读取出数据进行解密。
- 打开文件。
- 读取文件内容。
- 进行加密,或解密。
- 写入加密内容。