YouTube
Promo
banner
Promo
banner

Хеширование в криптографии

Хотите узнать о хешировании в криптографии? Если да, то вы попали в нужное место.

В этой статье мы подробнее рассмотрим хеширование..

Хеширование – это метод информатики для идентификации объектов или значений из группы объектов или значений..

Звучит сбивающе с толку?

Попробуем понять на примере.

В колледжах и школах каждому студенту присваивается уникальный номер. Этот уникальный номер идентифицирует учащегося и связанную с ним информацию. Для создания уникального номера используется метод хеширования..

Другой популярный пример – библиотеки, где на полках вы найдете тонны книг. У каждой книги есть свой уникальный идентификационный номер, поэтому ее можно найти в огромной библиотеке.!

Современный пример хеширования – игроки, зарегистрировавшиеся в игре. Valorant – это бесплатная игра, запущенная Riot. Бесплатная игра означает, что в игру будут играть миллионы людей..

Каждый игрок идентифицируется с использованием уникального идентификационного значения, созданного с помощью алгоритма хеширования..

Хеширование в криптографии

Попробуем разобраться в этом подробнее ниже..

Что такое хеширование?

Как указано выше, хеширование – это метод идентификации объекта из группы..

Каждый объект после хеширования получает уникальный идентификационный номер..

Но что это означает технически?

Технически математическая функция генерирует выходные данные фиксированной длины из любой входной строки любой длины..

Биткойн-транзакции хешируются, и транзакции получают уникальные идентификаторы..

Если вы поставите «Hello, World!» в Алгоритм хеширования SHA-256, вы получите следующий результат:

Вход: Привет, мир!

Выход: dffd6021bb2bd5b0af676290809ec3a53191dd81c7f70a4b28688a362182986f

Здесь SHA256 генерирует вывод из заданного ввода. Как видите, мы использовали алгоритм хеширования Secure Hash Function (SHA-256). Это один из популярных методов хеширования, включая Message Direct (MD5) и Secure Hash Function (SHA1)..

Ключевые свойства хеш-функции делают ее надежной. Перечислим их ниже.

  • Детерминированный → Это означает, что выход будет одинаковым для данного входа в любых данных обстоятельствах..
  • Устойчивый к прообразу → Функция защиты от прообраза гарантирует, что хеш-значение не пригодно для генерации входного значения..
  • Вычислительно эффективный → Хеш-функции эффективны и не требуют огромных вычислительных ресурсов для выполнения.
  • Не может быть изменен → Хеш-функцию нельзя изменить..
  • Устойчивый к столкновениям → Устойчивость к столкновениям гарантирует, что никакие два входа не приводят к одинаковому результату.

Мы уже рассмотрели криптографическое хеширование для начинающих здесь. Проверьте это там: Криптографическое хеширование: руководство для начинающих..

Но если вы здесь ради продвинутых вещей, вы не будете разочарованы..

Что такое хеш-функция и хеш-таблицы? И как они работают?

В этом разделе мы более подробно рассмотрим хэш-функцию и хеш-таблицы. Что касается хеширования, существуют хеш-функции. Эти функции отвечают за преобразование больших входных данных в маленькие фиксированные входные данные. В хэш-таблицах хранятся выходные данные.

В процессе хеширования объекты распределяются в массив на основе их пар ключ / значение. Итак, если вы передадите массив элементов хеш-функциям, вы получите вывод массива, в котором к каждому из элементов теперь прикреплен ключ. Пара ключ / значение очень полезна, когда дело доходит до доступа к элементам в реальном времени, поскольку она предлагает впечатляющее время O (1).

Чтобы реализовать хэш-функции, вы можете отказаться от двух предпочтительных подходов..

  • Первый подход – использовать хеш-функцию для преобразования элемента в целое число. Затем целочисленный вывод можно использовать для доступа к элементу при помещении в хеш-таблицу..
  • Другой шаг – поместить элемент в хеш-таблицу, а затем получить его с помощью хешированного ключа..

Во втором способе функции будут такими, как показано ниже:

hash = hash_function (ключ) index = hash% array_size

Здесь размеры хеша и массива не зависят друг от друга. Значение индекса рассчитывается на основе размера массива. Оператор по модулю (%) позволяет нам вычислить значение.

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

Написание хорошей хеш-функции

Если вы хотите создать хорошую хеш-функцию или механизм, вам необходимо понимать основные требования к их созданию. Перечислим их ниже:

  • Хеш-функцию нужно легко вычислить. Это означает, что для выполнения не требуется много ресурсов..
  • Хеш-функция должна быть равномерно распределена. Таким образом, хеш-таблицы используются для хранения хеш-значений, поэтому кластеризация не происходит..
  • Последнее требование – иметь меньше столкновений или вообще не допускать их. Отсутствие коллизии означает, что ни один выход не отображается на два входа..

