2015-03-19 54 views
0

我想保护我的数据,所以我尝试用XXTEA加密它。我这样做的方法:Base64编码XXTEA加密字符串错误

  • inputString - > XXTEA加密 - > outputString
  • outputString - > XXTEA解密 - > inputString

一切都是加密和解密确定。但是,当我试图让一个base64编码后输出XXTEA对其进行加密和BASE64 XXTEA解密之前对其进行解码,结果是错误的:

  • 输入 - > XXTEA加密 - >使用Base64编码 - >输出
  • 输出 - >的base64解码! - > XXTEA解密=输入

当我与http://www.tools4noobs.com/online_tools/xxtea_encrypt/http://www.tools4noobs.com/online_tools/xxtea_decrypt/测试

我的例子的输入字符串为hello其最终的结果是bjz/S2f3Xkxr08hu

但是,当我用我的代码(见下文)进行测试,最后的结果是bjz/Sw==

这是我encryption code

std::string ProjectUtils::encrypt_data_xxtea(std::string input, std::string secret) { 
//Encrypt with XXTEA 
xxtea_long retLength = 0; 

unsigned char data[input.length()]; 
strncpy((char*)data, input.c_str(), sizeof(data)); 
xxtea_long dataLength = (xxtea_long) sizeof(data); 

unsigned char key[secret.length()]; 
strncpy((char*)key, secret.c_str(), sizeof(key)); 
xxtea_long keyLength = (xxtea_long) sizeof(key); 

unsigned char *encryptedData = xxtea_encrypt(data, dataLength, key, keyLength, &retLength); 

//Encode base64 
char* out = NULL; 
base64Encode(encryptedData, sizeof(encryptedData), &out); 

CCLOG("xxtea encrypted data: %s", out); 
return out; 

}

这里是我的decryption code

char* ProjectUtils::decrypt_data_xxtea(std::string input, std::string secret) { 
//Decode base64 
unsigned char* output = NULL; 
base64Decode((unsigned char*)input.c_str(), (unsigned int)strlen(input.c_str()), &output); 
xxtea_long dataLength = (xxtea_long) sizeof(output); 

xxtea_long retLength = 0; 

unsigned char key[secret.length()]; 
strncpy((char*)key, secret.c_str(), sizeof(key)); 
xxtea_long keyLength = (xxtea_long) sizeof(key); 

//Decrypt with XXTEA 
char *decryptedData = reinterpret_cast<char*>(xxtea_decrypt(output, dataLength, key, keyLength, &retLength)); 

CCLOG("xxtea decrypted data: %s", decryptedData); 
return decryptedData; 

}

你知道我的代码有什么问题吗?任何帮助,将不胜感激! 非常感谢。

+0

我使用xxtea对base64进行编码后进行编码,因为使用xxtea进行加密的结果具有特殊字符,如**©\ \ \ 327_1xA \ 344R **,我无法将其保存到userdefault中。有什么办法将一个字符串转换为正常格式的特殊字符? – 2015-03-20 08:47:00

回答

0

感谢您的代码,它为我的作品)

我已经实际retLength取代的base64字符串的长度

base64Encode(encryptedData, retLength, &out); 

和背部,得到实际大小以及

int outLength = cocos2d::base64Decode((unsigned char*)revertStr.c_str(), (unsigned int)strlen(revertStr.c_str()), &output); 
char *decryptedData = reinterpret_cast<char*>(xxtea_decrypt(output, outLength, key, keyLength, &retLength)); 
+1

您能否详细说明您的答案,并添加关于您提供的解决方案的更多描述? – abarisone 2015-06-16 07:23:16

1

这里是cocos2d-x上的完整工作代码3.4

std::string UserProfile::encryptString(std::string input, std::string secret) { 
    //Encrypt with XXTEA 
    xxtea_long retLength = 0; 

    unsigned char data[input.length()]; 
    strncpy((char*)data, input.c_str(), sizeof(data)); 
    xxtea_long dataLength = (xxtea_long) sizeof(data); 

    unsigned char key[secret.length()]; 
    strncpy((char*)key, secret.c_str(), sizeof(key)); 
    xxtea_long keyLength = (xxtea_long) sizeof(key); 

    unsigned const char *encryptedData = reinterpret_cast<unsigned const char*>(xxtea_encrypt(data, dataLength, key, keyLength, &retLength)); 

    char* out = NULL; 
    cocos2d::base64Encode(encryptedData, retLength, &out); // use real length returned by xxtea_encrypt 
    CCLOG("xxtea encrypted data: [%s][%s]", encryptedData, out); 


    std::string outStr(out); // make string object 
    CCLOG("xxtea encrypted data: [%s][%s]", encryptedData, outStr.c_str()); 


    setStr(KEY, outStr); // function that store value in user defaults 


    std::string revertStr = getStr(KEY); // get string value back 
    CCLOG("xxtea revertStr: [%s]", revertStr.c_str()); 

    unsigned char* output = NULL; 
    int outLength = cocos2d::base64Decode((unsigned char*)revertStr.c_str(), (unsigned int)strlen(revertStr.c_str()), &output); // get real length of decoded string 
    char *decryptedData = reinterpret_cast<char*>(xxtea_decrypt(output, outLength, key, keyLength, &retLength)); // use it 

    CCLOG("xxtea decrypted data: %s", decryptedData); // string the same as original for me 

    return ""; 
} 
+0

您能详细解释一下您提供的解决方案吗? – abarisone 2015-06-16 08:14:45