Вярвам, че мнозина знаят, че от 2007 г. насам Националният институт по стандарти и технологии на САЩ (NIST) провежда състезание за разработване на хеш алгоритъм, който да замени SHA-1 и семейство от SHA-2 алгоритми. Тази тема обаче по някаква причина е лишена от внимание на сайта. Това всъщност ме доведе при вас. Предлагам на вашето внимание поредица от статии за хеш алгоритмите. В този цикъл ще изучаваме заедно основите на хеш функциите, ще разгледаме най-известните хеш алгоритми, ще се потопим в атмосферата на състезанието SHA-3 и ще разгледаме алгоритмите, които претендират да го спечелят, определено ще ги тестваме. Също така, ако е възможно, ще бъдат взети предвид руските стандарти за хеширане.

За мен

Студент в катедра "Информационна сигурност".

Относно хеширането

В момента почти нито едно криптографско приложение не е пълно без използването на хеширане.
Хеш функциите са функции, предназначени да „компресират“ произволно съобщение или набор от данни, обикновено записани в двоичната азбука, в някаква комбинация от битове с фиксирана дължина, наречена конволюция. Хеш функциите имат разнообразни приложения в статистически експерименти, при тестване на логически устройства, при изграждане на алгоритми за бързо търсене и проверка на целостта на записите в бази данни. Основното изискване за хеш функциите е равномерността на разпределението на техните стойности с произволен избор на стойности на аргументи.
Криптографска хеш функция е всяка хеш функция, която е криптографски защитена, т.е. тя отговаря на редица изисквания, специфични за криптографските приложения. В криптографията хеш функциите се използват за решаване на следните проблеми:
- изграждане на системи за контрол на целостта на данните по време на тяхното предаване или съхранение,
- удостоверяване на източника на данни.

Хеш функция е всяка функция h: X -> Y, лесно изчислим и такъв, че за всяко съобщение Мзначение h(M) = H (конволюция)има фиксирана битова дължина. х- набор от всички съобщения, Y- набор от двоични вектори с фиксирана дължина.

По правило хеш функциите се изграждат на базата на така наречените едностъпкови свиващи функции y \u003d f (x 1, x 2)две променливи, където х 1, x2и г- двоични вектори на дължина м, ни нсъответно и не дължината на намотката, и м- дължина на блока на съобщението.
За да получите стойността h(M)съобщението първо се разбива на блокове с дължина м(в същото време, ако дължината на съобщението не е кратна на мтогава последният блок се допълва по някакъв специален начин към пълния), а след това към получените блокове M 1 , M 2 ,.., M Nприложете следната последователна процедура за изчисляване на конволюцията:

H o \u003d v,
H i = f(M i ,H i-1), i = 1,.., N,
h(M) = H N

Тук v- някаква константа, често се нарича инициализиращ вектор. Тя излиза
по различни причини и може да бъде секретна константа или набор от произволни данни (избор на дата и час, например).
С този подход свойствата на хеш функцията се определят напълно от свойствата на функцията за свиване в една стъпка.

Има два важни вида криптографски хеш функции - с ключ и без ключ. Ключовите хеш функции се наричат ​​кодове за удостоверяване на съобщения. Те позволяват да се гарантира без допълнителни средства както коректността на източника на данни, така и целостта на данните в системи с потребители, които имат взаимно доверие.
Хеш функциите без ключ се наричат ​​кодове за откриване на грешки. Те дават възможност с помощта на допълнителни средства (например криптиране) да се гарантира целостта на данните. Тези хеш функции могат да се използват в системи както с доверителни, така и с недоверчиви потребители.

Относно статистическите свойства и изисквания

Както казах, основното изискване за хеш функциите е равномерното разпределение на техните стойности с произволен избор на стойности на аргументи. За криптографските хеш функции също е важно, че при най-малката промяна в аргумента стойността на функцията се променя значително. Това се нарича ефект на лавината.

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

Първото изискване означава, че е много трудно да се съпостави съобщение с правилната стойност на сгъване. Второто е високата сложност на съвпадението за дадено съобщение с известна стойност на сгъване на друго съобщение с правилната стойност на сгъване.

Изискванията за функциите без ключ са:
- еднопосочен,
- устойчивост на сблъсъци,
- устойчивост на намиране на втория прототип.

Еднопосочността се разбира като висока сложност на намирането на съобщение чрез дадена стойност на навиване. Трябва да се отбележи, че на този моментне се използват хеш функции с доказана еднопосочна.
Устойчивостта на сблъсък се разбира като трудността при намиране на двойка съобщения с еднакви стойности на сгъване. Обикновено именно намирането на начин за конструиране на сблъсъци от криптоаналитиците служи като първи сигнал за остаряването на алгоритъма и необходимостта от бързата му подмяна.
Съпротивата срещу намирането на втория прообраз се разбира като трудността да се намери второ съобщение със същата стойност на сгъване за дадено съобщение с известна стойност на сгъване.

Това беше теоретичната част, която ще ни бъде полезна за в бъдеще...

Относно популярните хеш алгоритми

Алгоритми CRC16/32- контролна сума (не криптографско преобразуване).

