Немного практической криптографии под .net для чайников

Содержание:

Введение

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

Уверен, все, кто читают эту статью, хотя бы раз использовали двухфакторную аутентификацию (далее — 2FA, уж больное длинное словосочетание) в своей жизни. Сегодня я приглашаю вас разобраться, как устроена эта технология, ежедневно защищающая бесчисленное количество аккаунтов.

Но для начала, можете взглянуть на демо того, чем мы сегодня займемся.

Сравнение SHA-1 с другими алгоритмами

Сравнение с MD5

И MD5, и SHA-1 являются, по сути, улучшенными продолжениями MD4.

Сходства:

  1. Четыре этапа.
  2. Каждое действие прибавляется к ранее полученному результату.
  3. Размер блока обработки, равный 512 бит.
  4. Оба алгоритма выполняют сложение по модулю 232, они рассчитаны на 32-битную архитектуру.

Различия:

  1. В SHA-1 на четвёртом этапе используется та же функция f, что и на втором этапе.
  2. В MD5 в каждом действии используется уникальная прибавляемая константа. В SHA-1 константы используются повторно для каждой из четырёх групп.
  3. В SHA-1 добавлена пятая переменная.
  4. SHA-1 использует циклический код исправления ошибок.
  5. В MD5 четыре сдвига, используемые на каждом этапе, отличаются от значений, используемых на предыдущих этапах. В SHA на каждом этапе используется постоянное значение сдвига.
  6. В MD5 четыре различных элементарных логических функции, в SHA-1 — три.
  7. В MD5 длина дайджеста составляет 128 бит, в SHA-1 — 160 бит.
  8. SHA-1 содержит больше раундов (80 вместо 64) и выполняется на 160-битном буфере по сравнению со 128-битным буфером MD5. Таким образом, SHA-1 должен выполняться приблизительно на 25 % медленнее, чем MD5 на той же аппаратуре.

Брюс Шнайер делает следующий вывод : «SHA-1 — это MD4 с добавлением расширяющего преобразования, дополнительного этапа и улучшенным лавинным эффектом. MD5 — это MD4 с улучшенным битовым хешированием, дополнительным этапом и улучшенным лавинным эффектом.»

Сравнение с ГОСТ Р 34.11-94

Ряд отличительных особенностей ГОСТ Р 34.11-94:

  1. При обработке блоков используются преобразования по алгоритму ГОСТ 28147—89;
  2. Обрабатывается блок длиной 256 бит, и выходное значение тоже имеет длину 256 бит.
  3. Применены меры борьбы против поиска коллизий, основанном на неполноте последнего блока.
  4. Обработка блоков происходит по алгоритму шифрования ГОСТ 28147—89, который содержит преобразования на S-блоках, что существенно осложняет применение метода дифференциального криптоанализа к поиску коллизий алгоритма ГОСТ Р 34.11-94. Это существенный плюс по сравнению с SHA-1.
  5. Теоретическая криптостойкость ГОСТ Р 34.11-94 равна 2128, что во много раз превосходит 280для SHA-1.

Сравнение с другими SHA

В таблице, «промежуточный размер хеша» означает «размер внутренней хеш-суммы» после каждой итерации.

Вариации алгоритма Размер выходного хеша (бит) Промежуточный размер хеша (бит) Размер блока (бит) Максимальная длина входного сообщения (бит) Размер слова (бит) Количество раундов Используемые операции Найденные коллизии
SHA-0 160 160 512 264 − 1 32 80 +,and, or, xor, rotl Есть
SHA-1 160 160 512 264 − 1 32 80 +,and, or, xor, rotl 252 операций
SHA-2 SHA-256/224 256/224 256 512 264 − 1 32 64 +,and, or, xor, shr, rotr Нет
SHA-512/384 512/384 512 1024 2128 − 1 64 80 +,and, or, xor, shr, rotr Нет

Что такое контрольная сумма

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

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

