Криптография, хеши, два ключа

Криптография, хеши, два ключа

ГлавКрипт


Саня, ты знаешь как работает блокчейн? И почему криптовалюта начинается с корня "крипт"?


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


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

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


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


Я думаю, лет на 30-50.


Чуть чуть ошибся, раз в 100. Для начала отправимся на 4 000 лет назад в древний Египет. Уже тогда люди начали изобретать первые шифры. Сейчас такие шифры мы называем моноалфавитными. Основной принцип — замена алфавита исходного текста другим алфавитом через замену букв другими буквами или символами.

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

Например буква А в зашифрованном виде будет давать букву Z, а буква В в зашифрованном виде даёт знак &.

Теперь попробуем зашифровать твоё имя с помощью нашего придуманного алфавита.

Получилось UZ%9 - это САНЯ в зашифрованном виде. Чтобы быстро расшифровать такой шифр, надо знать сопоставление исходного и придуманного алфавитов. Ну или использовать метод подбора. Сейчас такой шифр расшифрует любой компьютер, раньше требовались специальные люди.


С этим всё понятно. Теперь переместимся в 40-ые годы до нашей эры, Древний Рим и Гай Юлий Цезарь. До наших дней дошла информация, что он использовал шифр, который после назовут - код Цезаря или сдвиг Цезаря, это один из самых простых и широко известных методов шифрования. Шифр Цезаря — это вид шифра подстановки, в котором каждый символ в открытом тексте заменяется символом, находящимся на некотором постоянном числе позиций левее или правее него в алфавите. Например, в шифре со сдвигом вправо на 3, А была бы заменена на Г, Б станет Д, и так далее.

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


Далее все усложнялось и развивалось. Война дала большой толчок в развитии криптографии, так были созданы немецкая «Энигма», английская «Бомба Тьюринга».

Энигма - это машина для шифрования. Ниже её фотография, можно увидеть какая она маленькая.

Энигма

А Бомба-Тьюринга, это машина для расшифровки (дешифрование). Обрати внимание на её размер.

Бомба-Тьюринга

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

Это была историческая часть, теперь будем углубляться в техническую. Существует несколько криптографических примитивов(подходов):

  • Симметричное шифрование. Заключается в том, что обе стороны-участники обмена данными имеют абсолютно одинаковые ключи для шифрования и расшифровки данных. Данный способ осуществляет преобразование, позволяющее предотвратить просмотр информации третьей стороной.
  • Асимметричное шифрование. Предполагает использовать в паре два разных ключа — открытый и секретный. В асимметричном шифровании ключи работают в паре — если данные шифруются открытым ключом, то расшифровать их можно только соответствующим секретным ключом и наоборот — если данные шифруются секретным ключом, то расшифровать их можно только соответствующим открытым ключом. Использовать открытый ключ из одной пары и секретный с другой — невозможно. Каждая пара асимметричных ключей связана математическими зависимостями. Данный способ также нацелен на преобразование информации от просмотра третьей стороной.
  • Хеширование. Преобразование данных произвольной длины в выходную битовую строку фиксированной длины. Такие преобразования также называются хеш-функциями или функциями свёртки, а их результаты называют хеш-кодом, контрольной суммой или дайджестом сообщения (англ. message digest). Результаты хеширования статистически уникальны. Последовательность, отличающаяся хотя бы одним байтом, не будет преобразована в то же самое значение.
  • Цифровая подпись. Реквизит электронного документа, полученный в результате криптографического преобразования информации с использованием закрытого ключа подписи и позволяющий проверить отсутствие искажения информации в электронном документе с момента формирования подписи (целостность), принадлежность подписи владельцу сертификата ключа подписи (авторство), а в случае успешной проверки подтвердить факт подписания электронного документа (неотказуемость).


Внимание вопрос, с чем мы сталкиваемся, когда говорим о битке?


Асимметричное шифрование. У нас есть открытый и секретный ключ. А еще с хешированием.


Хеширование

