0

データを保護したいので、XXTEA で暗号化してみます。私はこのようにします:

  • 入力文字列 -> XXTEA 暗号化 -> 出力文字列
  • outputString -> XXTEA 復号化 -> inputString

すべてが暗号化と復号化に問題ありません。しかし、XXTEA で暗号化した後に出力を base64 エンコードし、XXTEA で復号化する前に base64 でデコードしようとすると、結果が間違っています。

  • 入力 -> 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;

}

私のコードの何が問題なのか知っていますか? どんな助けでも大歓迎です!どうもありがとう。

4

2 に答える 2

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 "";
}
于 2015-06-16T07:45:21.003 に答える