Также нужно упомянуть, что контрольную сумму нельзя использовать для получения исходных данных. То есть нельзя «расшифровать» хеш-сумму и получить данные которые были хешированы, хеш-сумму можно только сравнить с другой хеш-суммой. Это особенность открывает дополнительные возможности. Например, хеш-суммы используются для хранения паролей. Когда вы регистрируетесь на каком-то сайте и вводите свой пароль, то он не хранится на сервере в открытом виде. Вместо этого хранится только его контрольная сумма. А когда вы входите в свой аккаунт с использованием пароля, система получается ваш пароль, высчитывает его хеш-сумму и сравнивает с хеш-суммой, которая хранится на сервере. Если хеш-суммы совпали, значит пароль верный и вы можете войти в аккаунт, если хеш-суммы не совпадают, значит пароль не верный и вас перенаправляют на страницу для восстановления пароля.

Для высчитывания контрольной суммы существует множество различных алгоритмов или так называемых хеш-функций. Самыми известными и популярными алгоритмы являются: CRC32, MD5, SHA-1 и SHA-2. Но, есть и множество других алгоритмов, некоторые из которых имеют широкое применения, а некоторые используются только для специфических задач. При этом часть существующих алгоритмов признаны устаревшими или уязвимыми и больше не используются. Так, алгоритм MD5 практически полностью перестал использоваться поскольку выяснилось, что он может выдавать одинаковые значения для разных входных значений.

Для примера продемонстрируем, как выглядит контрольная сумма на практике. Например, возьмем строку «Hello, world!» и высчитаем ее контрольную сумму с использованием нескольких популярных алгоритмов.

Алгоритм Значение
Adler32 205e048a
CRC32 ebe6c6e6
Haval 5711dea10d85b988fcb1eed99ce7310c
MD2 8cca0e965edd0e223b744f9cedf8e141
MD4 0abe9ee1f376caa1bcecad9042f16e73
MD5 6cd3556deb0da54bca060b4c39479839
RipeMD128 3cbb446fc20277b2a4e4b8b8b40aa962
RipeMD160 58262d1fbdbe4530d8865d3518c6d6e41002610f
SHA-1 943a702d06f34599aee1f8da8ef9f7296031d699
SHA-256 315f5bdb76d078c43b8ac0064e4a0164612b1fce77c869345bfc94c75894edd3
SHA-384 55bc556b0d2fe0fce582ba5fe07baafff035653638c7ac0d5494c2a64c0bea1cc57331c7c12a45cdbca7f4c34a089eeb
SHA-512 c1527cd893c124773d811911970c8fe6e857d6df5dc9226bd8a160614c0cd963a4ddea2b94bb7d36021ef9d865d5cea294a82dd49a0bb269f51f6e7a57f79421
Tiger b5e5dd73a5894236937084131bb845189cdc5477579b9f36
Whirlpool 238034e71c9f4d712ef02f8fe109bc1f32425530088c1ea13786e1ffdc953a7d567db4aba11ce0226efdd5ed5d55abd087b58122f891e61df996a37e595131b5

Как видно, каждый алгоритм выдает значение, которое не имеет совершенно ничего общего с исходными данными. И сколько раз мы бы не высчитывали контрольную сумму строки «Hello, world!», мы каждый раз будем получать одни и те же значения.

Source code