Технически коллизии являются частью хэш-функции, и их просто нельзя удалить из хеш-функции. Цель состоит в том, чтобы создать хеш-функцию, которая может предложить хорошую производительность хеш-таблицы и разрешить коллизии с помощью методов разрешения коллизий..

Зачем нам нужна хорошая хеш-функция?

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

Предположим, мы хотим создать хеш-таблицу, используя метод хеширования, где входные строки будут следующими: {«agk», «kag», «gak», «akg», «kga», «gka»}

Теперь мы создаем хеш-функцию, которая просто складывает значение ASCII a (97), g (103) и k (107), а затем делает сумму по модулю 307.

Ясно, что сумма трех чисел также равна 307. Это означает, что если мы переставим все числа, а затем выполним операцию по модулю, мы получим тот же результат. Конечным результатом будет сохранение всех строк под одним и тем же номером индекса. Алгоритмическое время для хеш-функции также будет иметь сложность O (n), что нежелательно. Легко сделать вывод, что описанная хеш-функция не оптимальна для реальных сценариев..

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

Изучение хеш-таблиц

Хеш-таблицы очень полезны для хранения результата хеш-функции, которая вычисляет индекс, а затем сохраняет значение для него. Конечным результатом будет более быстрый вычислительный процесс со сложностью O (1)..

Хеш-таблицы традиционно являются хорошим выбором при решении задач, требующих O (n) времени..

Итак, если вы выбираете строку фиксированной длины, а затем пытаетесь узнать частоту символов строки.

Итак, если string = «aacddce», то общий подход состоит в том, чтобы просмотреть строку несколько раз и сохранить каждую частоту..

# Предоставить входную строку и подсчитать частоту символов в этой строке

# Алгоритм имеет время сложности 0 (n)

temp_list = [] начало = "а" str = "ababcddefff" def alpha_zeta (): alpha = ‘a’ для i в диапазоне (0,26): temp_list.append (alpha) alpha = chr (ord (alpha) + 1) return temp_list temp_list = alpha_zeta () #print (temp_list) def character_frequency (str, temp_list): для каждого в temp_list: freq = 0 для i в str: if (i == each): freq = freq + 1 print (each, freq) character_frequency (str, temp_list)

Результат вышеупомянутой программы будет следующим:

а 2 б 2 в 1 г 2 е 1 е 3 г 0 ч 0 я 0 .. ..

Теперь давайте реализуем хеш-таблицу на C ++ и посчитаем частоту символов.

#include using namespace std; int Frequency [26]; int hashFunc (char c) {return (c – ‘а’); } void countFre (string S) {for (int i = 0; i< S.length (); ++ i) {int index = hashFunc (S [i]); Частота [индекс] ++; } Для (int i = 0; i<26; ++ i) {cout << (символ) (я + ‘а’) << ” << Частота [i]<< endl; }} Int main () {cout<<"Привет, мир"; countFre ("abbaccbdd"); }

Результат программы будет таким:

а 2 б 3 в 2 г 2

Сложность алгоритма O (N) делает его быстрее по сравнению с другими линейными подходами..

Как разрешать коллизии

Существуют уникальные способы решения коллизий в хэш-функциях. Один из популярных способов – раздельное связывание, также известное как открытое хеширование. Он реализован со связанным списком, где каждый из элементов в цепочке сам является связанным списком. Этот подход позволяет хранить элементы и гарантировать, что определенные элементы являются только частью определенного связанного списка, разрешая конфликты. Это означает, что никакие два входных значения не могут иметь одинаковое выходное хеш-значение..

Изучение хэша в Python

В этом разделе мы быстро рассмотрим хэш в Python. Причина, по которой мы выбираем Python, заключается в том, что он легко читается и может использоваться кем угодно без особых проблем..

Поскольку хеширование – это обычная функция, она уже реализована в библиотеке Python. Используя модуль, вы можете предоставить объект в качестве входных данных, а затем вернуть хешированное значение..

Синтаксис метода хеширования:

хэш (объект)

Как видите, он принимает единственный параметр, которым является объект. Объект может быть целым, плавающим или строковым..

Возвращаемое значение метода hash () зависит от ввода. Для целого числа он может возвращать одно и то же число, тогда как для десятичных и строковых значений будут разные.

Давайте посмотрим на несколько примеров ниже..

число = 10 децитов = 1,23556 str1 = "Nitish" print (hash (число)) print (hash (deci)) print (hash (str1))