Алгоритми MD2/4/5/6. Те са дело на Рон Ривест, един от авторите на алгоритъма RSA.
Алгоритъмът MD5 някога беше много популярен, но първите предпоставки за хакване се появиха в края на деветдесетте години и сега популярността му бързо намалява.
Алгоритъмът MD6 е много интересен алгоритъм от конструктивна гледна точка. Той беше номиниран за състезанието SHA-3, но, за съжаление, авторите не успяха да го доведат до стандарта и този алгоритъм не е в списъка на кандидатите, преминали на втория кръг.

Алгоритми на линийката SHAАлгоритми, които са широко използвани днес. Има активен преход от стандартите за версия SHA-1 към SHA-2. SHA-2 е общото име за алгоритмите SHA224, SHA256, SHA384 и SHA512. SHA224 и SHA384 са по същество аналози на SHA256 и SHA512, съответно, само след като се изчисли конволюцията, част от информацията в нея се изхвърля. Те трябва да се използват само за осигуряване на съвместимост с по-стари модели оборудване.

руски стандарт - ГОСТ 34.11-94.

В следващата статия

Преглед на MD алгоритмите (MD4, MD5, MD6).

Литература

А. П. Алферов, Основи на криптографията.

Брус Шнайер, Приложна криптография.

Хеширането е специален метод за адресиране на данни (някакъв алгоритъм за интервали) чрез техните уникални ключове ( ключ ) за бързо намиране на необходимата информация.

Основни понятия

Хеш таблица

Хеш таблицата е редовен масив със специален адрес, даден от някаква функция (хеш функция).

хеш функция

Функция, която преобразува ключа на елемент от данни в някакъв индекс в таблица ( хеш таблица), е наречен хеш функция или хеш функция :

аз = ч (ключ );

където ключ- конвертируем ключ, аз- резултатен индекс на таблица, т.е. ключът се показва в набор от, например, цели числа ( хеш адреси ), които по-късно се използват за достъп до данните.

Хеширането по този начин е техника, която включва използването на стойността на ключ за определяне на неговата позиция в специална таблица.

Функцията за разпространение обаче може няколко уникалните ключови стойности дават една и съща стойност на позицията аз в хеш таблицата. Ситуацията, при която два или повече ключа получават един и същ индекс (хеш адрес), се нарича сблъсък (сблъсък) при хеширане Следователно схемата за хеширане трябва да включва алгоритъм за разрешаване на конфликти , определяне на реда на действията, ако позицията аз=ч(ключ) вече е заета от запис с различен ключ.

Има много схеми за хеширане, които се различават по използваната хеш функция. ч(ключ) и алгоритми за разрешаване на конфликти.

Най-често срещаният метод за определяне на хеш функция е: метод на разделяне.

Началните данни са: - някакъв целочислен ключ ключи размер на масата м. Резултатът от тази функция е остатъкът от разделянето на този ключ на размера на таблицата. Общата форма на такава функция в езика за програмиране C/C++:

