Я не могу понять, как правильно реконструировать эту функцию XXTEA - PullRequest
0 голосов
/ 20 октября 2019

Я уже некоторое время занимаюсь реверс-инжинирингом функции XXTea. И я заметил различия, но я не уверен, являются ли они различиями в коде. Или сгенерированные компилятором отличия от стандартного XXTea https://pastebin.com/vcPKE1WR - это функция Iтакже есть сборка, но это PowerPC, так что сложнее собрать. У меня даже есть ключи и параметры, используемые для функции, но у меня все еще есть проблемы. И файлы зашифрованы этим. И расшифрованные аналоги. Но не правильная функция для преобразования их между собой.

Я пытался перенести псевдокод непосредственно в тест C ++, который не сработал. Я также попытался перенести различия в стандартную функцию XXTea для C, но это также не сработало.

#define MX(z, y, sum, key, p, e) (((z>>5^y<<2) + (y>>3^z<<4)) ^ ((sum^y) + (key[(((p&3)^e) << 2)] ^ z)))

void btea(uint32_t *v, int n, uint size, uint32_t *key) {
    uint64_t y;
    uint32_t z, sum;
    int64_t roundSizeCalc;
    unsigned p, rounds, roundsAndSum,  e;

    roundSizeCalc = size >> 2;
    if (n > 1) {          /* Coding Part, Still not modified */
        //rounds = 6 + 52 / n;
        rounds = 6 + 52 / roundSizeCalc;
        sum = 0;
        z = v[n - 1];
        do {
            sum += DELTA;
            e = (sum >> 2) & 3;
            for (p = 0; p < n - 1; p++) {
                y = v[p + 1];
                z = v[p] += MX;
            }
            y = v[0];
            z = v[n - 1] += MX;
        } while (--rounds);
    } else if (n < -1) {  /* Decoding Part */
        n = -n;
        rounds = 6 + 52 / roundSizeCalc;
        sum = rounds * DELTA;
        y = v[0];
        y = (y >> 24) | ((y << 8) & 0x00FF0000) | ((y >> 8) & 0x0000FF00) | (y << 24);
        do {
            e = (sum >> 2) & 3;
            for (p = roundSizeCalc - 1; p > 0; p--) {
            //for (p = 0; roundSizeCalc - 1 > p; p++) {
                z = v[p];
                z = (z >> 24) | ((z << 8) & 0x00FF0000) | ((z >> 8) & 0x0000FF00) | (z << 24);
                uint32_t properV = uint32_t(v[p - 1]);
                y = v[p] -= MX(z, y, sum, key, p - 1, e);
            }
            z = v[p - 1];
            y = v[0] -= MX(z, y, sum, key, p - 1, e);
            sum -= DELTA;
        } while (--rounds);
    }
}

При передаче правильно зашифрованных данных. Он никогда не расшифровывается должным образом и вместо этого оказывается более испорченным. При необходимости у меня есть как зашифрованный файл, так и расшифрованный аналог из памяти.

...