Крипто примитив Хэш160 c Tea128


Продолжаю делать велосипеды, в прошлой теме Простой потоковый шифр (сжатие хэша в 1 символ[link1]) был реализован интересный шифр, построенной на проблеме сжатия хэша.
Читая форум, бороздя интернет часто сталкиваюсь с еще одним "велосипедом", но уже одноколесным. С утверждением, что можно получить потоковый шифр, используя
криптографический хэш. Давая на его вход номер гаммы(N) и пароль. К примеру Потоковый шифр на основе хеш-функции и Counter Mode Encryption CTR[link2].
Во всех мануалах описания хэшей прямо говорится, что хэши не испытываются в качестве шифра. Так проблема хэша как шифра- что он почти не имеет коллизий.
Так к примеру хакеры и другие структуры собирают 128 битные значения на входе MD5 и их хэши соответственно в радужные таблицы. Никто не поручится, что не собирают и 256 или 512 входящие значения и их хэши в свои базы.
И если сейчас вы сложили пароль и номер гаммы, то через год другой это значение может появится в огромной "радужной" базе и будет сломано за пару минут поиска.
Вот плюс шифра, тут возможна куча коллизий. К примеру зашифрованный блок №23=блоку№2694 и равен блоку№ 3698. Но при этом дойти до пароля и расшифровать не возможно, или очень хлопотно.
Как и составить годами собираемую со всех "темных" ресурсов интернета радужную таблицу из за коллизий уже бред и утопия.

Комментарии
— Morfeys (07/02/2018 13:25, исправлен 07/02/2018 13:27)   

Поэтому сделаем этот самый пятиколесный велосипед.
Криптопримитив для лепки своих шифров или чего там вам вздумается. Выберем нестойкий хэш и сростим его на выходе с проверенным криптографическим алгоритмом.
Ну и по меньше кода, чтобы все наглядно.
Хэш 160 битный MurmurHash2_160[link3]
он быстрый, не крипто, но даст нам необходимые значения
Крипто алгоритм TEA[link4]
методом взлома 32 раундов не существует, есть что то только для 17 раундов, по всем тестам TEA примерно равен IDEA, и наврятли будет взломан в обозримое время.
И MurmurHash и TEA посторены на беззнаковых 4 байтных числах. Что удобно.
Если с выхода хэша с его 160 бит 128 подать на вход пароля, то нужно еще какое то значение (хотя бы 4+4 бита) для прокрутки TEA.
128 бит псевдо текста можно набить при промежуточных расчетах MurmurHash. Только бы значения были не совпадающими при большом массиве- выборке. Хотя это не важно, т к атака на TEA требует или кучу открытых известных до шифрования текстов, или еще большую кучу времени (из вики: Атака на 10 раундов TEA требует 2 на 52.5 выбранных открытых текстов и имеет временную сложность 2 на 84. Лучший результат — криптоанализ 17 раундов TEA. Данная атака требует всего 1920 выбранных открытых текстов, однако имеет временную сложность 2 на 123.37)

— Morfeys (07/02/2018 13:29)   
MurmurHash2_160.h
— Morfeys (07/02/2018 13:48)   
Что тут уже можно?

1) Пройтись хэшем по номеру гаммы N и паролю (NNNN+password).
И получить на выходе 128 битный TEA блок.
Это не лучший вариант, т к хэш состоит на основе 4 байтных слов, а тут у нас, как обычно, 4 байта int будут повторятся и иметь вид для 1 и 2 номера 0001.0001.0001.0001 и
0002.0002.0002.0002. Что даст мало различий в хэше MurmurHash2_160.

2) Пройтись с тем же по такой конструкции ((счетчик от N)+password).Уже не плохая идея. Если этот счетчик инициируется от пароля, имеет как минимум различных 8 символов, которые с каждым шагом меняются не зависимо друг от друга. К примеру счетчик из прошлой статьи (вверху Простой потоковый шифр).
Если счетчик будет еще и менять размер, и быть не четным по количеству символов (опять вспоминаем, что хэш построен на 4 байтных словах), то совсем хорошо.

