ios android 使用 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 namespace std; //静态变量定义 unsigned char cRC2Test::sm_cKey[RC2::DEFAULT_KEYLENGTH] = {0,}; RC2Encryption cRC2Test::sm_rcEncr; RC2Decryption cRC2Test::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()); } void cRC2Test::encodeBlock(unsigned char* pData, unsigned char* pOut) { sm_rcEncr.ProcessBlock(pData, pOut); } void cRC2Test::decodeBlock(unsigned char* pData, unsigned char* pOut) { sm_rcDecr.ProcessBlock(pData, pOut); }
测试代码:
main.cpp
unsigned char pkey[RC2::DEFAULT_KEYLENGTH]; string testData = "1234567890测试"; cRC2Test::setKey(pkey); string sEncode = cRC2Test::encode(testData); cout<<cRC2Test::decode(sEncode);
在ios与android上测试通过。
转自: http://blog.sina.com.cn/s/blog_62b2318d0101h095.html
Trackback from your site.
(2)条评论
fuhongxue
| #
然后将-DCRYPTOPP_DISABLE_ASM -DCRYPTOPP_DISABLE_SSE2两个宏定义加到工程中 … 这句话不太理解。怎么加呢? 我加完之后出错在有汇编的代码里
回复
Wupei
| #
在android工程上编译流程大同小异,在jni/Android.mk 中增加
CPPFLAGS += -DCRYPTOPP_DISABLE_ASM -DCRYPTOPP_DISABLE_SSE2
在jni/Application.mk 中增加
APP_STL := gnustl_static
APP_CPPFLAGS := -frtti -fexceptions
回复