Перевод Автостопом по криптографии

Тема в разделе "Статьи", создана пользователем Mr. Pickles, 5 мар 2020.

  1. Mr. Pickles

    Команда форума Модератор Редактор

    Регистрация:
    11 сен 2017
    Сообщения:
    714
    Симпатии:
    221
    Введение в криптографию

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

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

    Разница между криптографической хеш-функцией и обычной хеш-функцией состоит в том, что первая создаётся так, чтобы затруднить её обратное вычисление, а вычисление двух значений с одним и тем же хешем (что называется «конфликтом») должно быть просто невозможным.

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

    Это как разбить яйцо: разбить его просто, а вот «собрать» яйцо обратно едва ли получится.

    1.png
    Разбить яйцо несложно.


    2.png
    Но очень сложно собрать разбитое яйцо обратно.

    В цифровом мире довольно популярна и широко используется хеш-функция SHA-256, которая приводится здесь в качестве примера:

    hello → 5891b5b522d5df086d0ff0b110fbd9d21bb4fc7163af34d08286a2e846f6be03
    Но нет такой функции, которая бы позволила «развернуть» хеш напрямую:

    084c799cd551dd1d8d5c5f9a5d593b2e931f5e36122ee5c793c1d08a19839cc0 → ???
    Чтобы выяснить, что скрывается за хешем, придётся проверить все вероятные варианты:

    1 → 4355a46b19d348dc2f57c046f8ef63d4538ebb936000f3c9ee954a27460dd865
    2 → 53c234e5e8472b6ac51c1ae1cab3fe06fad053beb8ebfd8977b010655bfdd3c3
    ...
    42 → 084c799cd551dd1d8d5c5f9a5d593b2e931f5e36122ee5c793c1d08a19839cc0
    Нашли! Ответом будет «42». Но нам просто повезло, что пришлось перебрать всего 42 варианта, ведь могло понадобиться гораздо больше времени. Тут всё зависит от вводимых данных.
    Не верите? Тогда попытайтесь угадать, в результате хеширования какого сообщения SHA-256 выдала такой результат. Я даже дам подсказку: использовались только пробелы и буквы верхнего и нижнего регистра.
    b409d7f485033ac9f52a61750fb0c54331bfdd966338015db25efae50984f88f
    Чтобы понять, насколько сложным может оказаться подбор данных для хеша, давайте рассмотри процесс майнинга Bitcoin. Ведь, по сути, именно этим и занимаются майнеры — они вычисляют хеши SHA-256, вновь и вновь сопоставляя входящие данные до тех пор, пока не будет найдено необходимое соответствие. При этом им не требуется точного соответствия. Им необходимо найти хеш с определённым количеством нулей в начале.

    Текущий хешрейт сети Bitcoin составляет приблизительно 113 экзахешей в секунду (по данным на 18.02.2020). Это просто потрясающая скорость — 113 x 1018 или 133 000 000 000 000 000 000 хешей в секунду, и всё же при этом предполагается, что правильное решение будет находиться лишь каждые 10 минут.

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

    Криптография с открытым ключом

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

    3.png
    Запертый почтовый ящик

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

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


    5.png
    На дверце почтового ящика есть надпись «Джонас» (Jonas), и ящик нужно открыть, чтобы сменить эту надпись. Таким образом, указывая свое имя, я доказываю, что являюсь владельцем почтового ящика.

    Огромная часть интернета завязана на криптографии с открытым ключом. Например, когда вы подключаетесь к своему банковскому счёту через интернет, эта схема гарантирует, что никто не увидит, сколько у вас денег, кому вы их переводите, и что только вы один сможете сделать это при необходимости.

    6.png
    Иконка с замком или ярлык https указывают на то, что помимо прочего используется криптография с открытым ключом, которая защищает ваше соединение с веб-сайтом.

    Не буду вдаваться в математические подробности, стоящие за работой схемы, так как объяснение будет неизбежно сложным, в чём нет необходимости. Но если вас интересуют именно подробности, рекомендую ознакомиться с ними. Лично я нахожу всё это довольно увлекательным.
    Мы рассмотрим практическое применение криптографии с открытым ключом на примере работы адресов Bitcoin.

    Адреса Bitcoin

    Адреса, в случае с Bitcoin (и другими криптовалютами), используют криптографию с открытым ключом, позволяющую защитить ваши средства. Адрес является публичным ключом, при помощи которого любой может отправить вам монеты, но чтобы отправить средства с такого адреса, вам понадобится приватный ключ.

    Вот пример стандартного адреса Bitcoin:

    19WoNYNXnfNPmLteC8YmZFsTQoN9gBSbCG

    Адрес соответствует публичному ключу:

    Код:
    049f6aad24669d180cfe4c974a677407cbf26f03242a09126ebf88621d31f01a218d40fcbcb769b44b014d502a1c9ce8c2ca629bc339fe14b4db56e27e80ac30a7
    Адрес может отображаться самыми различными способами, но так уж повелось, что Bitcoin использует такой формат. Использовать адрес удобнее, так как он короче и включает в себя код с контролем ошибок.
    Приватный ключ к этому адресу выглядит так:

    5298e83a0c0884cdcf34294f663220bc73e3c6689e95b53158a9a89e95fd78bb

    Приватный ключ является просто большим числом и тоже может отображаться различными способами. Вот тот же самый ключ в формате WIF (Wallet Import Format). Он короче и включает в себя код с контролем ошибок:

    5JSfRE8qNQZTtdwuRx6pxVohC3C3VeAHvzKvLsZWHEGPdW2zF3o

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

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

    Причина, по которой Bitcoin использует криптографию с открытым ключом для создания адресов, состоит в том, что она позволяет подписывать сообщения. Например, если я подписываю сообщение:
    Jonas sent the money (Джонас отправил деньги)
    приватным ключом к адресу:

    19WoNYNXnfNPmLteC8YmZFsTQoN9gBSbCG

    то получаю следующую подпись:

    Код:
    HCZl2+vEZboqXgaVYi1nLNgwoa/INLiEsA2yXe+87j5iFoo/G96m4AoA5dL5T+rTiFKpXHuS5w3rP1IWSPZZv0Q=
    Это позволяет верифицировать факт моего знания приватного ключа к адресу, даже если я никогда не показывал его. Это свойство полезно, если мы отправляем деньги кому-то и хотим доказать, кто именно делает это.
    То же самое происходит в фоновом режиме, когда вы утверждаете транзакцию: вы подписываете её своим приватным ключом, и ваша подпись верифицируется перед тем, как транзакция будет принята. Если подпись не пройдёт верификации, то транзакция будет признана недействительной и будет «забракована». Это гарантирует, что монеты сможет потратить только владелец адреса.
    Шифрование сообщений при помощи ключей Bitcoin, насколько мне известно, не практикуется. Как правило, используются такие протоколы, как PGP. Но в принципе это возможно. Для полноты приведу небольшой пример.

    Допустим, вы хотите отправить сообщение:

    I secretly love your book! (Я в тайне восхищаюсь вашей книгой!)

    Но чтобы я смог прочитать его, вы шифруете сообщение при помощи моего публичного ключа:

    Код:
    049f6aad24669d180cfe4c974a677407cbf26f03242a09126ebf88621d31f01a218d40fcbcb769b44b014d502a1c9ce8c2ca629bc339fe14b4db56e27e80ac30a7
    Таким образом, у вас получается зашифрованное сообщение:

    Код:
    QklFMQJ+CTugTvsEmuB7owU3DvC5taXqC5DhsJ3Wq8EmUMHwgsE54GlY1PI9d1R/OoGfq1mG9dcThW5T9fpUtQTY+ogLLvKsrN6ngeulLMrfoyCxFtLTjH78PGSd8eROQ1yPq1k=
    И это сообщение расшифровать смогу только я (но так как я выдал приватный ключ, вы тоже сможете).

    Мнемонические фразы

    Поскольку приватные ключи не очень удобны, кошельки Bitcoin используют мнемонические фразы. Такая фраза представляет собой последовательность из 12, а иногда 24 слов, выбранных из предварительно заданного набора, включающего в себя 2048 возможных слова.
    Вот, например, мнемоническая фраза, состоящая из 12 слов:

    reward tip because lock general culture below strike frog fox chunk index

    И это соответствует следующему приватному ключу:

    KyRoQMYWAtfj5cGLThb1fznm5Utjq7Etmn9DLtdxYCiE3Vntcz3E

    Гораздо удобней, так ведь? В то время как запомнить публичный ключ довольно сложно, заучить мнемоническую фразу будет куда проще, вот увидите!

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

    Вот пример первых 10 адресов и соответствующих приватных ключей, полученных на основе нашей мнемонической фразы:
    Код:
    19oN2GWEH1uiPz11WyChkUp2che9Z11Q5A KyRoQMYWAtfj5cGLThb1fznm5Utjq7Etmn9DLtdxYCiE3Vntcz3E
    1LverDkyaWMEyyFHiEWQaJt6UGxRjeBfQR L1NH4wpuKzafbq2PtVXaGCE8hjc7KGzRfyfYik73APu7kZvdJxUp
    1QHQ8uFrEL29WAkMLQgkoDzHimEQNqubM1 Kx3c9ZeS2pzYPuLa2NoA14SavnsWpkf1BJDLDu1N52oGoNWgv9KM
    1HiohATeEm6BBeRCgWZ5vY3ZKFrCDsJnt9 KyCWZEpJ3AYUmB7MGEVvZfr6eiwgag89jmZtHC1tEVv9XynSqmot
    1KJ5oMUEJTyd3igAYjJGvpdVjGDvF1Brc6 L4exrFikcfgSYm1ZZBkJrbwouLjzrrJB6VPyaH4vyK8cAkK2V2nt
    1DzZJ6R1xXiQ3HJ3BsBAcviVdtUEeiu2UG Kx37aUKrHRVdinxzHWTK8ebXWeMtRSbtshzonTMTQBrssQ2ms1JV
    134TjnZ8xiu4wxfyy4xQQtiMiKhhe6AVur KwPqA3XUaWCX2dhRRm4WXArm5DJKXko1ydgwwApJ3BC3dgnQ3Ydg
    12XiJHvYT6TyaWcUhzdcBgqFZc3bNWpYdd L2WakaNFfBehyL17c13iQwJKR8H1hQtsVvR5jsdugFfj9si8DZm2
    12MuxMtJb9jbrzMQrr7zDiLYcn6xwaXMkq L2ScmsyKJYzW2koEPjHmLKzjFMYNfR8UZMifP2yvggrRrJEBU4UJ
    1MqBeJiVW6FqxKbrMq8mVUcukjXWMzuYew KypFcqzaJRHPwxQfGDiYyJMtAdyKNSQuR78yZPTU57baS42dp4tr
    
    Мне хотелось бы напомнить о важности сохранения резервной копии и защиты вашей мнемонической фразы. Вот всего лишь несколько вариантов, как вы можете потерять свои деньги:
    1. Вы завели кошелёк на телефоне, но телефон потерялся или сломался.

    2. Вы записали мнемоническую фразу на листе бумаги, но он сгорел.

    3. Вы забыли, где записали мнемоническую фразу.

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

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

    Источник: A hitchhiker's guide to cryptography

    Перевод:
    Mr. Pickles (@v1docq47)
    Редактирование:
    Agent LvM (@LvMi4)
    Коррекция:
    Kukima (@Kukima)
     
    #1 Mr. Pickles, 5 мар 2020
    Последнее редактирование: 5 мар 2020
  • О нас

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