3) Использовать в функции переменную int seed88=1;
При ее изменении можно проходить хэш по одному тексту с различными значениями. Как бы заменитель счетчика блока гаммы. Можно, но я бы выбрал 2)

Советы, как (а, да, с++)-

инклюдим к проекту #include "MurmurHash2_160.h" //хэш

ну и вызываем, как описано в примере-
// текст
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;

// это ""семя" меняет хэш при одном и том же тексте
unsigned int seed88=1;
// тут будет сам 160 битный хэш
unsigned int hash32_88[5]={0,0,0,0,0};
// тут будет шифрованная гамма 128 бит TEA
unsigned int tea7[4] ={0,0,0,0};

//вызов функции хэша-Tea
MurmurHash2_160(text88,int_text88,seed88,hash32_88,tea7);

Помним!
Что это заготовка под потоковый шифр и еще боги знают какие извращения.
Делалась на скорую руку, вроде работает, еще позже проверю, пройдусь еще раз.
И да, солим наши пароли хотя бы 160 (в тему :) битными значениями!
— Morfeys (13/02/2018 03:04)   
Разобравшись немного с тем, что написал в коде, понял две вещи

*) Что происходит не внятно и не понятно, поэтому может быть нестойким
**) В описании к MurmurHash2_160 говорится, что параметр seed, который мог бы дать много хэшей при одном тексте работает криво. И с ним и без него у MurmurHash2_160 ищутся коллизии довольно быстро.

Поэтому пришлось составлять логическую схему
1) генерации 4-х int ов от хэша для "псевдо текста" через TEA шифр с паролем от хэша и seed
(т е получаем различный текст, зависящий от seed и хэша)
2) генерации выходного значения 4 int Tea шифра, как пароль хэш MurmurHash2_160, а текст, который шифруем, от пункта 1)

В итоге получили зашифрованный TEA текст 128 бит
а) до исходного текста 1) не добраться, не сломав TEA, и исходный текст пункта 1) все равно ничего не даст, т к.-т к "атака на TEA требует или кучу открытых известных до шифрования текстов, или еще большую кучу времени из вики"
б) до пароля, входящего в TEA тоже не добраться.
с) если а) и б) верны, то взлом крипто примитива Murmur160Tea128 v.02
сводится к взлому шифра TEA.

Кроме того получил 160 бит крипто хэша
схорив значения из 1) с хэшем

Итого, вот
потоковый шифр hifr_TEA128
крипто хэш 160бит
генератор псевдо случайных последовательностей
и это все на основе-
крипто примитива Murmur160Tea128 v.02
(все на c++)
— Morfeys (13/02/2018 03:06)   
файл
Murmur160_Tea128.h
— Morfeys (13/02/2018 03:12, исправлен 13/02/2018 03:13)   

шифрование:
инклюдим к проекту-


#include "Murmur160_Tea128.h"


само шифрование пример описан в коде Murmur160_Tea128.h внизу:


как программа для теста


//пароль
unsigned char password55[10]={0x1,0x2,0x3,0x4,0x5,0x6,0x7,0x8,0x9,0x10};
//длинна пароля
int int_passw55=10;
// текст для шифрования
unsigned char text55[20]={0x1,0x2,0x3,0x4,0x5,0x6,0x7,0x8,0x9,0x10,
0x1,0x2,0x3,0x4,0x5,0x6,0x7,0x8,0x9,0x10};
// длинна текста
int int_text55=20;
//шифрование
hifr_TEA128 (password55,int_passw55,
text55,int_text55);


И не забываем, что это потоковый шифр, солите пароли 160 битным значением. К примеру тем же хэшем от не зашифрованного текста :)

— Morfeys (15/02/2018 23:18)   
Нашел 1 ошибку, устранил 2 слабости алгоритма
версия 02_1

Murmur160_Tea128.h

Ссылки
[link1] https://www.pgpru.com/forum/kriptografija/prostojjpotokovyjjshifrszhatieheshav1simvol

[link2] https://www.pgpru.com/forum/kriptografija/potokovyjjshifrnaosnoveheshfunkciiicountermodeencryptionctr

[link3] https://simonhf.wordpress.com/2010/09/25/murmurhash160/

[link4] https://ru.wikipedia.org/wiki/TEA