вътр ч (вътр ключ , вътр м ) {

За м= 10 хеш функцията връща най-малката цифра на ключа.

За m=100 хеш функцията връща двете най-малко значими цифри на ключа.

В разглежданите примери хеш функцията аз=ч(ключ) само дефинира позицията, от която да се търси (или първоначално да се постави в таблицата) записът с ключа ключ. След това трябва да използвате някакъв вид хешираща схема (алгоритъм).

Схеми за хеширане

В повечето проблеми два или повече ключа се хешират по един и същи начин, но не могат да заемат една и съща клетка в хеш-таблицата. Има два възможни варианти: или намерете различна позиция за новия ключ, или създайте отделен списък за всеки индекс на хеш-таблица, в който са поставени всички ключове, съпоставени с този индекс.

Тези варианти са двете класически схеми за хеширане:

    хеширане чрез отворено адресиране с линейно сондиране - линеен сонда отворен адресиране.

    верижно хеширане (със списъци), или така нареченото многомерно хеширане - верижно свързване с отделно списъци;

Отворен метод на адресиране с линейно сондиране . Първоначално всички клетки на хеш-таблицата, която е нормален едномерен масив, се маркират като незаети. Затова при добавяне на нов ключ се проверява дали дадената клетка е заета. Ако клетката е заета, тогава алгоритъмът търси в кръг, докато остане празно място („отворен адрес“).

Тези. елементи с хомогенни ключове се поставят близо до получения индекс.

В бъдеще, извършвайки търсене, първо намерете позицията по ключа азв таблицата и ако ключът не съвпада, тогава последващото търсене се извършва в съответствие с алгоритъма за разрешаване на конфликти, като се започне от позицията аз. .

Верижен метод е доминиращата стратегия . В такъв случай азполучен от избраната хеш функция ч(ключ)=аз, се третира като индекс в хеш таблица от списъци, т.е. първо ключ ключследващият запис се съпоставя с позиция аз = ч(ключ) таблици. Ако позицията е свободна, тогава елементът с ключа се поставя в нея. ключ, ако е зает, тогава се разработва алгоритъм за разрешаване на конфликти, в резултат на което такива ключове се поставят в списък, започващ от аз-тази клетка от хеш-таблицата. Например

В резултат на това имаме таблица от масив от свързани списъци или дървета.

Процесът на попълване (четене) на хеш таблица е прост, но достъпът до елементите изисква следните операции:

Изчисляване на индекса аз;

Търсете в съответната верига.

За да подобрите търсенето при добавяне на нов елемент, можете да използвате алгоритъма за вмъкване не в края на списъка, а с подреждане, т.е. добавете елемент към Правилно място.

Пример за прилагане на метода на директно адресиране с линейно сондиране . Първоначалните данни са 7 записа (за простота информационната част се състои само от целочислени данни) от декларирания структурен тип:

входен ключ; // Ключ

инфо; // Информация

(59,1), (70,3), (96,5), (81,7), (13,8), (41,2), (79,9); размер на хеш таблицата m=10.

хеш функция аз=ч(данни) =данни.ключ%десет; тези. остатък след деление на 10 - аз.

Въз основа на първоначалните данни последователно попълваме хеш-таблицата.

Хеширането на първите пет ключа дава различни индекси (хеш адреси):

Първата колизия възниква между клавиши 81 и 41 - мястото с индекс 1 е заето. Затова преглеждаме хеш-таблицата, за да намерим най-близкото свободно място, в този случай то е аз = 2.

Следващият ключ 79 също генерира сблъсък: позиция 9 вече е заета. Ефективността на алгоритъма рязко пада, т.к бяха необходими 6 опита (сравнения), за да се намери свободно място, индексът се оказа безплатен аз= 4.

Общият брой проби на този метод е от 1 до n-1 проби на елемент, където n е размерът на хеш-таблицата.

Прилагане на верижния метод за предишния пример. Ние декларираме структурен тип за елемент от списък (еднопосочен):

входен ключ; // Ключ

инфо; // Информация

zap*Напред; // Указател към следващ елементв списъка

Въз основа на първоначалните данни последователно попълваме хеш-таблицата чрез добавяне нов елементдо края на списъка, ако мястото вече е заето.

Хеширането на първите пет ключа, както в предишния случай, дава различни индекси (хеш адреси): 9, 0, 6, 1 и 3.

Когато възникне сблъсък, новият елемент се добавя в края на списъка. Следователно елементът с ключ 41 се поставя след елемента с ключ 81, а елементът с ключ 79 се поставя след елемента с ключ 59.

Индивидуални задачи

1. Двоични дървета.С помощта на програмата за генериране на произволни числа вземете 10 стойности от 1 до 99 и изградете двоично дърво.

Направете отклонение:

1.a Преминаване отляво надясно: ляво-коренно-дясно: посетете първо лявото поддърво, след това корена и накрая дясното поддърво.

(Или обратното, отдясно наляво: Right-Root-Left)

1.b Преминаване отгоре надолу: корен-ляво-дясно: посетете корена към поддърветата.

1.in Преминаване отдолу нагоре: ляво-дясно-корен: посетете корен след поддървета

В голямо разнообразие от индустрии информационни технологиинамерете техните приложения хеш функции. Те са предназначени, от една страна, да опростят значително обмена на данни между потребителите и обработката на файлове, използвани за определени цели, от друга страна, да оптимизират алгоритмите за осигуряване на контрол на достъпа до съответните ресурси. Хеш функцията е една от ключови инструментиосигуряване на парола за защита на данните, както и организиране на обмен на документи, подписани с EDS. Има голям брой стандарти, по които файловете могат да бъдат кеширани. Много от тях са разработени от руски специалисти. Какви са видовете хеш функции? Какви са основните механизми за тяхното практическо приложение?

Какво е?

Първо, нека проучим концепцията за хеш функция. Този термин обикновено се разбира като алгоритъм за преобразуване на определено количество информация в по-кратка последователност от знаци с помощта на математически методи. Практическото значение на хеш функцията може да се проследи в различни области. Така че те могат да се използват при проверка на файлове и програми за цялост. Също така криптографските хеш функции се използват в алгоритмите за криптиране.

Характеристики

Нека разгледаме основните характеристики на изследваните алгоритми. Сред тези:

  • наличието на вътрешни алгоритми за преобразуване на данни от оригиналната дължина в по-къса последователност от знаци;
  • отвореност за криптографска проверка;
  • наличието на алгоритми, които ви позволяват сигурно да криптирате оригиналните данни;
  • адаптивност към дешифриране с помощта на малки изчислителна мощност.

Други важни свойства на хеш функцията включват:

  • възможност за обработка на начални масиви от данни с произволна дължина;
  • генерира хеширани блокове с фиксирана дължина;
  • разпределете равномерно стойностите на функцията на изхода.

Разглежданите алгоритми също предполагат чувствителност към входните данни на ниво 1 бит. Тоест, дори ако, относително казано, се промени поне 1 буква в изходния документ, хеш функцията ще изглежда различно.

Изисквания към хеш функциите

Съществуват редица изисквания за хеш функциите, предназначени за практическа употреба в определена област. Първо, съответният алгоритъм трябва да бъде чувствителен към промените във вътрешната структура на хешираните документи. Тоест хеш функцията трябва да се разпознава, когато става дума за текстов файл, пермутация на абзац, сричкопренасяне. От една страна, съдържанието на документа не се променя, от друга страна, неговата структура се коригира и този процес трябва да бъде разпознат по време на хеширането. Второ, разглежданият алгоритъм трябва да трансформира данните по такъв начин, че обратната операция (превръщане на хеша в оригиналния документ) да е невъзможна на практика. Трето, хеш функцията трябва да включва използването на такива алгоритми, които практически изключват възможността за формиране на една и съща последователност от знаци под формата на хеш, с други думи, появата на така наречените колизии. Ще разгледаме тяхната същност малко по-късно.

Отбелязаните изисквания, на които трябва да отговаря алгоритъмът на хеш функцията, могат да бъдат постигнати главно чрез използването на сложни математически подходи.

Структура

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

В каква структура може да бъде представена хеш функция, използвана за такива цели? Пример за неговата компилация може да бъде следният: H (хеш, т.е. хеш) = f (T (текст), H1), където H1 е алгоритъмът за обработка на текст T. Тази функцияхешира T по такъв начин, че без познаване на H1 ще бъде практически невъзможно да го отворите като пълноправен файл.

Използване на хеш функции на практика: Изтегляне на файлове

Нека сега да проучим по-подробно възможностите за използване на хеш функции на практика. Използването на подходящи алгоритми може да се използва при писане на скриптове за изтегляне на файлове от интернет сървъри.

В повечето случаи за всеки файл се определя определена контролна сума - това е хешът. Трябва да е същото за обект, разположен на сървъра и изтеглен на компютъра на потребителя. Ако това не е така, тогава файлът може да не се отвори или да стартира неправилно.

Хеш функция и цифров подпис

Използването на хеш функции е обичайно при организиране на обмена на документи, съдържащи цифров подпис. В този случай подписаният файл се хешира, така че неговият получател да може да провери дали е истински. Въпреки че хеш функцията не е официално включена в структурата електронен ключ, може да се фиксира във флаш паметта на хардуера, с който се подписват документите, като например eToken.

Електронният подпис е криптиране на файл с помощта на публичен и частен ключ. Тоест съобщение, криптирано с частния ключ, се прикачва към изходния файл и цифровият подпис се проверява с помощта на публичен ключ. Ако хеш функцията на двата документа съвпада, файлът на получателя се разпознава като автентичен и подписът на изпращача се разпознава като правилен.

Хеширането, както отбелязахме по-горе, не е директно компонент на EDS, но ви позволява много ефективно да оптимизирате алгоритмите за използване електронен подпис. Така че само хешът може да бъде криптиран, а не самият документ. В резултат на това скоростта на обработка на файлове се увеличава значително, като в същото време става възможно да се осигурят по-ефективни механизми за защита на EDS, тъй като акцентът в изчислителните операции в този случай ще бъде поставен не върху обработката на първоначалните данни, а върху осигуряването на криптографска сила на подписа. Хеш функцията също така прави възможно подписването на различни типове данни, а не само текст.

Проверка на пароли

Друга възможна област на приложение за хеширане е организирането на алгоритми за проверка на парола, създадени за разграничаване на достъпа до определени файлови ресурси. Как някои видове хеш функции могат да бъдат включени в решаването на такива проблеми? Много просто.

Факт е, че на повечето сървъри, достъпът до които подлежи на диференциация, паролите се съхраняват под формата на хеширани стойности. Това е съвсем логично – ако паролите бяха представени в оригиналния си текстов вид, хакерите, получили достъп до тях, биха могли лесно да прочетат секретните данни. На свой ред, въз основа на хеша, не е лесно да се изчисли паролата.

Как се проверява достъпът на потребителите, когато се използват разглежданите алгоритми? Паролата, въведена от потребителя, се проверява спрямо това, което е фиксирано в хеш функция, която се съхранява на сървъра. Ако стойностите на текстовите блокове съвпадат, потребителят получава необходимия достъп до ресурси.

Най-простата хеш функция може да се използва като инструмент за проверка на пароли. Но на практика ИТ специалистите най-често използват сложни многоетапни криптографски алгоритми. Обикновено те се допълват от използването на стандарти за предаване на данни със защитени канали, така че хакерите да не могат да открият или разберат паролата, предадена от компютъра на потребителя към сървърите, преди да бъде проверена спрямо хешираните текстови блокове.

Сблъсъци на хеш функции

В теорията на хеш функциите е предвидено такова явление като сблъсък. Каква е неговата същност? Хеш сблъсък е ситуация, при която два различни файла имат един и същ хеш код. Това е възможно, ако дължината на целевата последователност от знаци е малка. В този случай вероятността за хеш съвпадение ще бъде по-висока.

За да се избегне сблъсък, се препоръчва по-специално да се използва двоен алгоритъм, наречен "хеширане на хеш функция". Това включва формирането на отворен и затворен код. Много програмисти при решаването на критични проблеми препоръчват да не се използват хеш функции в случаите, когато това не е необходимо, и винаги тествайте съответните алгоритми за най-добра съвместимост с определени ключове.

История на появата

Основателите на теорията на хеш функциите могат да се считат за изследователите Картър, Вегман, Саймънсън, Бирброуер. В първите версии съответните алгоритми бяха използвани като инструменти за генериране на уникални изображения на последователности от символи с произволна дължина с последваща цел тяхната идентификация и проверка за автентичност. От своя страна, хешът, в съответствие с посочените критерии, трябва да има дължина от 30-512 бита. Като специален полезно свойствоподходящи функции, беше разгледана неговата пригодност за използване като ресурс за бързо търсене на файлове или тяхното сортиране.

Популярни стандарти за хеширане

Нека сега разгледаме в какви популярни стандарти хеш функциите могат да бъдат представени. Един от тях е CRC. Този алгоритъм е цикличен код, наричана още контролна сума. Този стандарт се характеризира с простота и в същото време гъвкавост - чрез него можете да хеширате най-широк набор от данни. CRC е един от най-разпространените некриптографски алгоритми.

От своя страна стандартите MD4 и MD5 се използват широко в криптирането. Друг популярен криптографски алгоритъм е SHA-1. По-специално, той се характеризира с хеш размер от 160 бита, който е по-голям от този на MD5 - този стандарт поддържа 128 бита. Има руски стандарти, които регулират използването на хеш функции - GOST R 34.11-94, както и GOST R 34.11-2012, който го замени. Може да се отбележи, че хеш-стойността, предоставена от алгоритмите, приети в Руската федерация, е 256 бита.

Въпросните стандарти могат да бъдат класифицирани по различни начини. Например има такива, които използват блокови и специализирани алгоритми. Простотата на изчисленията, базирани на стандартите от първия тип, често е придружена от тяхната ниска скорост. Следователно, като алтернатива на блоковите алгоритми, могат да се използват тези, които включват по-малко количество необходими изчислителни операции. Обичайно е да се говори за високоскоростни стандарти, по-специално за гореспоменатите MD4, MD5 и SHA. Нека разгледаме по-подробно спецификата на специалните алгоритми за хеширане на примера на SHA.

Характеристики на алгоритъма SHA

Използването на хеш функции, базирани на стандарта SHA, най-често се извършва в областта на разработването на инструменти цифров подпис DSA документи. Както отбелязахме по-горе, SHA алгоритъмподдържа хеш от 160 бита (осигурявайки така нареченото "дайджест" на поредица от знаци). Първоначално разглежданият стандарт разделя масива от данни на блокове от 512 бита. Ако е необходимо, ако дължината на последния блок не достигне зададената цифра, файловата структура се допълва с 1 и необходимия брой нули. Също така в края на съответния блок се въвежда код, който фиксира дължината на съобщението. Разглежданият алгоритъм включва 80 логически функции, чрез които се обработват 3 думи, представени в 32 бита. Стандартът SHA също така предвижда използването на 4 константи.

Сравнение на хеширащи алгоритми

Нека да проучим как корелират свойствата на хеш функциите, свързани с различни стандарти, като използваме примера за сравняване на характеристиките на руския стандарт GOST R 34.11-94 и американския SHA, който обсъдихме по-горе. На първо място, трябва да се отбележи, че алгоритъмът, разработен в Руската федерация, включва изпълнението на 4 операции за криптиране на 1 цикъл. Това съответства на 128 рунда. От своя страна, по време на 1 кръг, когато се използва SHA, се очаква да се изчислят около 20 команди, докато кръговете са общо 80. Така използването на SHA позволява обработка на 512 бита първоначални данни в рамките на 1 цикъл. Докато руският стандарт е способен да извършва операции в цикъл от 256 бита данни.

Специфика на най-новия руски алгоритъм

По-горе отбелязахме, че стандартът GOST R 34.11-94 е заменен с по-нов - GOST R 34.11-2012 Stribog. Нека разгледаме неговите специфики по-подробно.

През този стандартмогат да бъдат реализирани, както в случая с алгоритмите, обсъдени по-горе, криптографски хеш функции. Може да се отбележи, че най-новият руски стандарт поддържа блок от входни данни в размер на 512 бита. Основните предимства на GOST R 34.11-2012:

  • високо ниво на защита срещу кракване на шифри;
  • надеждност, подкрепена от използването на доказани дизайни;
  • бързо изчисляване на хеш функцията, липсата на трансформации в алгоритъма, които усложняват конструкцията на функцията и забавят изчислението.

Отбелязани предимства на новия руски стандарт криптографско криптираневи позволяват да го използвате в организацията на работния процес, който отговаря на най-строгите критерии, които са предписани в разпоредбите на регулаторното законодателство.

Специфика на криптографските хеш функции

Нека разгледаме по-подробно как видовете алгоритми, които изучаваме, могат да бъдат използвани в областта на криптографията. Основното изискване за съответните функции е устойчивост на сблъсъци, което споменахме по-горе. Тоест дублираните хеш стойности не трябва да се генерират, ако тези стойности вече присъстват в структурата на съседния алгоритъм. Другите критерии, посочени по-горе, също трябва да бъдат изпълнени от криптографските функции. Ясно е, че винаги има някаква теоретична възможност за възстановяване изходен файлвъз основа на хеш, особено ако има наличен мощен изчислителен инструмент. Този сценарий обаче трябва да бъде сведен до минимум благодарение на силните алгоритми за криптиране. По този начин ще бъде много трудно да се изчисли хеш функция, ако нейната изчислителна сила съответства на формулата 2^(n/2).

Друг важен критерий за криптографски алгоритъм е промяната в хеша в случай, че първоначалният масив от данни е коригиран. По-горе отбелязахме, че стандартите за криптиране трябва да имат чувствителност на ниво от 1 бит. По този начин това свойство е ключов фактор за осигуряване на надеждна защита с парола за достъп до файлове.

Итеративни схеми

Нека сега проучим как могат да бъдат изградени криптографски хеширащи алгоритми. Сред най-често срещаните схеми за решаване на този проблем е използването на итеративен последователен модел. Тя се основава на използването на така наречената функция на свиване, при която броят на входните битове е значително по-голям от тези, които са фиксирани на изхода.

Разбира се, функцията за компресиране трябва да отговаря на необходимите критерии за криптографска сила. В интерактивната схема първата операция за обработка на входния поток от данни се разделя на блокове, чийто размер се изчислява в битове. Съответният алгоритъм също използва временни променливи с даден брой битове. Като първа стойност се използва добре известно число, докато следващите блокове от данни се комбинират със стойността на въпросната функция на изхода. Хеш-стойността става битов изход за последната итерация, която взема предвид целия входен поток, включително първата стойност. Осигурен е така нареченият "лавинен ефект" на хеширането.

Основната трудност, която характеризира хеширането, реализирано като итеративна схема, е, че хеш функциите понякога са трудни за конструиране, ако входният поток не е идентичен с размера на блока, на който е разделен първоначалният масив от данни. Но в този случай в стандарта за хеширане могат да бъдат записани алгоритми, с помощта на които оригиналният поток може да бъде разширен по един или друг начин.

В някои случаи в процеса на обработка на данни в рамките на итеративна схема могат да бъдат включени така наречените многопроходни алгоритми. Те предполагат формирането на още по-интензивен "лавинен ефект". Такъв сценарий включва формирането на повтарящи се масиви от данни и едва на второ място е разширяването.

Алгоритъм за блокиране

Функцията за компресиране може също да се основава на блоков алгоритъм, чрез който се извършва криптиране. Така че, за да повишите нивото на сигурност, можете да използвате блокове от данни, които са обект на хеширане в текущата итерация, като ключ, и резултата от операциите, получени по време на изпълнението на функцията за компресиране преди това, като вход . В резултат на това последната итерация ще предостави изхода на алгоритъма. Сигурността на хеша ще корелира със стабилността на използвания алгоритъм.

Въпреки това, както отбелязахме по-горе, имайки предвид различни видовехеш функциите, блоковите алгоритми често са придружени от необходимостта от използване на голяма изчислителна мощност. Ако те не са налични, скоростта на обработка на файла може да не е достатъчна за решаване на практически проблеми, свързани с използването на хеш функции. В същото време необходимата криптографска сила може да се реализира и с малък брой операции с потоци от изходни данни, по-специално алгоритмите, които разгледахме - MD5, SHA и руските стандарти за криптографско криптиране - са адаптирани за решаване на такива проблеми.

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

Защо е необходимо това?Анализът на хеш функцията често се използва за проверка на целостта на важни файлове операционна система, важни програми, важни данни. Мониторингът може да се извършва както при необходимост, така и редовно.

Как се прави?Първо, определете целостта на кои файлове трябва да се контролират. За всеки файл стойността на неговия хеш се изчислява по специален алгоритъм и резултатът се запазва. След необходимото време се прави подобно изчисление и се сравняват резултатите. Ако стойностите са различни, тогава информацията, съдържаща се във файла, е променена.

Какви характеристики трябва да има една хеш функция?

  • трябва да може да извършва трансформации на данни с произволна дължина във фиксирана;
  • трябва да има отворен алгоритъм, така че неговата криптографска сила да може да бъде изследвана;
  • трябва да е едностранчив, т.е. да не съществува математическа възможност за определяне на първоначалните данни от резултата;
  • трябва да "устоява" на сблъсъци, тоест не трябва да произвежда едни и същи стойности за различни входни данни;
  • не трябва да изисква големи изчислителни ресурси;
  • при най-малката промяна на входните данни резултатът трябва да се промени значително.

Кои са популярните алгоритми за хеширане?В момента се използват следните хеш функции:

  • CRC означава цикличен редундантен код или контролна сума. Алгоритъмът е много прост, има голям брой вариации в зависимост от необходимата дължина на изхода. Не е криптографски!
  • MD 5 е много популярен алгоритъм. Като него предишна версия MD 4 е криптографска функция. Размерът на хеша е 128 бита.
  • SHA -1 също е много популярна криптографска функция. Размерът на хеша е 160 бита.
  • GOST R 34.11-94 е руски криптографски стандарт за изчисляване на хеш функция. Размерът на хеша е 256 бита.

Кога системният администратор може да използва тези алгоритми?Често при изтегляне на каквото и да е съдържание, като например програми от уебсайта на производителя, музика, филми или друга информация, има стойност на контролна сума, изчислена по определен алгоритъм. От съображения за сигурност, след изтегляне, трябва самостоятелно да изчислите хеш функцията и да сравните стойността с това, което е посочено на сайта или в прикачения файл към файла. Правили ли сте някога това?

Какво е по-удобно за изчисляване на хеша?Сега има голям брой такива помощни програми, както платени, така и безплатни за използване. Аз лично харесах HashTab. Първо, по време на инсталацията, помощната програма е вградена като раздел в свойствата на файла, второ, тя ви позволява да изберете голям брой алгоритми за хеширане, и трето, тя е безплатна за лична некомерсиална употреба.

Какво е руски?Както бе споменато по-горе, в Русия има стандарт за хеширане GOST R 34.11-94, който се използва широко от много производители на инструменти за информационна сигурност. Един от тези инструменти е програмата за фиксиране и контрол. Първоначално състояние софтуерен пакет„КОРЕКЦИЯ“. Тази програма е средство за наблюдение на ефективността на използването на средствата за информационна сигурност.

FIX (версия 2.0.1) за Windows 9x/NT/2000/XP

  • Изчисляване на контролни суми на дадени файлове с помощта на един от 5 внедрени алгоритма.
  • Фиксиране и последващ контрол на първоначалното състояние на софтуерния пакет.
  • Сравнение на версии на софтуерни пакети.
  • Коригиране и контролиране на директории.
  • Контрол на промените в определени файлове (директории).
  • Генериране на отчети във формати TXT, HTML, SV.
  • Продуктът притежава FSTEC сертификат съгласно NDV 3 № 913 до 01 юни 2013 г.

А какво ще кажете за ECP?Резултатът от изчисляването на хеш функцията, заедно със секретния ключ на потребителя, влизат на входа на криптографския алгоритъм, където се изчислява цифровият подпис. Строго погледнато, хеш функцията не е част от алгоритъма на EDS, но често това се прави нарочно, за да се изключи атака с публичен ключ.

В днешно време много приложения за електронна търговия ви позволяват да съхранявате Тайният ключпотребител в частната зона на токена (ruToken, eToken) без техническа осъществимостизвличайки го от там. Самият токен има много ограничена област на паметта, измерена в килобайти. За да подпишете документ, няма начин да прехвърлите документа в самия токен, но е много лесно да прехвърлите хеша на документа в токена и да получите EDS на изхода.

Хеш таблици

Хеш таблица(разбъркана таблица, таблица с изчислени адреси) е операции за поддържане на динамичен набордобавяне, търсене и изтриване на елемент и използване на специални методи адресиране.

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

Идеята за внедряване на хеш е, че работата с един голям масив се свежда до работа с няколко малки комплекта.

Например бележник. Страниците на книгата са маркирани с букви. Страница, маркирана с буква, съдържа фамилни имена, започващи с тази буква. Голям набор от фамилни имена е разделен на 28 подгрупи. При търсене книгата веднага се отваря на желаната буква и търсенето се ускорява.

В програмирането хеш таблица- това е структураданни, които съхраняват двойки (ключ или индекс + стойност) и с които се извършват три операции: добавяне на нова двойка, търсене и изтриване на двойка по ключ.

Търсене в хеш таблициизвършва на два етапа:

първиятстъпка - изчисляване на хеш функция, която преобразува ключтърсене в електронна таблица адрес:

второстъпка е процесът на разрешаване на конфликти при обработката на такива ключове.

Ако различни стойностихеш функцията за ключове на таблицата генерира същотоадреси, се казва, че възниква сблъсък(конфликт, сблъсък).

Хеш функции

Основната цел на хеш функцията е да съвпада с различни ключовеако е възможно различнине е отрицателен цялочисла.

Функция за хеширане на теми По-добре, как по-малко идентиченгенерира стойности.

Хеш функцията трябва да бъде избрана по такъв начин, че да са изпълнени следните свойства:

    хеш функцията е дефинирана върху елементите на множеството и взема цяло число неотрицателностойности;

    хеш функция лесен за изчисляване;

    хеш функцията може да отнеме различнистойности от около еднакво вероятно(минимизиране на сблъсъци);

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

За да създадете добра хеш функция, трябва да знаете разпределението на ключовете. Ако разпределението на ключовете е известно, тогава в идеалния случай плътността на ключовете и разпределението на плътността на хеш стойността трябва да са идентични.

Позволявам стр ( ключ ) - плътност на разпространение на ключови заявки. Тогава, в идеалния случай, плътността на разпространение на заявките за въвеждане на таблица е ж ( з ( ключ )) да бъде такъв, че средно броят на елементите кат. беше необходимо да се премине във вериги от близнаци, беше минимално.

Пример.

Нека има набор ключове

{0, 1, 4, 5, 6, 7, 8, 9, 15, 20, 30, 40}

и нека масата позволява 4 вход.

Можете да създадете хеш функция:

ч(ключ) = ключ % 4 .

Тогава получавате следното адресиза входове

{0, 1, 2, 3} маси:

ч(ключ)

Входящ номер

Максимална дължина на веригата

% хитове

3 0,5+1,5 0,25+0,5 0,08+1 0,17 ≈ 2,1списък елемент.

Примерс различна хеш функция.

ч(ключ)

Входящ номер

% хитове

Средно ще отнеме 4 1,5 0,25 = 1,5списък елемент.

Ако това е система за извличане на информация, тогава нейната производителност при търсене ще се увеличи с около 25%.

Методи за конструиране на хеш функции

Модулно хеширане

Прост, ефективен и често използван метод за хеширане.

Размерът на таблицата е избран като просточисла ми хеш функцията се изчислява като остатък от делението:

ч(ключ) = ключ % м

ключ– цяло числова стойност на ключа,

м- брой хеш стойности (записи в хеш таблица).

Такава функция се нарича модулени промени от 0 преди ( м - 1 ).

Модулна хеш функция в C++:

typedefвътрHashIndexType;

HashIndexTypeхеш(вътрключ)

{ връщанеключ % м; }

Пример

ключ = {1, 3, 56, 4, 32, 40, 23, 7, 41,13, 6,7}

Позволявам м = 5

ч(ключ) = {1, 3, 1, 4, 2, 0, 3, 2, 1, 3, 1, 2}

Изборът има значение м.За да получите произволно разпределение на ключовете, трябва да вземете простономер.

Мултипликативен метод

Хеш функция:

h(клавиш) =

0 < А < 1 е константа.

12 мод5 = 2 (остатък след разделянето на 12 на 5).

5,04 mod1= 0,04 (откроявадробна част)

Пример

ключ = 123456

м = 10000

А = 0,6180339887499 = 0,618…

ч(ключ) = =

адитивен метод

Използва се за линиипроменлива дължина (размер на масата ме равно на 256).

{ HashIndexType h = 0;

докато (*str)

h += (*str)++;

връщанеч;

Недостатъкът на адитивния метод е, че не се разграничават сходни думи и анаграми, т.е. ч(XY ) = ч(YX )

адитивен метод, където ключът е символен низ. В хеш функция низът се преобразува в цяло число чрез сумиране на всички знаци и връщане на остатъка след разделяне на м (обикновено размер на маса м = 256).int h(char *key, int m) (int s = 0;while(*key)s += *key++;return s % m;) абви такси.Този метод може да бъде леко модифициран, като резултатът се получава чрез сумиране само на първия и последния символ на ключовия низ. int h(char *key, int m) (int len ​​​​= strlen(key), s = 0;if (лен< 2) // Если длина ключа равна 0 или 1,s = key; // возвратить keyelse s = key + key;return s % m;}В этом случае коллизии будут возникать только в строках, например, абви amc.

хеш функцията взема ключа и изчислява от него адреса в таблицата (адресът може да бъде индекс в масива, към който са прикрепени веригите), тоест може например да получи числото 3 от низа "abcd ", а от низа "efgh" може да получи числото 7 и тогава първата структура от веригата се взема чрез хеш или чрез хеш търсенето продължава по веригата, докато се намери "abcd" във веригата от структури от хеш , или "efgh" се намира във веригата от структури от хеш, когато структурата с "abcd "се намери, останалите данни се вземат и връщат, или всички се връщат като цяло (адреса му), така че вие може да вземе останалите данни от него и веригата от структури се създава, защото много различни ключове, имат един и същ адрес в таблицата, т.е. например хеш функцията за "abcd" може да върне 3 и за "zxf9" също може да върне 3, така че те са свързани във верига, която виси на третия индекс на масив ... ...

Масивът H съхранява самите двойки ключ-стойност. Алгоритъмът за вмъкване на елемент проверява клетките от масива H в определен ред, докато се намери първата свободна клетка, в която ще бъде записан новият елемент.

Алгоритъмът за търсене претърсва клетките на хеш-таблицата в същия ред, както при вмъкване, докато не бъде намерен елемент с желания ключ или свободна клетка (което означава, че няма елемент в хеш-таблицата).

XOR

Използва се за низове с променлива дължина. Методът е подобен на адитивния метод, но разграничава подобни думи. Състои се в това, че операцията "изключително ИЛИ" се прилага последователно към елементите на низа

typedef unsigned char HashIndexType;

неподписан символ Rand8;

HashIndexType Hash(char *str)

( unsigned char h = 0;

докато (*str) h = Rand8;

връщанеч; }

Тук Ранд8 – таблица от 256 осембитови произволни числа.

размер на масата<= 65536

typedef unsigned short int HashIndexType;

неподписан символ Rand8;

HashIndexType Hash(char *str)

( HashIndexType h; неподписан char h1, h2;

if (*str == 0) върне 0;

h1 = *str; h2 = *str + 1; str++;

докато (*str)

(h1 = Rand8; h2 = Rand8;

str++; )

h = ((HashIndexType)h1<< 8) | (HashIndexType)h2;

връща h % HashTableSize )

Универсален хеширане

Подразбира случаенизбор на хеш функция от някакъв набор по време изпълнениепрограми.

Ако в мултипликативния метод да се използва като НОподпоследователност случаенстойности вместо фиксирано число, получавате универсална хеш функция.

Времето за генериране на случайни числа обаче също ще бъде голям.

Може да се използва псевдослучаенчисла.

// генератор на псевдослучайни числа

typedefвътрHashIndexType;

HashIndexTypeХеш (char*v, intm)

( int h, a = 31415, b = 27183;

за (h = 0;*v != 0; v++, a = a*b % (m - l))

h = (a*h + *v) % m;

връщане (h< 0) ? (h + m) : h;