Re: XOR шифрование с MD5 дайджестами
От: Pzz Россия https://github.com/alexpevzner
Дата: 07.11.07 22:56
Оценка: 8 (2)
Здравствуйте, Аноним, Вы писали:

А>BLOCK1 = XOR(BLOCK1, DIGEST1)

А>DIGEST2 = MD5(DIGEST1)

А>BLOCK2 = XOR(BLOCK2, DIGEST2)

А>DIGEST3 = MD5(DIGEST2)

А>BLOCK3 = XOR(BLOCK3, DIGEST3)

А>DIGEST4 = MD5(DIGEST3)

Это очень плохо. Если кто-то знает plaintext от первого блока, то ничего не стоит расшифровать все сообщение, не зная ключа. А вероятность угадать первый блок очень велика, если там лежит более-менее стандартный header.

Гораздо лучше было бы так:

BLOCK0 = RANDOM(); // Вначале втыкаем 16 байт от генератора случайных чисел
BLOCK1 = XOR( BLOCK1, MD5( KEY, BLOCK0 ) );
BLOCK2 = XOR( BLOCK2, MD5( KEY, BLOCK1 ) );
BLOCK3 = XOR( BLOCK3, MD5( KEY, BLOCK2 ) );
...
BLOCKN = XOR( BLOCKN, MD5( KEY, BLOCKN-1)
MAC = MD5( KEY, BLOCKN ); // Используем при расщифровке для проверки

Т.е. некоторое подобые CBC. Существенным является то, что:
1) Даже одно и то же сообщение, переданное повторно, будет выглядеть по-другому из-за псевдослучайных байт в начале
2) Каждый следующий блок зависит от всех предыдущих, что скрывает повторяющиеся между сообщениями блоки
3) Раскрытие какого-то блока мало помогает раскрыть остальные
4) Есть проверка подлинности сообщения

Но в серьезной программе я бы так делать не стал — все равно велика вероятность, что где-то затесалась ошибка. Кроме того, я совершенно не учитываю свойства MD5, считая ее идеальной хеш-функцией, что очевидно неправильно.
Re: XOR шифрование с MD5 дайджестами
От: a18 Россия  
Дата: 07.11.07 19:49
Оценка: 6 (1)
А>BLOCK1 = XOR(BLOCK1, DIGEST1)
А>DIGEST2 = MD5(DIGEST1)

А>BLOCK2 = XOR(BLOCK2, DIGEST2)

А>DIGEST3 = MD5(DIGEST2)

Вот тут есть описание разных режимов работы блочных шифров:
http://citforum.ru/security/cryptography/rejim_shifrov/
А тут — ещё и картинки, насколько плохо всё бывает:
http://en.wikipedia.org/wiki/Block_cipher_modes_of_operation
ИМХО вариант со счётчиком довольно интересный.

Впрочем, как уже писали выше, проще взять какой-нибудь
готовый шифр — будет и существенно быстрее, и надёжнее
(репутацию MD5 в последние годы существенно подмочили, хотя
там речь про поиск коллизий и не факт, что в данном случае
это как-то скажется на криптостойкости).
Re[3]: XOR шифрование с MD5 дайджестами
От: WolfHound  
Дата: 07.11.07 15:27
Оценка: 2 (1)
Здравствуйте, <Аноним>, Вы писали:

А>Но в данный момент нужен относительно простой алгоритм, легко реализуемый на практике, малый по объему кода.

Нет ничего проще чем взять готовую реализацию.

Но если очень хочешь написать сам то RC4:
class RC4
{
public:
    RC4(void* key, int len)
    {
        init(key, len);
    }
    void init(void* key, int len)
    {
        unsigned char* k = reinterpret_cast<unsigned char*>(key);
        i = j = 0;
        for (; i < 256; ++i)
            buf[i] = i;
        i = j = 0;
        for (; i < 256; ++i)
        {
            j = (j + buf[i] + k[i % len]) % 256;
            std::swap(buf[i], buf[j]);
        }
        i = j = 0;
    }
    unsigned char next()
    {
        i = (i + 1) % 256;
        j = (j + buf[i]) % 256;
        std::swap(buf[i], buf[j]);
        return buf[(buf[i] + buf[j]) % 256];
    }
private:
    unsigned int i;
    unsigned int j;
    unsigned char buf[256];
};

Далие тупо XOR'ишь данные с тем что выдает этот ГПСЧ.
... << RSDN@Home 1.2.0 alpha rev. 745>>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Re[4]: XOR шифрование с MD5 дайджестами
От: Sergey Chadov Россия  
Дата: 07.11.07 17:20
Оценка: 2 (1)
Здравствуйте, Leonidze, Вы писали:

L>посмотри в сторону RC4. он примитивен технически (строк в 50-100 можно уложиться, а то и меньше), быстр и относительно стоек. Правда он поточный, но в случае который ты предлагаешь (xor поблочно) не вижу никакой разницы.


Или можно взять TEA. Он еще проще и относительно криптостоек(хотя специфические атаки на него есть).

