#include #include "EncryptEngine.h" #include "base/base64.h" using std::string; using Jumpeleon::DataType; EncryptEngine* EncryptEngine::instance = nullptr; std::string offsets[7] = { "1", "2", "3", "4", "5", "6", "7" }; bool EncryptEngine::init() { instance = new EncryptEngine(); strcpy((char*)instance->key, "12345678"); return true; } EncryptEngine* EncryptEngine::getInstance() { if (!instance) init(); return instance; } void EncryptEngine::destroyInstance() { delete instance; } string EncryptEngine::encrypt(int number, DataType type) { //creating string with value data string tempStr; sprintf((char*) tempStr.c_str(), "%d", number); xxtea_long dataLen = strlen(tempStr.c_str()); //create pointer to uchar for xxtea algorithm unsigned char* data = new unsigned char[dataLen]; //copy data from temp string to uchar pointer strcpy((char*) data, tempStr.c_str()); //length of returned result from xxtea_encrypt xxtea_long retLen = 0; //encrypt data with key unsigned char* result = xxtea_encrypt(data, dataLen, key, keyLen, &retLen); //encode data with base64 encoding for avoid special-characters char* b64enc = nullptr; retLen = cocos2d::base64Encode(result, retLen, &b64enc); //return result in string return std::string(b64enc) + offsets[(int)type]; } int EncryptEngine::decrypt(string tempStr, DataType type) { //validation if (tempStr.length() < 6) return 0; auto end = tempStr.substr(tempStr.length() - 6, 6); if (end != offsets[(int)type]) return 0; tempStr.erase(tempStr.length() - 6, 6); //same like in encrypt xxtea_long dataLen = tempStr.length(); unsigned char* data = new unsigned char[dataLen]; strcpy((char*)data, tempStr.c_str()); //decode data with base64 decoding for get actual encrypted data unsigned char* b64dec = nullptr; xxtea_long retLen = cocos2d::base64Decode(data, dataLen, &b64dec); //return 0 if decode is failed if (b64dec == NULL) return 0; //decrypt data with key unsigned char* result = xxtea_decrypt((unsigned char*) b64dec, retLen, key, keyLen, &retLen); //return 0 if decrypt is failed if (result == NULL) return 0; //return result in int return atoi((char*)result); }