Потоковый шифр RC4 s256, возрождение RC4
После простого шифра сжатия хэша и шифра на крипто примитиве Murmur160Tea128 ,изучая простой потоковый шифр RС4, обратил внимание, что все проблемы его реализации сводятся к слабому генерированию s блока от пароля. И все!!!
RC4 очень стоек к линейному и диф. анализу из за большого s блока(см. википедию).
И как же советуют на генерировать этот s блок? Да просто прогнать шифр по чему либо в холостую, и чтобы "это" было побольше побольше (для того, чтобы s блок точно на генерировал случайные значения), а после уже идти на шифрование :). Ну просто верх находчивости и разумности.
Как поступил бы я:
1)Использовал бы второй несложный шифр. И в него послал бы этот s[256] блок с этим же паролем. Хотя бы тот же упомянутый вверху шифр сжатия хэша в 1 символ. Получаем возможность использовать 2 шифра и убираем недостаток RC4.
2)На генерировать s[256] хэшем от пароля.
Я выбрал написать функцию заполнения s блока хэшем. Чтобы иметь один алгоритм в одном файле .h, во избежания путаницы после.
комментариев: 20 документов: 3 редакций: 0
комментариев: 20 документов: 3 редакций: 0
Пришлось писать функцию генерации 8 символьного хэша(см.ссыли в шифр сжатия хэша в 1 символ)
далее заполнения 256 символьного блока от пароля и счетчика (старого хэша). Пораскинув мозгами по стенке, прикинул что получился довольно случайный s[256] блок, если не знать пароля.
Прикрутил все это в RC4 и вот он, наша птица феникс-
Потоковый шифр RC4s256:
RC4s256.h
комментариев: 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
комментариев: 20 документов: 3 редакций: 0
:
а не
unsigned char key88[19]
комментариев: 10 документов: 3 редакций: 0
Может лучше модифицировать количество индексов, примерно так:
static byte_t A,B,C,S[256];
/* Вывод одного псевдослучайного байта */
byte_t
rc4m(byte_t x)
{
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++) t =rc4m(t +key_sz)?key[i%key_sz]:i;
return t;
}