void TEAEncrypt(const void* pin, void* pout, const void* pkey, unsigned int datasize)
{
    tea_dword32 cns = 0x9E3779B9;

    const tea_dword32* in = (tea_dword32*)pin;
    tea_dword32* out = (tea_dword32*)pout;
    const tea_dword32* key = (tea_dword32*)pkey;

    for (tea_dword32 i=0;i<datasize/8;i+=2)
    {
        tea_dword32 t0 = in[i];
        tea_dword32 t1 = in[i+1];
        tea_dword32 s = 0;
        for (int j=0;j<32;j++)
        {
            s+=cns;
            t0 += ((t1<<4)+key[0])^(t1+s)^((t1>>5)+key[1]);
            t1 += ((t0<<4)+key[2])^(t0+s)^((t0>>5)+key[3]);

            out[i]=t0;out[i+1]=t1;
        }
    }
}

void TEADecrypt(const void* pin,void* pout, const void* pkey, unsigned int datasize)
{
    tea_dword32 cns = 0x9E3779B9;

    const tea_dword32* in = (tea_dword32*)pin;
    tea_dword32* out = (tea_dword32*)pout;
    const tea_dword32* key = (tea_dword32*)pkey;

    for (tea_dword32 i=0;i<datasize/8;i+=2)
    {
        tea_dword32 t0= in[i];
        tea_dword32 t1= in[i+1];
        tea_dword32 s = 0xC6EF3720;
        for (int j=0;j<32;j++)
        {
            t1-=((t0<<4)+key[2])^(t0+s)^((t0>>5)+key[3]);
            t0-=((t1<<4)+key[0])^(t1+s)^((t1>>5)+key[1]);
            s-=cns;
            out[i]=t0;out[i+1]=t1;
        }
    }
}
--
Sergey Chadov

... << RSDN@Home 1.2.0 alpha rev. 685>>
Re[5]: XOR шифрование с MD5 дайджестами
От: Pzz Россия https://github.com/alexpevzner
Дата: 08.11.07 18:48
Оценка: 2 (1)
Здравствуйте, a18, Вы писали:

a18>"On 18 March 2006, Klima published an algorithm[5] that can find a collision

a18>within one minute on a single notebook computer, using a method he calls tunneling.".
a18>О как!

Это (пока что?) не те коллизии. Зная строку s1, все еще трудно придумать строку s2 такую, что md5(s1) == md5(s2). Но вот подобрать пару строк с совпадающей md5 можно действительно довольно быстро.

Ребята, которые это изобрели, в качестве proof of concept написали програмучину, которая берет любые 2 файла (или N файлов, не помню), и делает из них 2 (или N) self-extractor'я. При запуске каждо self-extractor'а выпадает соответствующий файл. При этом self-extractor'ы имеют одинаковую md5.

Но это, на самом деле, обман зрения. Каждый self-extractor содержит оба файла целиком, и еще небольшую дописочку. Эти дописочки разные, но получающаяся md5 — одинаковая. Как уж self-extractor различает, какой из файлов выплевывать, я не в курсе.
Re: XOR шифрование с MD5 дайджестами
От: michael_srv  
Дата: 07.11.07 09:47
Оценка: :)
А>В принципе, я понимаю, что если дешифровать первый блок, то можно будет дешифровать и все сообщение.
А>Может есть варианты как улучшить влгоритм без излишнего усложнения.

ну наример так:

CBLOCK1 = XOR(BLOCK1, DIGEST1)
DIGEST2 = MD5(CBLOCK1)

CBLOCK2 = XOR(CBLOCK2, DIGEST2)
DIGEST3 = MD5(CBLOCK2)

CBLOCK3 = XOR(BLOCK3, DIGEST3)
DIGEST4 = MD5(CBLOCK3)

и потом

CBLOCK1 + CBLOCK2 + CBLOCK3 + ... + CBLOCKN = TEXT

хотя это не особо защитит, но все-же...
XOR шифрование с MD5 дайджестами
От: Аноним  
Дата: 07.11.07 09:37
Оценка:
Хочу спросить у людей, хорошо разбирающихся в методах шифрования...
На сколько криптостоек будет следующий ПРОСТЕЙШИЙ алгоритм, приведенный ниже.
Я понимаю, что он очень прост... Однако он будет использоваться для хранения зашифрованного COOKIE на компьютере пользователя.

TEXT = текст для шифрования
KEY = ключ для шифрования

Текст разбиваем на блоки равные длине дайджеста MD5:

TEXT = BLOCK1 + BLOCK2 + BLOCK3 + ... + BLOCKN

Вычисляем MD5 дайджест ключа:

DIGEST1 = MD5(KEY)

Затем запускаем цикл шифрования в котором выполняем операцию XOR с блоками текста и вычисляем новый дайджест:

BLOCK1 = XOR(BLOCK1, DIGEST1)
DIGEST2 = MD5(DIGEST1)