Верно, а теперь давай немного поговорим про хеширование. Биткоин использует алгоритм хеширования SHA-256. В общих чертах это работает так: в шифрование отдается строка произвольной длинны, она делится на определенное количество блоков, и каждый блок дальше с помощью математики превращается в один символ. И получается строка фиксированной длинны. Смотри пример:

Шифруем фразу "Привет, меня зовут Санёк" с помощью SHA-256 и получаем хеш: 8dfd7a0bcb4dd674653be542ca4de5577f5f99423ea7d0b66e8b00373266dec1

А давай теперь попробуем зашифровать просто твоё имя "Саша" и получаем хеш: 5de0337bfa465beaca35372b42cf9d8d684c21a5272256f86e819e30e0618ef9

И на последок давай попробуем написать "саша" с маленькой буквы и получаем хеш: 95124d11e81a272dc2307b55b28be68147fcc8c43318a7f966461dd60e6d1108

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

Ты можешь проверить, зашифровать то что я написал, и убедиться, что у тебя будет такой же хеш: www.md5calc.com/sha256


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


Как же работает хеширование в блокчейне. Разберём на бытовом примере.

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


Предположим, ты дал в долг Коле 500 рублей. И записал это у себя в тетради дома. Коля вернул тебе 200р и это ты тоже записал. Потом коля попросил еще 300р. Итого, Коля должен тебе 600 рублей.

Спустя время, ты позвал Колю в гости, и пока ты варил кофе, он нашёл эту тетрадь и изменил одну запись. И вернул тебе не 600р, а всего лишь 300р.

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

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

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

Коля извинился, вы вернули запись, как и было. Коля ушёл, но решил изучить твой метод хеширования SHA-256. Теперь он тоже умеет шифровать, и когда он пришёл в следующий раз, он уже смог подменить не только саму запись, но и хеш. И когда ты проверил хеши, оказалось действительно, теперь ты ему должен 400р.

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

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

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


Как ты понял, тетрадь - это твой собственный блокчейн. Вот так тут применяются хеши. Ты можешь поиграться, чтобы понять, как это работает: https://blockchaindemo.io/

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

Закрытый и открытый ключи

С хешированием примерно разобрались. Теперь перейдем к открытому и закрытому ключам. Опять же, разберёмся на бытовом примере.

Представим, что Почта России и ФСБ совсем офигели и начали читать все письма и просматривать все посылки. Чтобы как-то себя защитить, я перед отправкой кладу посылку в металическую коробку со своим замком, и уже её отправляю тебе.

Почта России не имеет права взламывать замки, и посмотреть что внутри не смогли. Но ты тоже не смог открыть ящик, т.к. у тебя тоже нет ключа. Что же нам делать?


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


А если у нас нет возможности встретиться лично. Представим другую ситуацию:

  1. Я кладу свою посылку в железный ящик и, заперев его на замок, отправляю тебе.
  2. Ты при получении ящика, берешь свой замок и, дополнительно заперев им ящик, и отправляешь обратно.
  3. Мне ящик вернётся уже с двумя замками (один мой, от которого у меня есть ключ, и второй твой от которого есть ключ у тебя).
  4. Я снимаю свой замок, и отправляю посылку обратно тебе.
  5. Тебе приходит посылка с одним замком от которого у тебя есть ключ.
  6. Ты открываешь оставшийся замок своим ключом, и получаешь содержимое


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


Блокчейн

Как работает пример с ключами в блокчейне биткоина.

Биткоин адрес - это хеш от публичного ключа (PUB). А публичный ключ, это хеш от приватного ключа(PRIV).

Адрес = SHA256(PUB), и получается что-то вроде этого:

1thFdfkjoJgz3N6sLoAwGth9TNm8YuOPgT7 (это упрощенный процесс, на самом деле все сложнее)

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

Pub=261c1eb21fc47456467be1cfc6d4565652e9e768b620782898936b93000a6c02

И тем более, приватный:

Priv=04678afdb0fe5548271967f1a67130b546hj5k8e03909a67962e0ea1f61deb649f6bc3f4cef38c4f35504e51ec112de5c384df7ba0b8d578a4c702b6bf11d5f

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


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


Связанные материалы:


🔀 Навигация по каналу

🔴 @GlavCrypt


Report Page