AES加解密

这篇文章是对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有下面三个特点。

  1. 是对称加密算法,即密钥是相同。
  2. 密钥长度有128,192或256比特。密钥长的好。
  3. 消耗资源,毕竟要解密,是需要时间的。

AES加解密

加解步骤

  1. 初始化IV 和key,不同平台可能默认不同初始化,一定要自己memset。
  2. 设置aes_setkey_enc。
  3. 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图片的资源加密保护,用这方法。在游戏引擎里面你也只把文件读取出数据进行解密。

  1. 打开文件。
  2. 读取文件内容。
  3. 进行加密,或解密。
  4. 写入加密内容。

源码下载

http://pan.baidu.com/s/1qWqTtEk