id: Гость   вход   регистрация
текущее время 14:48 19/03/2024
Автор темы: Morfeys, тема открыта 28/02/2018 15:53 Печать
Категории: криптография, криптоанализ, алгоритмы, хэширование, атаки
https://www.pgpru.com/Форум/Криптография/ПотоковыйШифрRC4S256ВозрождениеRC4
создать
просмотр
ссылки

Потоковый шифр RC4 s256, возрождение RC4

После простого шифра сжатия хэша и шифра на крипто примитиве Murmur160Tea128 ,изучая простой потоковый шифр RС4, обратил внимание, что все проблемы его реализации сводятся к слабому генерированию s блока от пароля. И все!!!
RC4 очень стоек к линейному и диф. анализу из за большого s блока(см. википедию).


И как же советуют на генерировать этот s блок? Да просто прогнать шифр по чему либо в холостую, и чтобы "это" было побольше побольше (для того, чтобы s блок точно на генерировал случайные значения), а после уже идти на шифрование :). Ну просто верх находчивости и разумности.
Как поступил бы я:
1)Использовал бы второй несложный шифр. И в него послал бы этот s[256] блок с этим же паролем. Хотя бы тот же упомянутый вверху шифр сжатия хэша в 1 символ. Получаем возможность использовать 2 шифра и убираем недостаток RC4.
2)На генерировать s[256] хэшем от пароля.


Я выбрал написать функцию заполнения s блока хэшем. Чтобы иметь один алгоритм в одном файле .h, во избежания путаницы после.



 
Комментарии
— Morfeys (28/02/2018 15:59)   профиль/связь   <#>
комментариев: 20   документов: 3   редакций: 0
Вырыв из инетов простой исходник RC4 (с++), я чуток его коментнул:
— Morfeys (28/02/2018 16:08, исправлен 28/02/2018 16:10)   профиль/связь   <#>
комментариев: 20   документов: 3   редакций: 0

Пришлось писать функцию генерации 8 символьного хэша(см.ссыли в шифр сжатия хэша в 1 символ)


далее заполнения 256 символьного блока от пароля и счетчика (старого хэша). Пораскинув мозгами по стенке, прикинул что получился довольно случайный s[256] блок, если не знать пароля.


Прикрутил все это в RC4 и вот он, наша птица феникс-
Потоковый шифр RC4s256:


RC4s256.h

— Morfeys (28/02/2018 16:18, исправлен 28/02/2018 16:24)   профиль/связь   <#>
комментариев: 20   документов: 3   редакций: 0

Как пользоваться:
Инклюдим к проекту-


#include "RC4s256.h"


ну и пример вызова функции шифрования показан в коде, но все же повторюсь-


//ключ

unsigned char key88[9]={0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09};

// длинна ключа

int int_key88=9;

//текст

unsigned char text88[19]={0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x10,
0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09};

// длинна текста

int int_text88=19;

//шифрование

RC4s256 (text88,key88,int_text88,int_key88);


И солим ваши пароли 160 битными значениями. Хотя бы хэшами типа MurmurHash160 или из крипто примитива Murmur160Tea128

— Morfeys (28/02/2018 16:29)   профиль/связь   <#>
комментариев: 20   документов: 3   редакций: 0
Пример в коде с ошибкой, начинающие могут не понять, исправить не могу, редактировать можно только последний пост, надо так
:
//ключ
unsigned char key88[9]={0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09};

а не
unsigned char key88[19]
— Onix (05/05/2020 09:16, исправлен 05/05/2020 09:26)   профиль/связь   <#>
комментариев: 10   документов: 3   редакций: 0

Может лучше модифицировать количество индексов, примерно так:


static byte_t A,B,C,S[256];


/* Вывод одного псевдослучайного байта */
byte_t
rc4m(byte_t x)
{

A +=1; B =S[(B +A +x)&255]; C =S[(C +B +(x))&255];
x =S[A], S[A] =S[B], S[B] =S[C], S[C] =x;
return S[S[A] ^S[B] ^S[C]];

}


/* ключевое расписание */
byte_t
rc4m_init(byte_t *key, word32_t key_sz)
{
word32_t i;
byte_t t=251;


for(i=0; i<256; i++) S[i] =i;
for(i=0; i<256; i++) t =rc4m(t +key_sz)?key[i%key_sz]:i;
return t;

}

Ваша оценка документа [показать результаты]
-3-2-1 0+1+2+3