BLOCK2 = XOR(BLOCK2, DIGEST2)
DIGEST3 = MD5(DIGEST2)

BLOCK3 = XOR(BLOCK3, DIGEST3)
DIGEST4 = MD5(DIGEST3)

... и так далее

Затем собираем шифрованый текст:

BLOCK1 + BLOCK2 + BLOCK3 + ... + BLOCKN = TEXT

В принципе, я понимаю, что если дешифровать первый блок, то можно будет дешифровать и все сообщение.
Может есть варианты как улучшить влгоритм без излишнего усложнения.
Re: XOR шифрование с MD5 дайджестами
От: WolfHound  
Дата: 07.11.07 11:39
Оценка:
Здравствуйте, <Аноним>, Вы писали:

А зачем ты вобще изобретаешь велосипед?
Возьми например Blowfish
Реализаций полно. Например crypto++
... << RSDN@Home 1.2.0 alpha rev. 745>>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Re[2]: XOR шифрование с MD5 дайджестами
От: Аноним  
Дата: 07.11.07 14:55
Оценка:
Здравствуйте, WolfHound, Вы писали:

WH>Здравствуйте, <Аноним>, Вы писали:


WH>А зачем ты вобще изобретаешь велосипед?

WH>Возьми например Blowfish
WH>Реализаций полно. Например crypto++

О существовании таких монстров как Blowfish, AES, ГОСТ и т.д. и т.п. мне очень хорошо известно!

Но в данный момент нужен относительно простой алгоритм, легко реализуемый на практике, малый по объему кода.
И СОВСЕМ НЕ ОБЯЗАТЕЛЬНО, чтобы криптостойкость зашифрованых СOOKIE файлов на компьютере пользователя равнялась возрасту вселенной.
Re[3]: XOR шифрование с MD5 дайджестами
От: Leonidze  
Дата: 07.11.07 16:07
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Здравствуйте, WolfHound, Вы писали:


WH>>Здравствуйте, <Аноним>, Вы писали:


WH>>А зачем ты вобще изобретаешь велосипед?

WH>>Возьми например Blowfish
WH>>Реализаций полно. Например crypto++

А>О существовании таких монстров как Blowfish, AES, ГОСТ и т.д. и т.п. мне очень хорошо известно!


А>Но в данный момент нужен относительно простой алгоритм, легко реализуемый на практике, малый по объему кода.

А>И СОВСЕМ НЕ ОБЯЗАТЕЛЬНО, чтобы криптостойкость зашифрованых СOOKIE файлов на компьютере пользователя равнялась возрасту вселенной.

посмотри в сторону RC4. он примитивен технически (строк в 50-100 можно уложиться, а то и меньше), быстр и относительно стоек. Правда он поточный, но в случае который ты предлагаешь (xor поблочно) не вижу никакой разницы.
Re[2]: XOR шифрование с MD5 дайджестами
От: a18 Россия  
Дата: 07.11.07 20:50
Оценка:
a18>http://en.wikipedia.org/wiki/Block_cipher_modes_of_operation
a18>ИМХО вариант со счётчиком довольно интересный.

Упс, пожалуй, всё-таки лучше, как уже предлагали выше, режим CFB, чтобы
изменение одного бита в plaintext приводило к изменению всего
последующего зашифрованного текста.
Кстати, можно ещё каждый раз генерировать случайный IV и приписывать его
значение в начале зашифрованного сообщения — тогда даже при одинаковых
входных данных каждый раз будут получаться совершенно разные зашифрованные
тексты — мелочь, а приятно!
Re[2]: XOR шифрование с MD5 дайджестами
От: Erop Россия  
Дата: 07.11.07 23:12
Оценка:
Здравствуйте, michael_srv, Вы писали:

А>>В принципе, я понимаю, что если дешифровать первый блок, то можно будет дешифровать _>CBLOCK1 = XOR(BLOCK1, DIGEST1)

_>DIGEST2 = MD5(CBLOCK1)

_>CBLOCK2 = XOR(CBLOCK2, DIGEST2)

_>DIGEST3 = MD5(CBLOCK2)

_>CBLOCK1 + CBLOCK2 + CBLOCK3 + ... + CBLOCKN = TEXT


_>хотя это не особо защитит, но все-же...

При таком способе только лень может помешать расшифровать что-то кроме CBLOCK1
Ключ вообще почти не нужен
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re[2]: XOR шифрование с MD5 дайджестами
От: a18 Россия  
Дата: 08.11.07 04:57
Оценка:
Pzz>Т.е. некоторое подобые CBC.

Наверное, всё-таки, CFB.


Pzz>Но в серьезной программе я бы так делать не стал — все равно велика вероятность, что где-то затесалась ошибка.


+1!
Вот и яндекс — как раз услужливо ссылочку выдал:
http://data.mf.grsu.by/Crypto/papers/2887/28870036.pdf
Цитата:
==
4 Conclusions
We have presented attacks against block ciphers that have been directly derived
from dedicated hash functions. Section 2 discusses slide attacks against SHA-1
and SHACAL-1 and section 3 describes simple attacks against MDC-MD5 and
the Kaliski-Robshaw cipher.
Compression functions are meant to be only ran in one direction. The security
properties of compression functions can be different when ran in the opposite
direction (“decryption”). Furthermore a key-scheduling mechanism suitable for
a dedicated hash function may be insufficient for a block cipher.
Based on evidence in hand, we assert that since the design criteria of compression
functions and block ciphers are radically different, adaptation of even
a secure compression function as a block cipher is often not a wise thing to do.

==
Re[4]: XOR шифрование с MD5 дайджестами
От: Аноним  
Дата: 08.11.07 10:54
Оценка:
Здравствуйте, WolfHound, Вы писали:

WH>Здравствуйте, <Аноним>, Вы писали:


А>>Но в данный момент нужен относительно простой алгоритм, легко реализуемый на практике, малый по объему кода.

WH>Нет ничего проще чем взять готовую реализацию.
WH>Но если очень хочешь написать сам то RC4: [код поскипан]
WH>Далие тупо XOR'ишь данные с тем что выдает этот ГПСЧ.

Спасибо, кажется, такое решение может подойти...
Re[5]: XOR шифрование с MD5 дайджестами
От: Pzz Россия https://github.com/alexpevzner
Дата: 08.11.07 11:04
Оценка:
Здравствуйте, Аноним, Вы писали:

А>>>Но в данный момент нужен относительно простой алгоритм, легко реализуемый на практике, малый по объему кода.

WH>>Нет ничего проще чем взять готовую реализацию.
WH>>Но если очень хочешь написать сам то RC4: [код поскипан]
WH>>Далие тупо XOR'ишь данные с тем что выдает этот ГПСЧ.

А>Спасибо, кажется, такое решение может подойти...


Это тоже очень плохо. Для одного и того же ключа RC4 выдает всегда одну и ту же последовательность. Поэтому если в сообщениях понятно хоть что-то, ее можно восстановить из последовательности сообщений. Скажем, если внутри там английские слова (или, еще лучше, XML), то угадав первые 3 буквы слова, легко можно угадать и 4-ю. А разглядывая уже раскрытые буквы в соседних сообщениях, можно угадать и остальные.

Для RC4 надо обязательно подмешивать в ключ что-нибудь не повторяющееся от сообщения к сообщению. Например, просто сколько-то байт от генератора случайных чисел. И передавать их в начале зашифрованного текста в открытом виде, чтобы можно было расшифровать сообщение на другой стороне.

Кроме того, с RC4 не стоит использовать линейные контрольные суммы, типа CRC32, для проверки подлинности сообщения. Известный факт, если сообщение зашифровано RC4 и защищено CRC32, то в нем можно поменять байты даже не расшифровывая сообщения, и пересчитать CRC так, что у получателя все сойдется.

В общем, мой совет — взять готовый шифр (cihper) и использовать его в стандартном режиже (mode) — ребята, которые придумывают эти режимы, они не зря свой хлеб едят.
Re[4]: XOR шифрование с MD5 дайджестами
От: Аноним  
Дата: 08.11.07 11:16
Оценка:
Здравствуйте, Leonidze, Вы писали:

L>посмотри в сторону RC4. он примитивен технически (строк в 50-100 можно уложиться, а то и меньше), быстр и относительно стоек. Правда он поточный, но в случае который ты предлагаешь (xor поблочно) не вижу никакой разницы.


Спасибо, посмотрю... Поточный алгоритм тоже подойдет...
Re[5]: XOR шифрование с MD5 дайджестами
От: Аноним  
Дата: 08.11.07 11:32
Оценка:
Здравствуйте, Sergey Chadov, Вы писали:

SC>Или можно взять TEA. Он еще проще и относительно криптостоек (хотя специфические атаки на него есть).


Спасибо!
Буквально еще вчера уже нашел этот алгоритм и две его коррекции XTEA и XXTEA.
Думаю, это вообще идеальный вариант! Маленький и быстрый код основаный на функциях Фейстеля.
На этих же функциях постороен DES и 3DES.

XXTEA действительно достаточно криптостоек (и вносит две коррекции в TEA исключая известнык на этот момент специфические атаки на него).
Думаю буду использовать его.

Есть один вопрос... Криптостойкость информации в TEA как-то зависит от длины ключа?
Достаточно ли хорошо будет, если в качестве ключа брать допустим MD5 дайджест от пароля с каким нибудь сольдом?
Re[3]: XOR шифрование с MD5 дайджестами
От: Аноним  
Дата: 08.11.07 11:42
Оценка:
Здравствуйте, a18, Вы писали:

a18>>http://en.wikipedia.org/wiki/Block_cipher_modes_of_operation

a18>>ИМХО вариант со счётчиком довольно интересный.

a18>Упс, пожалуй, всё-таки лучше, как уже предлагали выше, режим CFB, чтобы

a18>изменение одного бита в plaintext приводило к изменению всего
a18>последующего зашифрованного текста.

Вариант, который предложил Егор так и будет работать:

...

CBLOCK1 = XOR(BLOCK1, DIGEST1)
DIGEST2 = MD5(CBLOCK1)

CBLOCK2 = XOR(CBLOCK2, DIGEST2)
DIGEST3 = MD5(CBLOCK2)

CBLOCK1 + CBLOCK2 + CBLOCK3 + ... + CBLOCKN = TEXT

...

a18>Кстати, можно ещё каждый раз генерировать случайный IV и приписывать его

a18>значение в начале зашифрованного сообщения — тогда даже при одинаковых
a18>входных данных каждый раз будут получаться совершенно разные зашифрованные
a18>тексты — мелочь, а приятно!

Такие примочки мне известны... Но это несущественно, в конкретной ситуации!
Re[3]: XOR шифрование с MD5 дайджестами
От: Аноним  
Дата: 08.11.07 11:53
Оценка:
Здравствуйте, Erop, Вы писали:

E>Здравствуйте, michael_srv, Вы писали:


А>>>В принципе, я понимаю, что если дешифровать первый блок, то можно будет дешифровать _>CBLOCK1 = XOR(BLOCK1, DIGEST1)

_>>DIGEST2 = MD5(CBLOCK1)

_>>CBLOCK2 = XOR(CBLOCK2, DIGEST2)

_>>DIGEST3 = MD5(CBLOCK2)

_>>CBLOCK1 + CBLOCK2 + CBLOCK3 + ... + CBLOCKN = TEXT


_>>хотя это не особо защитит, но все-же...

E>При таком способе только лень может помешать расшифровать что-то кроме CBLOCK1
E>Ключ вообще почти не нужен

А если сделать так:

TEXT = BLOCK1 + BLOCK2 + BLOCK3 + ... + BLOCKN

DIGEST1 = MD5(KEY)
BLOCK1 = XOR(BLOCK1, DIGEST1)

DIGEST2 = MD5(BLOCK1 + DIGEST1)
BLOCK2 = XOR(BLOCK2, DIGEST2)

DIGEST3 = MD5(BLOCK2 + DIGEST2)
BLOCK3 = XOR(BLOCK3, DIGEST3)

BLOCK1 + BLOCK2 + BLOCK3 + ... + BLOCKN = TEXT

Тогда полная расшифровка сводится только к нахождению KEY (а его можно найти только перебором, я не ошибаюсь?)
Re[2]: XOR шифрование с MD5 дайджестами
От: Аноним  
Дата: 08.11.07 12:07
Оценка:
Здравствуйте, Pzz, Вы писали:

Pzz>BLOCK0 = RANDOM(); // Вначале втыкаем 16 байт от генератора случайных чисел