dCode retains ownership of the online ‘SHA-256’ tool source code. Except explicit open source licence (indicated CC / Creative Commons / free), any algorithm, applet or snippet (converter, solver, encryption / decryption, encoding / decoding, ciphering / deciphering, translator), or any function (convert, solve, decrypt / encrypt, decipher / cipher, decode / encode, translate) written in any informatic language (PHP, Java, C#, Python, Javascript, Matlab, etc.) no data, script or API access will be for free, same for SHA-256 download for offline use on PC, tablet, iPhone or Android !

Генерируем HMAC-SHA1

Это, пожалуй, самый простой из перечисленных выше шагов. Мы не будем пытаться воссоздать алгоритм самостоятельно (никогда не надо самостоятельно пытаться реализовать что-то из криптографии). Вместо этого мы воспользуемся Web Crypto API. Небольшая проблема заключается в том, что это API по спецификации доступно только под Secure Context (HTTPS). Для нас это чревато тем, что мы не сможем пользоваться им, не настроив HTTPS на сервере разработки. Немного истории и дискуссии на тему того, насколько это правильное решение, вы можете найти здесь.

К счастью, в Firefox вы можете использовать Web Crypto в незащищенном контексте, и изобретать колесо или приплетать сторонние библиотеки не придется. Поэтому для целей разработки демо предлагаю воспользоваться FF.

Само по себе Crypto API определено в . Если вас удивляет название, привожу цитату из спецификации:

Быстро пройдемся по методам, которые нам понадобятся. На заметку: все упомянутые здесь методы асинхронны и возвращают .

Для начала нам понадобится метод , поскольку мы будем использовать свой секретный ключ, а не генерировать его в браузере. принимает 5 аргументов:

В нашем случае:

  • будет , т.е. ключ мы предоставим в виде байт-массива .
  • — это тот самый ArrayBuffer. Совсем скоро поговорим о том, как именно его генерировать.
  • , согласно спецификации, будет . Этот аргумент должен соответствовать формату HmacImportParams.
  • выставим в false, поскольку планов экспортировать секретный ключ у нас нет
  • И, наконец, из всех нам понадобится только .

Наш секретный ключ будет длинной случайной строкой. В реальном мире это может быть последовательность байтов, которые могут быть непечатными, однако для удобства в этой статье мы будем рассматривать строку. Для конвертации ее в мы воспользуемся интерфейсом . С его помощью ключ подготавливается в две строчки кода:

Теперь соберем все вместе:

Отлично! Криптографию заготовили. Теперь разберемся со счетчиком и, наконец, подпишем сообщение.

Согласно спецификации, наш счетчик должен иметь длину 8 байт. Мы будем работать с ним опять же, как с . Для перевода его в эту форму мы воспользуемся трюком, который обычно используется в JS, чтобы сохранить нули в старших разрядах числа. После этого каждый байт мы поместим в , используя . Имейте в виду, что по спецификации для всех бинарных данных подразумевается формат big endian.

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

И на этом мы завершили первый шаг. На выходе мы получаем немного загадочно называющееся значение HS. И хотя это не самое лучшее название для переменной, именно так она (и некоторые последующие) называются в спецификации. Оставим эти названия, чтобы проще было сравнивать с ней код. Что дальше?

DT расшифровывается как Dynamic Truncation. И вот как она работает:

Заметьте, как мы применили побитовое И к первому байту HS. в двоичной системе — , поэтому по сути мы просто отбрасываем первый бит. В JS на этом смысл данного выражения и заканчивается, но в других языках это также обеспечит отрезание знакового бита, чтобы убрать путаницу между положительными/отрицательными числами и представлять это число как беззнаковое.

Почти закончили! Осталось лишь сконвертировать полученное от DT значение в число и вперед, к третьему шагу.

Третий шаг также довольно небольшой. Все, что нужно сделать, — это разделить получившееся число на , после чего взять остаток от этого деления. Таким образом, мы отрезаем последние N цифр от этого числа. По спецификации наш код должен уметь вытаскивать минимум шестизначные пароли и потенциально 7 и 8-значные. Теоретически, раз это 31-битное число, мы могли бы вытащить и 9 знаков, но в реальности я лично никогда не видел больше 6 знаков. А вы?

Код для заключительной функции, которая объединяет все предыдущие, в таком случае будет выглядеть как-то так:

Ура! Но как теперь проверить, что наш код верный?

Алгоритм

Хеш-функции семейства SHA-3 построены на основе конструкции криптографической губки, в которой данные сначала «впитываются» в губку, при котором исходное сообщение M{\displaystyle M} подвергается многораундовым перестановкам f{\displaystyle f}, затем результат Z{\displaystyle Z} «отжимается» из губки. На этапе «впитывания» блоки сообщения суммируются по модулю 2 с подмножеством состояния, которое затем преобразуется с помощью функции перестановки f{\displaystyle f}. На этапе «отжимания» выходные блоки считываются из одного и того же подмножества состояния, изменённого функцией перестановок f{\displaystyle f}. Размер части состояния, который записывается и считывается, называется «скоростью» (англ. rate) и обозначается r{\displaystyle r}, а размер части, которая нетронута вводом / выводом, называется «емкостью» (англ. capacity) и обозначается c{\displaystyle c}.

Алгоритм получения значения хеш-функции можно разделить на несколько этапов:

  • Исходное сообщение M{\displaystyle M} дополняется до строки P{\displaystyle P} длины, кратной r{\displaystyle r}, с помощью функции дополнения (pad-функции).
  • Строка P{\displaystyle P} делится на n{\displaystyle n} блоков длины r{\displaystyle r}: P,P1,…,Pn−1{\displaystyle P_{0},P_{1},…,P_{n-1}}
  • «Впитывание»: каждый блок Pi{\displaystyle P_{i}} дополняется нулями до строки длины b{\displaystyle b} бит и суммируется по модулю 2 со строкой состояния S{\displaystyle S}, где S{\displaystyle S} — строка длины b{\displaystyle b} бит (b{\displaystyle b} = r{\displaystyle r} + c{\displaystyle c}). Перед началом работы функции все элементы S{\displaystyle S} равны нулю. Для каждого следующего блока состояние — строка, полученная применением функции перестановок f{\displaystyle f} к результату предыдущего шага.
  • «Отжимание»: пока длина Z{\displaystyle Z} меньше d{\displaystyle d} (d{\displaystyle d} — количество бит в результате хеш-функции), к Z{\displaystyle Z} добавляется r{\displaystyle r} первых бит состояния S{\displaystyle S}, после каждого прибавления к S{\displaystyle S} применяется функция перестановок f{\displaystyle f}. Затем Z{\displaystyle Z} обрезается до длины d{\displaystyle d} бит
  • Строка Z{\displaystyle Z} длины d{\displaystyle d} бит возвращается в качестве результата

Благодаря тому, что состояние содержит c{\displaystyle c} дополнительных бит, алгоритм устойчив к атаке удлинением сообщения, к которой восприимчивы алгоритмы SHA-1 и SHA-2.

В SHA-3 состояние S{\displaystyle S} — это массив 5 × 5 слов длиной w{\displaystyle w} = 64 бита, всего 5 × 5 × 64 = 1600 бит. Также в Keccak могут использоваться длины w{\displaystyle w}, равные меньшим степеням 2 (от w{\displaystyle w} = 1 до w{\displaystyle w} = 32).

Реальный пример хеширования паролей Python

В следующем примере пароли будут хешироваться для последующего сохранения в базе данных. Здесь мы будем использовать salt. salt является случайной последовательностью, добавленной к строке пароля перед использованием хеш-функции. salt используется для предотвращения перебора по словарю (dictionary attack) и атак радужной таблицы (rainbow tables attacks).

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

Код для Python 3.x

Python

import uuid
import hashlib

def hash_password(password):
# uuid используется для генерации случайного числа
salt = uuid.uuid4().hex
return hashlib.sha256(salt.encode() + password.encode()).hexdigest() + ‘:’ + salt

def check_password(hashed_password, user_password):
password, salt = hashed_password.split(‘:’)
return password == hashlib.sha256(salt.encode() + user_password.encode()).hexdigest()

new_pass = input(‘Введите пароль: ‘)
hashed_password = hash_password(new_pass)
print(‘Строка для хранения в базе данных: ‘ + hashed_password)
old_pass = input(‘Введите пароль еще раз для проверки: ‘)

if check_password(hashed_password, old_pass):
print(‘Вы ввели правильный пароль’)
else:
print(‘Извините, но пароли не совпадают’)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21

importuuid

importhashlib

defhash_password(password):

# uuid используется для генерации случайного числа

salt=uuid.uuid4().hex

returnhashlib.sha256(salt.encode()+password.encode()).hexdigest()+’:’+salt

defcheck_password(hashed_password,user_password):

password,salt=hashed_password.split(‘:’)

returnpassword==hashlib.sha256(salt.encode()+user_password.encode()).hexdigest()

new_pass=input(‘Введите пароль: ‘)

hashed_password=hash_password(new_pass)

print(‘Строка для хранения в базе данных: ‘+hashed_password)

old_pass=input(‘Введите пароль еще раз для проверки: ‘)

ifcheck_password(hashed_password,old_pass):

print(‘Вы ввели правильный пароль’)

else:

print(‘Извините, но пароли не совпадают’)

Код для Python 2.x

Python

import uuid
import hashlib

def hash_password(password):
# uuid используется для генерации случайного числа
salt = uuid.uuid4().hex
return hashlib.sha256(salt.encode() + password.encode()).hexdigest() + ‘:’ + salt

def check_password(hashed_password, user_password):
password, salt = hashed_password.split(‘:’)
return password == hashlib.sha256(salt.encode() + user_password.encode()).hexdigest()

new_pass = raw_input(‘Введите пароль: ‘)
hashed_password = hash_password(new_pass)
print(‘Строка для сохранения в базе данных: ‘ + hashed_password)
old_pass = raw_input(‘Введите пароль еще раз для проверки: ‘)
if check_password(hashed_password, old_pass):
print(‘Вы ввели правильный пароль’)
else:
print(‘Извините, но пароли не совпадают’)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20

importuuid

importhashlib

defhash_password(password):

# uuid используется для генерации случайного числа

salt=uuid.uuid4().hex

returnhashlib.sha256(salt.encode()+password.encode()).hexdigest()+’:’+salt

defcheck_password(hashed_password,user_password):

password,salt=hashed_password.split(‘:’)

returnpassword==hashlib.sha256(salt.encode()+user_password.encode()).hexdigest()

new_pass=raw_input(‘Введите пароль: ‘)

hashed_password=hash_password(new_pass)

print(‘Строка для сохранения в базе данных: ‘+hashed_password)

old_pass=raw_input(‘Введите пароль еще раз для проверки: ‘)

ifcheck_password(hashed_password,old_pass):

print(‘Вы ввели правильный пароль’)

else:

print(‘Извините, но пароли не совпадают’)

Что такое контрольная сумма

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

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

Также нужно упомянуть, что контрольную сумму нельзя использовать для получения исходных данных. То есть нельзя «расшифровать» хеш-сумму и получить данные которые были хешированы, хеш-сумму можно только сравнить с другой хеш-суммой. Это особенность открывает дополнительные возможности. Например, хеш-суммы используются для хранения паролей. Когда вы регистрируетесь на каком-то сайте и вводите свой пароль, то он не хранится на сервере в открытом виде. Вместо этого хранится только его контрольная сумма. А когда вы входите в свой аккаунт с использованием пароля, система получается ваш пароль, высчитывает его хеш-сумму и сравнивает с хеш-суммой, которая хранится на сервере. Если хеш-суммы совпали, значит пароль верный и вы можете войти в аккаунт, если хеш-суммы не совпадают, значит пароль не верный и вас перенаправляют на страницу для восстановления пароля.

Для высчитывания контрольной суммы существует множество различных алгоритмов или так называемых хеш-функций. Самыми известными и популярными алгоритмы являются: CRC32, MD5, SHA-1 и SHA-2. Но, есть и множество других алгоритмов, некоторые из которых имеют широкое применения, а некоторые используются только для специфических задач. При этом часть существующих алгоритмов признаны устаревшими или уязвимыми и больше не используются. Так, алгоритм MD5 практически полностью перестал использоваться поскольку выяснилось, что он может выдавать одинаковые значения для разных входных значений.

Для примера продемонстрируем, как выглядит контрольная сумма на практике. Например, возьмем строку «Hello, world!» и высчитаем ее контрольную сумму с использованием нескольких популярных алгоритмов.

Алгоритм Значение
Adler32 205e048a
CRC32 ebe6c6e6
Haval 5711dea10d85b988fcb1eed99ce7310c
MD2 8cca0e965edd0e223b744f9cedf8e141
MD4 0abe9ee1f376caa1bcecad9042f16e73
MD5 6cd3556deb0da54bca060b4c39479839
RipeMD128 3cbb446fc20277b2a4e4b8b8b40aa962
RipeMD160 58262d1fbdbe4530d8865d3518c6d6e41002610f
SHA-1 943a702d06f34599aee1f8da8ef9f7296031d699
SHA-256 315f5bdb76d078c43b8ac0064e4a0164612b1fce77c869345bfc94c75894edd3
SHA-384 55bc556b0d2fe0fce582ba5fe07baafff035653638c7ac0d5494c2a64c0bea1cc57331c7c12a45cdbca7f4c34a089eeb
SHA-512 c1527cd893c124773d811911970c8fe6e857d6df5dc9226bd8a160614c0cd963a4ddea2b94bb7d36021ef9d865d5cea294a82dd49a0bb269f51f6e7a57f79421
Tiger b5e5dd73a5894236937084131bb845189cdc5477579b9f36
Whirlpool 238034e71c9f4d712ef02f8fe109bc1f32425530088c1ea13786e1ffdc953a7d567db4aba11ce0226efdd5ed5d55abd087b58122f891e61df996a37e595131b5

Вывод

Итак, было рассмотрено понятие «контрольной суммы». Стало ясно, для чего она используется. Для рядового пользователя это легкий вариант для того, чтобы проверить файл на целостность и соответствие оригиналу. Были описаны полезные утилиты для вычисления и сравнения хеш-сумм. Первая способна сравнивать различные суммы, а вторая только по одному алгоритму, но зато не требует инсталляции, что актуально при отсутствии прав администратора.

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

ие расчитанное по набору входных данных с помощью специального алгоритма. Контрольная сумма чаще всего используется для проверки целосности файлов. То есть в грубом приблежении контрольная сумма это ключ
, который позволяет однозначно отличить два разных набора данных (два разных файла). Например, вы скачали файл из интернета ( игры, установочный ), вы можете быть уверенны, что в процессе скачивания файл не был поврежден и был полностью загружен? А ведь использование такого «неисправного» файла зачастую приводит к ошибкам при установке игры или ОС или чего угодно. Причем о том, что ошибка возникла именно из-за поврежденного в процессе загрузки файла вы можете и не знать, обвиняя во всех проблемах свой компьютер.

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

Для вычисления и сравнения контрольных сумм используются специальные программы. Самая распространенная из них это HashTab
. Эта программа бесплатная. Скачать ее можно отсюда:

Для установки распакуйте архив и запустите файл установки программы.

После установки не появляется ярлык программы, нету этой программы и в меню быстрого запуска Пуск. Для того чтобы воспользоваться программой, нажмите правой кнопкой
по любому файлу и выберите пункт Свойства
(проделаем эту операцию со скачанным архивом)

Обратите внимание, что в окне свойств файла появилась новая вкладка Хеш-суммы файлов

Для того чтобы сравнить контрольные суммы файлов скопируйте хеш-сумму, с сайта программы и вставьте ее в поле Сравнение хеша
окна свойств.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *