Как и было обещано ранее в постах об обеспеченных криптоинструментах (см. предыдущие публикации), разбираемся, что же такое 'хеширование' простым русским языком и с чем его едят...
Термин 'хеширование' происходит от английского слова 'hashing', которое в свою очередь образовано от 'hash', буквально переводимого как 'рубить', 'крошить', 'путать', 'портить'.
На самом деле, хеширование - это довольно обширное понятие, имеющее множество не только значений, но и, как инструмент, - множество применений, в связи с чем и обсуждается, в основном, на уровне специалистов языками, практически не доступными для бытового уровня восприятия.. Для простого определения, для понимания сути вопроса оттолкнемся от коренного значения и приложим на криптоиндустрию.
На самом деле, итоговый код хеша выглядит, как раз, как фарш...в буквальном смысле этого слова и отталкиваясь от его внешнего вида по отношению к зашифрованному тексту.
Например, хеш-код может выглядеть так:
xkghpwnjhuygzxffkoyv
И, не смотря на то, что представленный набор буков является натуральной абракадаброй, реальный хеш, сложенный по уникальному алгоритму, будет абракадаброй только для того, кто не владеет ключом к его расшифровке.
По сути, хеширование - это некоторая определенная последовательность операций, осуществляемых на блоке информации того или иного размера, и преобразование её в уникальную последовательность некоторых символов некоторой длины; при этом, в процессе преобразования используется некий ключ, позволяющий при его конфиденциальности придавать выходной форме вид абракадабры, чем и заинтересовывать пользователей: при незнании ключа и алгоритма шифрования сохранять невозможность прочтения конфиденциальных данных
Но! Чтобы получить нечто рубленое, его сначала нужно разрубить.
Как пример, можно представить следующую последовательность действий:
1. Осуществляется 'рубка' на мелкие элементы некоторой последовательности символов, являющейся блоком информации, подлежащей шифрованию.
2. Каждый из этих символов прогоняется через некоторую функцию с заданным ключом, чем преобразуется в определенный набор не связанных между собой элементов последовательности. Количество таких последовательностей, или хеш-блоков, отражает количество символов в изначальном блоке информации.
3. Так как формат таких хеш-блоков одинаков (создаются по одинаковой функции - алгоритму действий), существует техническая возможность их обработать, например элементарно сложить или перемножить.
Попробуем вспомнить наши школьные забавы в части шифрования текстов через сложение
Берём алфавит, каждую букву нумеруем как и в предыдущем умножении, решаем, какое число будет нашим ключом.
Например, выбираем для ключа число 37.
В алгоритм шифрования прошиваем самую простую формулу: увеличение порядкового номера шифруемой буквы в алфавите на число ключа.
Полученные числовые значения делим на 33 буквы в алфавите и остаток преобразуем обратно в буквы.
Например, зашифруем по заданному выше алгоритму слово 'апельсин'.
Входящими данными будет следующее сочетание двузначных чисел, каждое из которых отражает порядковый номер соответствующей буквы в алфавите:
01.17.06.13.30.19.10.15
Увеличиваем каждое число на ключ 37:
38.54.43.50.67.56.47.52
Делим каждое число на 33 и находим остаток:
05.21.10.17.01.23.14.19
Переводим полученные числа в буквы алфавита (точки использовались для ясности изложения, теперь их исключаем):
дуипахмс
Вот такой хеш-код мы получили: 'дуипахмс'. Теперь, для расшифровки, корреспонденту нужно знать два критерия:
- ключ в число 37
- алгоритм шифрования: увеличение порядкового номера буквы в алфавите на заданный ключ
На самом деле, это самый простой вариант шифрования, так сказать 'школьный' подход. Безусловно, формулу алгоритма и сам ключ можно усложнять и усложнять..
Однако, в представленных примерах на выходе мы получаем хеш-коды по количеству символов равные изначально заданной информации. А современное хеширование пошло дальше и на выходе получает хеш-код с определенным количеством символов, например в 32 единицы, независимо от масштаба кодируемой информации.
У меня уже есть представления, как получаемый на выходе код преобразовать в шаблонный по количеству символов вид, но это исследование нужно провести отдельно, чем и займёмся в следующей части.
Об этом и о многом другом читайте на моем канале, не пропустите ничего интересного – подписывайтесь на канал CryptoBrain!
Ваш КриптоМозг