Pzz>BLOCK1 = XOR( BLOCK1, MD5( KEY, BLOCK0 ) );
Pzz>BLOCK2 = XOR( BLOCK2, MD5( KEY, BLOCK1 ) );
Pzz>BLOCK3 = XOR( BLOCK3, MD5( KEY, BLOCK2 ) );
Pzz>...
Pzz>BLOCKN = XOR( BLOCKN, MD5( KEY, BLOCKN-1)
Pzz>MAC = MD5( KEY, BLOCKN ); // Используем при расщифровке для проверки

Спасибо! Но в этом алгоритме существует уязвимость для определенных сообщений с повтрояющимися блоками...
Я думаю, вы сами догадаетесь для каких... Вот заплатка:

BLOCK0 = RANDOM();
BLOCK1 = XOR( BLOCK1, MD5( KEY = MD5(KEY), BLOCK0 ) );
BLOCK2 = XOR( BLOCK2, MD5( KEY = MD5(KEY), BLOCK1 ) );
BLOCK3 = XOR( BLOCK3, MD5( KEY = MD5(KEY), BLOCK2 ) );
BLOCKN = XOR( BLOCKN, MD5( KEY = MD5(KEY), BLOCKN-1)
MAC = MD5( KEY, BLOCKN );

Необходимо 'размазывать' ключ!!! Догадайтесь почему!
Re[3]: XOR шифрование с MD5 дайджестами
От: Аноним  
Дата: 08.11.07 12:47
Оценка:
Здравствуйте, a18, Вы писали:

a18>Based on evidence in hand, we assert that since the design criteria of compression

a18>functions and block ciphers are radically different, adaptation of even
a18>a secure compression function as a block cipher is often not a wise thing to do.


В этой же статье написано, что шифр MDC основанный на MD5 функции можно раскрыть за 2^48 попыток, используя таблицу расписаний MD5 ключей.
В случае WEB-приложений получается, что если 100000 компьютеров делающих 1 запрос в 1 секунду взломают один пароль за 8 лет.
Мне кажется такая криптостойкость вполне достаточна для простых сайтов с авторизацией (НЕКОМЕРЧЕСКИХ, на которорых не храняться ни деньги пользователей, ни какая либо важная информация).

Итак понятно, что практически все MD5 шифры можно снять за максимум 2^48 попыток.

А насколько крут алгоритм ТEA в этом отношении?
Re[6]: XOR шифрование с MD5 дайджестами
От: Аноним  
Дата: 08.11.07 13:07
Оценка:
Здравствуйте, Pzz, Вы писали:

Pzz>Это тоже очень плохо. Для одного и того же ключа RC4 выдает всегда одну и ту же последовательность. Поэтому если в сообщениях понятно хоть что-то, ее можно восстановить из последовательности сообщений. Скажем, если внутри там английские слова (или, еще лучше, XML), то угадав первые 3 буквы слова, легко можно угадать и 4-ю. А разглядывая уже раскрытые буквы в соседних сообщениях, можно угадать и остальные.


Нет ну напрямую, я функцию, которую предложил WolfHound я использовать и не собираюсь... Можно оступить так:

Этот код:
class RC4
{
public:
    RC4(void* key, int len) { init(key, len); }
    void init(void* key, int len)
    {
        unsigned char* k = reinterpret_cast<unsigned char*>(key);
        i = j = 0;
        for (; i < 256; ++i)
            buf[i] = i;
        i = j = 0;
        for (; i < 256; ++i)
        {
            j = (j + buf[i] + k[i % len]) % 256;
            std::swap(buf[i], buf[j]);
        }
        i = j = 0;
    }
    unsigned char next()
    {
        i = (i + 1) % 256;
        j = (j + buf[i]) % 256;
        std::swap(buf[i], buf[j]);
        return buf[(buf[i] + buf[j]) % 256];
    }
private:
    unsigned int i;
    unsigned int j;
    unsigned char buf[256];
};


обозвать скажем функцией RC4. А далее:

TEXT = BLOCK1 + BLOCK2 + BLOCK3 + ... + BLOCKN
BLOCK1 = XOR(BLOCK1, RC4(KEY = RC4(KEY), BLOCK0 ))
BLOCK2 = XOR(BLOCK2, RC4(KEY = RC4(KEY), BLOCK1 ))
BLOCK3 = XOR(BLOCK3, RC4(KEY = RC4(KEY), BLOCK2 ))
BLOCKN = XOR(BLOCKN, RC4(KEY = RC4(KEY), BLOCKN-1))
BLOCK1 + BLOCK2 + BLOCK3 + ... + BLOCKN = TEXT

В отличии от MD5 тут можно выбирать длину блока. Однако на сколько хорош этот ГСЧ от RC4?
Re[4]: XOR шифрование с MD5 дайджестами
От: a18 Россия  
Дата: 08.11.07 13:32
Оценка:
a18>>Based on evidence in hand, we assert that since the design criteria of compression
a18>>functions and block ciphers are radically different, adaptation of even
a18>>a secure compression function as a block cipher is often not a wise thing to do.


А>В этой же статье написано, что шифр MDC основанный на MD5 функции можно раскрыть за 2^48 попыток, используя таблицу расписаний MD5 ключей.

А>В случае WEB-приложений получается, что если 100000 компьютеров делающих 1 запрос в 1 секунду взломают один пароль за 8 лет.
А>Мне кажется такая криптостойкость вполне достаточна для простых сайтов с авторизацией (НЕКОМЕРЧЕСКИХ, на которорых не храняться ни деньги пользователей, ни какая либо важная информация).

В таких случаях стоит обращать внимание даже не на сами цифры, а на тенденцию.
К примеру, в теории для MD5 (128 бит) нахождение коллизии методом "дня рождения" требует
порядка 2^64 операций (условно 600 лет), а на практике в Википедии пишут следующее:
"On 18 March 2006, Klima published an algorithm[5] that can find a collision
within one minute on a single notebook computer, using a method he calls tunneling.".
О как!

И, собственно, в обсуждаемой статье суть сформулирована довольно точно: критерии проектирования для хешей и для блочных шифров отличаются, и лучше лишний раз не рисковать.
Но это всё, естественно, касается серьезных приложений, а для простых случаев того, что понаписали в ветке, ИМХО хватит с запасом!

Про TEA — не знаю, попробуйте для начала в Википедии посмотреть — там наверняка всё аккуратно изложено — кто, когда и как.
Re[5]: XOR шифрование с MD5 дайджестами
От: Аноним  
Дата: 08.11.07 14:06
Оценка:
Здравствуйте, a18, Вы писали:

a18>В таких случаях стоит обращать внимание даже не на сами цифры, а на тенденцию.

a18>К примеру, в теории для MD5 (128 бит) нахождение коллизии методом "дня рождения" требует
a18>порядка 2^64 операций (условно 600 лет), а на практике в Википедии пишут следующее:
a18>"On 18 March 2006, Klima published an algorithm[5] that can find a collision
a18>within one minute on a single notebook computer, using a method he calls tunneling.".
a18>О как!

На счет Klima читал и ранее... Но легкое обнаружение коллизий — не означает легкую обратимость функции MD5.
А на счет тенденции — согласен!!! Математика развивается — и неизвестно, что будет в будущем! Может завтра мы все умрем .

a18>И, собственно, в обсуждаемой статье суть сформулирована довольно точно: критерии проектирования для хешей и для блочных шифров отличаются, и лучше лишний раз не рисковать. Но это всё, естественно, касается серьезных приложений, а для простых случаев того, что понаписали в ветке, ИМХО хватит с запасом!


OK. Я тоже все больше склоняюсь теперь к использованию XXTEA, чем писать нечто свое — непроверенное.
Re[6]: XOR шифрование с MD5 дайджестами
От: Sergey Chadov Россия  
Дата: 08.11.07 17:31
Оценка:
Здравствуйте, <Аноним>, Вы писали:

А>Есть один вопрос... Криптостойкость информации в TEA как-то зависит от длины ключа?

А>Достаточно ли хорошо будет, если в качестве ключа брать допустим MD5 дайджест от пароля с каким нибудь сольдом?
Ну в "классическом" варианте, который приведен в оригинальной статье и в моем предыдущем сообщении длина ключа фиксирована и составляет 128 бит.
MD5 от пароля с солью в принципе должен подойти. По крайней мере, каких либо очевидных уязвимостей я не вижу, если придерживаться грамотной политики распределения паролей. Кроме конечно того, что при большом желании на 128-битный ключ можно организовать birthday attack.
--
Sergey Chadov

... << RSDN@Home 1.2.0 alpha rev. 685>>
Re[3]: XOR шифрование с MD5 дайджестами
От: Pzz Россия https://github.com/alexpevzner
Дата: 08.11.07 18:37
Оценка:
Здравствуйте, Аноним, Вы писали:

А>BLOCK0 = RANDOM();

А>BLOCK1 = XOR( BLOCK1, MD5( KEY = MD5(KEY), BLOCK0 ) );
А>BLOCK2 = XOR( BLOCK2, MD5( KEY = MD5(KEY), BLOCK1 ) );
А>BLOCK3 = XOR( BLOCK3, MD5( KEY = MD5(KEY), BLOCK2 ) );
А>BLOCKN = XOR( BLOCKN, MD5( KEY = MD5(KEY), BLOCKN-1)
А>MAC = MD5( KEY, BLOCKN );

А>Необходимо 'размазывать' ключ!!! Догадайтесь почему!


Нет, я не очень понимаю, объясните пожалуйста.

А обойтить одним, а не 2-мя, MD5 на блок можно?
Re[7]: XOR шифрование с MD5 дайджестами
От: Pzz Россия https://github.com/alexpevzner
Дата: 08.11.07 18:41
Оценка:
Здравствуйте, Аноним, Вы писали:

А>TEXT = BLOCK1 + BLOCK2 + BLOCK3 + ... + BLOCKN

А>BLOCK1 = XOR(BLOCK1, RC4(KEY = RC4(KEY), BLOCK0 ))
А>BLOCK2 = XOR(BLOCK2, RC4(KEY = RC4(KEY), BLOCK1 ))
А>BLOCK3 = XOR(BLOCK3, RC4(KEY = RC4(KEY), BLOCK2 ))
А>BLOCKN = XOR(BLOCKN, RC4(KEY = RC4(KEY), BLOCKN-1))
А>BLOCK1 + BLOCK2 + BLOCK3 + ... + BLOCKN = TEXT

А>В отличии от MD5 тут можно выбирать длину блока. Однако на сколько хорош этот ГСЧ от RC4?


RC4 довольно медленно пережевывает ключ. Делать это на каждый блок не очень разумно.

Насчет качества ГСЧ, имеет смысл почитать по интернету. Говорят, у него не очень хорошие первые сколько-то килобит, и ключ течет потихоньку (т.е., набрав много выдачи этого ГСЧ, дальше можно уже продолжить не зная ключа). Поэтому рекомендуется подмешивать в ключ что-нибудь случайное, и делать регулярный rekeying. Но все же не на каждые 16 байт
Re[8]: XOR шифрование с MD5 дайджестами
От: Аноним  
Дата: 09.11.07 07:00
Оценка:
Здравствуйте, Pzz, Вы писали:

Pzz>RC4 довольно медленно пережевывает ключ. Делать это на каждый блок не очень разумно.


Pzz>Насчет качества ГСЧ, имеет смысл почитать по интернету. Говорят, у него не очень хорошие первые сколько-то килобит, и ключ течет потихоньку (т.е., набрав много выдачи этого ГСЧ, дальше можно уже продолжить не зная ключа). Поэтому рекомендуется подмешивать в ключ что-нибудь случайное, и делать регулярный rekeying. Но все же не на каждые 16 байт


Спасибо, почитаю подробнее на счет этого в интернете...
Re[7]: XOR шифрование с MD5 дайджестами
От: Mira  
Дата: 09.11.07 07:06
Оценка:
Здравствуйте, Sergey Chadov, Вы писали:

SC>Здравствуйте, <Аноним>, Вы писали:


А>>Есть один вопрос... Криптостойкость информации в TEA как-то зависит от длины ключа?

А>>Достаточно ли хорошо будет, если в качестве ключа брать допустим MD5 дайджест от пароля с каким нибудь сольдом?
SC>Ну в "классическом" варианте, который приведен в оригинальной статье и в моем предыдущем сообщении длина ключа фиксирована и составляет 128 бит.
SC>MD5 от пароля с солью в принципе должен подойти. По крайней мере, каких либо очевидных уязвимостей я не вижу, если придерживаться грамотной политики распределения паролей. Кроме конечно того, что при большом желании на 128-битный ключ можно организовать birthday attack.

Ок! Буду использовать XXTEA!
Re[4]: XOR шифрование с MD5 дайджестами
От: Mira  
Дата: 09.11.07 07:25
Оценка:
Здравствуйте, Pzz, Вы писали:

А>>Необходимо 'размазывать' ключ!!! Догадайтесь почему!


Pzz>Нет, я не очень понимаю, объясните пожалуйста.

Pzz>А обойтить одним, а не 2-мя, MD5 на блок можно?

Извините, глючу! При детальном рассмотрении, мои размышления оказались надуманными...
Разницы в действительности нет! Но первый вариант с одним MD5 на блок конечно предпочтителен.
Re[6]: XOR шифрование с MD5 дайджестами
От: a18 Россия  
Дата: 09.11.07 10:37
Оценка:
Pzz>Это (пока что?) не те коллизии.

Да, если бы это были ТЕ коллизии, народ бы сейчас лихорадочно переписывал многие системы


Pzz>Ребята, которые это изобрели, в качестве proof of concept написали програмучину, которая берет любые 2 файла (или N файлов, не помню), и делает из них 2 (или N) self-extractor'я. При запуске каждо self-extractor'а выпадает соответствующий файл. При этом self-extractor'ы имеют одинаковую md5.


Ага, в ЖЖ вот эту ссылку указывали:
http://cryptography.hyperlink.cz/2006/trick.txt
Re[8]: XOR шифрование с MD5 дайджестами
От: WolfHound  
Дата: 09.11.07 10:58
Оценка:
Здравствуйте, Pzz, Вы писали:

Pzz>Насчет качества ГСЧ, имеет смысл почитать по интернету. Говорят, у него не очень хорошие первые сколько-то килобит, и ключ течет потихоньку (т.е., набрав много выдачи этого ГСЧ, дальше можно уже продолжить не зная ключа). Поэтому рекомендуется подмешивать в ключ что-нибудь случайное, и делать регулярный rekeying. Но все же не на каждые 16 байт

А если сделать что-то типа такого
class RC4M
{
public:
    RC4M(void const* key, int len)
    {
        unsigned char const* k = reinterpret_cast<unsigned char const*>(key);
        i = j = 0;
        for (; i < 256; ++i)
            buf[i] = i;
        i = j = 0;
        for (; i < 256; ++i)
        {
            j = (j + buf[i] + k[i % len]) % 256;
            std::swap(buf[i], buf[j]);
        }
        i = j = 0;
        for (int k = 0; k < 1024; ++k)
            next();
    }
    unsigned char next()
    {
        i = (i + 1) % 256;
        j = (j + buf[i]) % 256;
        std::swap(buf[i], buf[j]);
        return buf[(buf[i] + buf[j]) % 256];
    }
    unsigned char encode(unsigned char c)
    {
        unsigned char cc = next();
        j += c;
        c ^= cc;
        return c;
    }
    unsigned char decode(unsigned char c)
    {
        unsigned char cc = next();
        c ^= cc;
        j += c;
        return c;
    }
private:
    unsigned int i;
    unsigned int j;
    unsigned char buf[256];
};

И начинать поток с N (скажем 256 чтобы генератор сделал полный цикл) байт мусора.
Ну и иногда вставлять сообщения с мусором которые прикладной протокол будет тупо дропать.
... << RSDN@Home 1.2.0 alpha rev. 745>>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Re[9]: XOR шифрование с MD5 дайджестами
От: Mira  
Дата: 09.11.07 13:59
Оценка:
Здравствуйте, WolfHound, Вы писали:

WH>И начинать поток с N (скажем 256 чтобы генератор сделал полный цикл) байт мусора.

WH>Ну и иногда вставлять сообщения с мусором которые прикладной протокол будет тупо дропать.

Можно конечно, но такая вешь не пройдет скажем с такими языками как PHP (так как в нем нет понятия мусора).
Re[10]: XOR шифрование с MD5 дайджестами
От: WolfHound  
Дата: 09.11.07 14:44
Оценка:
Здравствуйте, Mira, Вы писали:

M>Можно конечно, но такая вешь не пройдет скажем с такими языками как PHP (так как в нем нет понятия мусора).

/dev/urandom
Ы?
... << RSDN@Home 1.2.0 alpha rev. 745>>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.