Ошибка алгоритма случайного обфускации текста - PullRequest
8 голосов
/ 01 апреля 2011

Я экспериментировал с простым алгоритмом обфускации текста на основе XOR.Предположительно, когда алгоритм запускается дважды подряд, я должен получить исходные данные - но в моей реализации это происходит только иногда.Вот мой код со случайным текстом, демонстрирующим проблему:

#include <stdio.h>

void obfuscate(char *text) {
        char i = 0, p = 0;

        while (text[i] != 0) {
                text[i] = (text[i] ^ (char)0x41 ^ p) + 0xfe;

                p = i++;
        }
}


int main(int argc, char **argv) {
    char text[] = "Letpy,Mprm` Nssl'w$:0==!";

    printf("%s\n", text);

    obfuscate(text);

    printf("%s\n", text);

    obfuscate(text);

    printf("%s\n", text);

    return 0;
}

Как я могу исправить этот алгоритм, чтобы он действительно был обратным?Любые предложения по улучшению уровня запутывания?

Ответы [ 4 ]

6 голосов
/ 02 апреля 2011

Здесь я вижу две проблемы:

  1. Операция + 0xfe не является собственной обратной.Если вы удалите его и оставите только XOR, каждый байт будет восстановлен в исходное значение, как и ожидалось.

  2. Более тонкая проблема: шифрование текста может создать нулевой байт, который будет усекатьсятекст, потому что вы используете строки с нулевым символом в конце.Лучшее решение, вероятно, состоит в том, чтобы хранить длину текста отдельно, а не заканчивать нулем зашифрованный текст.

3 голосов
/ 02 апреля 2011

Вы делаете больше, чем просто XOR здесь (если вы оставите его на text[i] = text[i] ^ (char)0x41, это сработает; вы даже можете оставить в ^ p, если хотите, но + 0xfe нарушит его).

Почему вы хотите использовать этот вид обфускации текста?Распространенными методами небезопасной запутывания являются Base64 (требуется отдельное кодирование и декодирование) и Rot13 (применить второй раз для реверса).

2 голосов
/ 02 апреля 2011

Сначала расшифровать

text[i] = (text[i] ^ (char)0x41 ^ p) + 0xfe;

вам нужна его обратная функция, это было бы

text[i] = (text[i] - 0xfe) ^ (char)0x41 ^ p;

Во-вторых, char i сможет работать только с короткими строками, используйте int.

И последнее (и самое важное!) Заключается в том, что после такого «запутывания» строка может завершиться нулем до ее первоначального конца, поэтому вам также следует проверить ее первоначальную длину или убедиться, что вы не можете получить нули в середине.

1 голос
/ 02 апреля 2011

Почему "добавить + 0xfe"? Это (по крайней мере, один) источник вашей необратимости.

Я вижу, что вы запутываете его, используя XOR предыдущего текстового значения p, что означает, что повторяющиеся буквы будут вызывать отскок между значениями.

...