Эпизод 02 - Введение в цифровые подписи

04/01/2019

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

Стенограмма эпизода:

Джастин: Добро пожаловать во второй эпизод Breaking Monero. Breaking Monero — это серия эпизодов, в рамках которой мы пытаемся подробно и понятным языком разъяснить ограничения, связанные с анонимностью и безопасностью Monero. Сегодня мы поговорим о кольцевых подписях и об их истории. Важно понять, что такое кольцевые подписи перед тем, как перейти ко всему остальному, к тому, о чём будет говориться в этих эпизодах, поскольку всё остальное строится на базе кольцевых подписей. Но перед тем как начать, у нас здесь присутствует Саранг, не хотел бы ты кратко представиться? Тебя уже видели в прошлом эпизоде, но тем не менее не мог бы ты также изложить некоторые основные положения, идею правдоподобного отрицания, а также идею эвристического подхода?

Саранг: Да, конечно. Как ты уже сказал, я выступаю под именем Саранга Ноезера и являюсь одним из исследователей, кандидатов наук, работающих на проект Monero. Я занимаюсь исследованиями и разработкой Исследовательской лаборатории Monero. Мой коллега, Шурэ Ноезер, не смог сегодня присутствовать здесь, но он участвовал в прошлом эпизоде, вступительном эпизоде серии, где мы говорили о том, чем мы занимаемся и почему мы этим занимаемся. Итак, кольцевые подписи представляют собой довольно популярную тему, и как мы будем говорить дальше, я бы сказал, что они являются больным местом и камнем преткновения, в результате столкновения с которым у людей, пользующихся Monero, возникают вопросы. Кроме того, кольцевые подписи — это та вещь, к которой нам приходится возвращаться снова и снова, так как мы хотим усилить Monero. В этом эпизоде мы лишь кратко рассмотрим структуру, принцип их работы. Мы не будем вдаваться в математические подробности, для этого определённо существуют вполне пригодные источники на случай, если это вам интересно. Но мы немного поговорим о структуре и выйдем на вопрос, почему именно структура кольцевых подписей может стать причиной возникновения некоторых проблем. Для начала нужно обозначить, что небеса не рухнули и кольцевые подписи никто не взломал. Мы будем говорить о том, что они работают, как и должны работать, но они могут стать причиной того, что я бы назвал «неудобствами», над разрешением которых мы итеративно работаем, стараясь улучшить ситуацию. Ты использовал словосочетание «правдоподобное отрицание». Я тоже иногда использую его, когда речь заходит о невозможности определения отправителя Monero, и мне бы хотелось, чтобы это словосочетание использовалось как можно чаще. Как мы уже говорили ранее, люди любят разбрасываться словами вроде «анонимность» или «взаимозаменяемость», не осознавая их формального смысла. Есть некоторые интуитивные вещи, когда мы рассматриваем значения слов «анонимность» и «взаимозаменяемость» с точки зрения цифровых активов, но это случай, когда мы напрочь закрепляем эти понятия. Я предпочитаю разбивать гарантии приватности и анонимности Monero на три части. Невозможность определения отправителя или, если вам угодно, его анонимность, невозможность определения получателя или его анонимность и анонимность суммы и/или метаданных. В целом анонимность получателя и анонимность суммы или метаданных суммы, это очень и очень хорошие вещи. Что происходит, когда вы отправляете средства кому-то, используя Monero, и они не связываются напрямую с адресом вашего кошелька — у меня один или несколько кошельков Monero, и у каждого из них есть свой адрес. Я могу получить средства, направленные на них, и я могу использовать средства, полученные на них, чтобы потом отправить их другим людям. Итак, у Джастина есть адрес его кошелька, он даёт его мне, а затем я отправляю средства посредством моего клиента Monero. Но происходит следующее, сам адрес кошелька, если я отправляю средства Джастину, на самом деле никогда не попадает в блокчейн. Это было бы слишком громоздко. Вместо этого, мною генерируется одноразовый выход, который иногда называется адресом уведомления (note address), и именно этот одноразовый адрес появляется в блокчейне. Поэтому адреса кошельков никогда не появляются там, и это важно запомнить. Эти адреса отличаются, и это небольшое различие иногда легко упустить, но сама идея состоит в том, что когда вы отправляете средства кому-то, получателю, адрес кошелька остаётся скрытым. Я просто «заворачиваю» адрес получателя в одноразовый адрес таким образом, что его невозможно восстановить. Таким образом, если кто-то посмотрит на выход, который был сгенерирован мной, который был направлен Джастину, то этот кто-то никогда не сможет сказать, что он был направлен именно Джастину. Знание Джастином приватного ключа, соответствующего адресу его кошелька, позволяет ему впоследствии потратить полученные средства, но напрямую он не сможет определить ничего в отношении такого адреса. Подобным образом, возможно, это нами уже упоминалось в прошлом эпизоде, такие вещи, как сумма транзакции Monero, раньше были известны по ряду причин, но теперь они связываются с тем, что называют криптографическим обязательством, и это привело к появлению того, что мы называем «доказательством диапазона» и протокола Bulletproofs. И всё это очень широко обсуждалось ранее. Но и это тоже очень и очень хорошо. Сумма вашей транзакции анонимна, получатель вашей транзакции анонимен, но мы часто любим говорить о невозможности определения отправителя, и вот именно тут мы вспоминаем о кольцевых подписях. На самом деле, если я отправляю средства Джастину, я беру средства, которые были ранее мною получены с так называемым одноразовым выходом, который был отправлен мне, и я не хочу отправлять обязательно именно этот выход ему. В другой альтернативной версии Monero, возможно, вы бы могли сделать так: я бы взял одноразовый выходящий адрес и в некотором смысле переписал бы его на Джастина. На деле, я генерирую новый одноразовый выходящий адрес, и я подписываю его, используя тот, что был получен мною. Если всё будет сделано надлежащим образом, это должно будет убедить всех в том, что деньги действительно существовали и до этого, что они были у меня, и что не происходит ничего необычного. Но в идеале, в случае с Monero, нам бы хотелось, чтобы всё было ещё более скрыто по принципу «правдоподобного отрицания». И вот что я делаю: я беру одноразовый выходящий адрес, который был направлен мне и который я хотел бы отправить Джастину, но также я беру и несколько случайных, а слово случайный может означать какой угодно, но я беру другие одноразовые адреса, которые не контролирую. В отличие от таких вещей, как CoinJoin, или других миксеров, для этого мне не приходится взаимодействовать с кем-либо, никто не знает, что я делаю, и это важно. Я просто беру другие случайные одноразовые адреса и использую их, включая в структуру, называемую кольцом. То есть я создаю кольцевую подпись, где мне известен приватный ключ, соответствующий одному из публичных ключей этих выходов. На деле, это означает, что я использую приватный адрес кошелька, которым владею, поскольку средства изначально были адресованы на мой кошелёк, я использую этот приватный ключ, чтобы сгенерировать приватный ключ для одного из этих выходов. Опять же, это определяет разницу между адресами кошельков и адресами выходов, что иногда приводит к путанице. Кольцевая подпись просто говорит о том, что я контролирую один из них, а также о некоторых вещах, касающихся сумы, и что мой баланс верен. И выходит так, что независимо от того, является ли Джастин верификатором кольцевой подписи или же это кто-то, синхронизирующий блокчейн в целях обеспечения гарантии, что всё прошло корректно, всё, что им нужно знать, так это то, что подпись действительна и что я реально владею средствами, и что я действительно отправляю их Джастину. Для этого обычно и проводится верификация кольцевой подписи, и во время такой верификации выясняются всего две вещи. Во-первых, что один из выходов является одноразовым выходящим адресом, который принадлежал мне, и, что важно, при этом не раскрывается, какой именно. В таких случаях говорят, что один из выходов является «действительным отправителем». И действительный отправитель в этом случае не означает адрес кошелька, он означает одноразовый выходящий адрес, который был сгенерирован на лету, когда средства были изначально отправлены мне. А также это демонстрирует, что средства не тратятся повторно. Самым продуманным свойством кольцевой подписи является то, что называется «связываемостью». Это означает, что если бы я попытался завладеть другим кольцом и повторно потратить средства, то тот определённый одноразовый адрес, тот публичный ключ выхода может появиться в ряде других колец, в идеале он и появится в группе других колец, когда люди случайно выберут его, чтобы использовать для себя. Но мне также необходимо убедиться в том, что он не был потрачен дважды. Свойство связываемости, которое предполагает использование так называемых образов ключей, позволяет убедиться в том, что не только я владел одним из тех выходов, а также, что тот выход, которым владел я, не был потрачен в составе другого кольца. То есть куча информации упакована в одну структуру, называемую кольцевой подписью. Как ещё будет обсуждаться нами, здесь существуют некоторые ограничения, но математически всё происходит именно так, как задумывалось. Фактически реализуется принцип «правдоподобного отрицания». Если кто-то заявит: «Ну, один из этих публичных ключей принадлежал тебе», ты сможешь ответить: «Понятия не имею, который из них, этот ключ выхода мог появиться во множестве других колец, а я не имел ничего общего с теми транзакциями». Поэтому создаётся возможность отрицания фактической траты, то есть не говориться, какой публичный ключ я передаю тебе. Ты также намекал на идею, которую мы называем эвристикой. Эвристика — очень тонкая вещь, но она важна. Хорошим примером эвристического подхода может служить, скажем, ситуация, когда я попрошу тебя загадать число от 1 до 10. Потом, предположим, я прошу тебя записать это число на листе и запечатать этот лист в конверт так, чтобы я его не видел. Ну, а так как я достаточно умный человек, знающий кое-что о статистике, то мне известно, что в целом люди обычно не выбирают числа 1 или 10. И это действительно так, люди предпочитают не использовать предельных значений. Таким образом, я запоминаю, что, вероятно, ты не записал 1 и не записал 10. Кроме того, мне известно, что в случае, когда кто-то просит выбрать число от 1 до 10, чаще всего выбирают 3 или 7. И я говорю себе: «Ага, бьюсь об заклад, что ты выбрал 7». Статистически, если бы мы продолжали эту игру снова и снова и ты бы действовал, как рациональный человек, а такое происходит чаще, чем наоборот, то, вероятнее всего, ты выбрал бы 7. Но тут есть одна загвоздка: если ты не