cocos2dx 使用 crypto++

在ios上使用加密解密,crypto++是一个好选择,配置过程如下:

我在github上找到了CryptoPP-for-iOS,地址:https://github.com/3ign0n/CryptoPP-for-iOS,下载后发现工程里没有crypto++,需要执行其中的external/scripts/build-cryptopp.sh脚本,脚本会下载http://www.cryptopp.com/cryptopp561.zip,这个是crypto++代码,但是在天朝,下载会失败,原因不言而喻,想办法下载吧!

cryptopp561.zip下载后,我没有编译,将其中的代码复制到工程中,
将其中的validat1.cpp,validat2.cpp,validat3.cpp,bench.cpp,bench2.cpp删除,
然后将-DCRYPTOPP_DISABLE_ASM-DCRYPTOPP_DISABLE_SSE2两个宏定义加到工程中,原因是crypto++内嵌了很多汇编,这个我们不需要。
开始编译,过程中提示cocos2dx的zip_support/ioapi.h中存在错误,原因是其包含了zlib.h,而crypto++中存在同名文件,
ioapi.h中是 #include "zlib.h"
改成 #include <zlib.h> 
编译通过。

在android工程上编译流程大同小异,在jni/Android.mk 中增加
CPPFLAGS += -DCRYPTOPP_DISABLE_ASM-DCRYPTOPP_DISABLE_SSE2
在jni/Application.mk 中增加
APP_STL := gnustl_static
APP_CPPFLAGS := -frtti -fexceptions
编译通过。

写了个使用RC2算法编解码的程序测试一下:
cRC2Test.h

#include "rc2.h"

using namespace CryptoPP;


//RC2加密解密类

class cRC2Test

{

public:

   //设置key

   static void setKey(const unsigned char* pKey);

    

    //加密

    static std::string encode(const std::string& rStr);

    //解密

    static std::string decode(const std::string& rStr);

    

private:

   //加密RC2

    static void encodeBlock(unsigned char* pData, unsigned char* pOut);

   //解密RC2

    static void decodeBlock(unsigned char* pData, unsigned char* pOut);

    

private:

   //RC2 key

   static unsigned char sm_cKey[RC2::DEFAULT_KEYLENGTH];

    

   //RC2加密类

    static RC2Encryption sm_rcEncr;

   //RC2解密类

    static RC2Decryption sm_rcDecr;

    

};


cRC2Test.cpp


 

#include<vector>

#include<string>

using namespacestd;


//静态变量定义

unsigned char cRC2Test::sm_cKey[RC2::DEFAULT_KEYLENGTH] = {0,};

RC2EncryptioncRC2Test::sm_rcEncr;

RC2DecryptioncRC2Test::sm_rcDecr;


void cRC2Test::setKey(const unsigned char* pKey)

{

   memset(sm_cKey, 0,sizeof(sm_cKey));

    

   //保存key

   memcpy(sm_cKey,pKey, RC2::DEFAULT_KEYLENGTH);

    

   //对加密器与解密器设置key

   sm_rcEncr.SetKey(sm_cKey, RC2::DEFAULT_KEYLENGTH);

   sm_rcDecr.SetKey(sm_cKey, RC2::DEFAULT_KEYLENGTH);

}


std::string cRC2Test::encode(const std::string& rStr)

{

   size_t strIndex = 0;

   size_t strLen =rStr.size();

    

   //保存加密后的数据

   vector<unsigned char> vBuffer;

   //保存加密后的临时数据块

   unsigned char rcBlock[RC2::BLOCKSIZE];

    

   unsigned char *ptr = (unsigned char*)rStr.c_str();

    

   //遍历字符串

   while(strIndex <strLen) {

       memset(rcBlock, 0, RC2::BLOCKSIZE);

       //加密一块数据

       encodeBlock(&ptr[strIndex],rcBlock);

       

       //保存加密结果

       vBuffer.insert(vBuffer.end(), rcBlock, rcBlock+RC2::BLOCKSIZE);

       

       strIndex += RC2::BLOCKSIZE;

    }

    

   return string(vBuffer.begin(), vBuffer.end());

}


std::string cRC2Test::decode(const std::string& rStr)

{

   size_t strIndex = 0;

   size_t strLen =rStr.size();

    

   //保存解密后的数据

   vector<unsigned char> vBuffer;

   //保存解密后的临时数据块

   unsigned char rcOut[32];

    

   unsigned char *ptr = (unsigned char*)rStr.c_str();

    

   //遍历字符串

   while(strIndex <strLen) {

       memset(rcOut, 0, sizeof(rcOut));

       //解密一块数据

       decodeBlock(&ptr[strIndex],rcOut);

       

       //保存解密结果

       vBuffer.insert(vBuffer.end(), rcOut, rcOut+strlen((char*)rcOut));

       

       strIndex += RC2::BLOCKSIZE;

    }

    

   return string(vBuffer.begin(), vBuffer.end());

}


voidcRC2Test::encodeBlock(unsigned char* pData, unsigned char* pOut)

{

   sm_rcEncr.ProcessBlock(pData, pOut);

}


voidcRC2Test::decodeBlock(unsigned char* pData, unsigned char* pOut)

{

   sm_rcDecr.ProcessBlock(pData, pOut);

}


测试代码:
main.cpp

 

unsigned char pkey[RC2::DEFAULT_KEYLENGTH];

stringtestData = "1234567890测试";

    

cRC2Test::setKey(pkey);

stringsEncode = cRC2Test::encode(testData);

cout<<cRC2Test::decode(sEncode);



在ios与android上测试通过。






评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值