Вывод приведенного выше кода выглядит следующим образом:

хеширование в криптографии

Однако хеширование не может применяться ко всем типам объектов. Например, если вы помните, что мы создали список от a до z в нашей первой программе. Если мы попытаемся его хэшировать, в окне вывода появится ошибка TypeError: unhashable type: ‘list’

хеширование в crpytography-python-ошибка

Чтобы применить хеширование к списку объектов, вам нужно использовать кортеж.

гласные = (‘a’, ‘e’, ​​’i’, ‘o’, ‘u’) print (hash (vowels)) Вывод ⇒ -5678652950122127926

Хеширование в криптографии

Хеширование полезно для криптографии. Биткойн использует хеширование для создания деревьев Меркла и управления ими

Кроме того, хеширование уже довольно давно является частью криптографии. Однако лучший вариант использования хеширования – это хеширование паролей и их хранение..

Деревья Меркла

Дерево Меркла – это структура данных, которая полезна, когда дело доходит до безопасной проверки данных в большом пуле данных. И Биткойн, и Эфириум используют деревья Меркла для решения многих технологических барьеров при хранении и доступе к данным в открытой сети..

Любая централизованная сеть не должна беспокоиться о хранении и доступе к данным, поскольку есть только один источник как для доступа, так и для хранения данных. Однако уравнение меняется при наличии децентрализованной сети, поскольку теперь данные необходимо копировать среди сотен участвующих одноранговых узлов..

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

пример дерева Меркла

Пример Дерева Меркла

Но почему мы обсуждаем здесь деревья Меркла? Деревья Меркла используют хэш в качестве основной функции для соединения различных узлов и блоков данных..

Деревья Меркла – это перевернутое дерево, которое может суммировать весь набор транзакций..

Если вы хотите узнать больше о деревьях Меркла и о том, как они используют хеширование в криптографии, ознакомьтесь с нашим подробным руководством: Руководство по деревьям Меркла. Там мы обсудили, как реализованы деревья Меркла в биткойнах и других сценариях использования..

Горный процесс

В процессе майнинга также используется хеширование. Когда дело доходит до майнинга биткойнов, новый блок добавляется в блокчейн, когда на него есть спрос..

Необходимо следовать методу добавления блока в цепочку блоков. При поступлении нового блока создается хеш-значение в зависимости от содержимого блока. Кроме того, если сгенерированный хэш превышает сложность сети, запускается процесс добавления блока в цепочку блоков..

После этого все одноранговые узлы в сети подтверждают добавление нового блока..

Но это бывает редко, поскольку сложность сети в большинстве случаев всегда выше по сравнению с сгенерированным хешем. Есть еще один аспект, который играет решающую роль в процессе майнинга. Это одноразовый.

Одноразовый номер добавляется к хешу блока и представляет собой произвольную строку. После этого объединенная строка сравнивается с уровнем сложности. Если уровень сложности ниже, чем составная строка, то одноразовый номер изменяется до тех пор, пока уровень сложности не станет выше..

Процесс можно кратко описать следующими этапами:

  • Содержимое хешируется для создания нового хеш-значения всякий раз, когда создается или берется новый блок.,
  • Новое значение nonce создается и добавляется к хешу.
  • Процесс хеширования происходит в новой строке с контактом.
  • Окончательное значение хэша затем сравнивается с уровнем сложности сети.
  • если окончательное значение хеш-функции ниже, чем одноразовый номер, процесс повторяется снова. Процесс останавливается только тогда, когда хеш-значение больше, чем одноразовый номер..
  • Блок присоединяется к цепочке, когда уровень сложности выше
  • Затем майнеры берут на себя ответственность за добычу нового блока и делятся наградами между собой..

Отсюда также происходит термин «скорость хеширования». Скорость хеширования – это скорость, с которой выполняются операции хеширования. Более высокая скорость хеширования означает, что майнерам потребуется больше вычислительной мощности для участия в процессе майнинга..

Вывод

Это подводит нас к концу нашего подробного руководства по хешированию в криптографии. Мы подробно рассмотрели хеширование, а также изучили его код..

И как тебе? Прокомментируйте ниже и дайте нам знать.

#ЧАСТО ЗАДАВАЕМЫЕ ВОПРОСЫ

Что такое хеширование в криптографии?

В криптографии хеширование – это метод преобразования данных в уникальную строку текста с использованием эффективного метода. Кроме того, нет ограничений на тип данных или их размер – хеширование работает со всеми из них..

Как хеширование используется в криптографии?

Криптография использует хеширование для хеширования паролей или создания уникальных идентификационных номеров..