Безопасные многосторонние вычисления (также известные как безопасные вычисления , многосторонние вычисления ( MPC ) или вычисления с сохранением конфиденциальности ) — это подраздел криптографии, целью которого является создание методов, позволяющих сторонам совместно вычислять функцию над своими входными данными, сохраняя эти входные данные конфиденциальными. [1] В отличие от традиционных криптографических задач, где криптография обеспечивает безопасность и целостность связи или хранения, а злоумышленник находится вне системы участников (подслушиватель отправителя и получателя), криптография в этой модели защищает конфиденциальность участников друг от друга.
Основа для безопасных многосторонних вычислений началась в конце 1970-х годов с работы над ментальным покером, криптографической работой, которая имитирует игровые/вычислительные задачи на расстоянии без необходимости доверенной третьей стороны. Традиционно криптография была связана с сокрытием контента, в то время как этот новый тип вычислений и протоколов заключается в сокрытии частичной информации о данных при вычислении с данными из многих источников и корректном создании выходных данных. К концу 1980-х годов Майкл Бен-Ор, Шафи Голдвассер и Ави Вигдерсон, а также независимо Дэвид Чаум, Клод Крепо и Иван Дамгард опубликовали статьи, показывающие, «как безопасно вычислить любую функцию в условиях защищенных каналов».
Специальные протоколы для конкретных задач появились в конце 1970-х годов. [2] Позднее безопасные вычисления были официально введены как безопасные двухсторонние вычисления (2PC) в 1982 году (для так называемой проблемы миллионеров , конкретной проблемы, которая является булевым предикатом), и в общем случае (для любого возможного вычисления) в 1986 году Эндрю Яо . [3] [4] Эта область также называется безопасной оценкой функций (SFE). Двухсторонний случай был обобщен на многосторонний Одедом Голдрайхом, Сильвио Микали и Ави Вигдерсоном. Вычисление основано на секретном совместном использовании всех входных данных и доказательствах с нулевым разглашением для потенциально вредоносного случая, где большинство честных игроков в случае злонамеренного противника гарантируют, что плохое поведение обнаружено, и вычисления продолжаются с устранением нечестного человека или раскрытием его входных данных. Эта работа предложила очень простую общую схему, которой должны следовать по существу все будущие многосторонние протоколы для безопасных вычислений. [5] В этой работе был представлен подход, известный как парадигма GMW, для компиляции многостороннего вычислительного протокола, который защищен от получестных противников, в протокол, который защищен от злонамеренных противников. За этой работой последовал первый надежный безопасный протокол, который великодушно допускает ошибочное поведение, не раскрывая чьи-либо выходные данные, посредством работы, которая изобрела для этой цели часто используемую «идею доли акций» [6] и протокол, который позволяет одной из сторон безусловно скрывать свой вход. [7] Парадигма GMW считалась неэффективной в течение многих лет из-за огромных накладных расходов, которые она привносит в базовый протокол. Однако показано, что можно достичь эффективных протоколов [8] , и это делает это направление исследований еще более интересным с практической точки зрения. Вышеуказанные результаты относятся к модели, в которой противник ограничен вычислениями за полиномиальное время и наблюдает за всеми коммуникациями, и поэтому модель называется «вычислительной моделью». Кроме того, было показано, что протокол забывчивой передачи является полным для этих задач. [9] Приведенные выше результаты показывают, что при указанных выше вариациях возможно достижение безопасных вычислений, когда большинство пользователей являются честными.
Следующим вопросом, который нужно было решить, был случай защищенных каналов связи, где связь точка-точка недоступна для противника; в этом случае было показано, что решения могут быть достигнуты, когда до 1/3 сторон ведут себя ненадлежащим образом и злонамеренно, и решения не применяют криптографические инструменты (поскольку доступна защищенная связь). [10] [11] Добавление широковещательного канала позволяет системе допускать до 1/2 ненадлежащего меньшинства, [12] тогда как ограничения подключения на графе связи были исследованы в книге «Идеально безопасная передача сообщений». [13]
С течением лет понятие многосторонних протоколов общего назначения стало плодородной областью для исследования основных и общих свойств протоколов, таких как универсальная компоновка или мобильный противник, как в случае проактивного обмена секретами . [14]
С конца 2000-х годов и, конечно, с 2010 года и далее область протоколов общего назначения перешла к решению задач по повышению эффективности протоколов с учетом практических приложений. Предлагаются все более эффективные протоколы для MPC, и теперь MPC можно рассматривать как практическое решение различных реальных проблем (особенно тех, которые требуют только линейного обмена секретами и в основном локальных операций над акциями с небольшим взаимодействием между сторонами), таких как распределенное голосование, частные торги и аукционы, обмен функциями подписи или дешифрования и поиск частной информации . [15] Первым крупномасштабным и практическим применением многосторонних вычислений стало проведение электронного двойного аукциона на датском аукционе сахарной свеклы , который состоялся в январе 2008 года. [16] Очевидно, что необходимы как теоретические понятия и исследования, так и прикладные конструкции (например, условия для перемещения MPC в часть повседневного бизнеса были предложены и представлены в [17] ).
В 2020 году ряд компаний, работающих в сфере безопасных многосторонних вычислений, основали альянс MPC с целью «ускорить осведомленность, принятие и внедрение технологии MPC».
В MPC заданное число участников, p 1 , p 2 , ..., p N , имеют каждый из своих личных данных , соответственно d 1 , d 2 , ..., d N . Участники хотят вычислить значение публичной функции на основе этих личных данных: F(d 1 , d 2 , ..., d N ), сохраняя при этом свои собственные входные данные в секрете.
Например, предположим, что у нас есть три участника: Алиса, Боб и Чарли, с соответствующими входами x, y и z, обозначающими их зарплаты. Они хотят узнать самую высокую из трех зарплат, не раскрывая друг другу, сколько каждый из них зарабатывает. Математически это означает, что они вычисляют:
Если бы была какая-то доверенная внешняя сторона (скажем, у них был общий друг Тони, который, как они знали, мог хранить секреты), каждый из них мог бы сказать свою зарплату Тони, он мог бы вычислить максимум и сообщить это число всем им. Цель MPC — разработать протокол, в котором, обмениваясь сообщениями только друг с другом, Алиса, Боб и Чарли все еще могли бы узнать F(x, y, z), не раскрывая, кто что делает, и не полагаясь на Тони. Они не должны узнать больше, занимаясь своим протоколом, чем они узнали бы, взаимодействуя с неподкупным, абсолютно заслуживающим доверия Тони.
В частности, все, что стороны могут узнать, это то, что они могут узнать из выходных данных и своих собственных входных данных. Так, в приведенном выше примере, если выходными данными является z , то Чарли узнает, что его z является максимальным значением, тогда как Алиса и Боб узнают (если x , y и z различны), что их входные данные не равны максимуму, и что удерживаемый максимум равен z . Базовый сценарий можно легко обобщить до случая, когда у сторон есть несколько входных данных и выходных данных, а функция выводит разные значения для разных сторон.
Неформально говоря, наиболее основными свойствами, которые должен обеспечивать протокол многосторонних вычислений, являются:
Существует широкий спектр практических приложений, варьирующихся от простых задач, таких как подбрасывание монеты, до более сложных, таких как электронные аукционы (например, вычисление рыночной клиринговой цены), электронное голосование или интеллектуальный анализ данных с сохранением конфиденциальности. Классический пример — задача миллионеров: два миллионера хотят узнать, кто из них богаче, таким образом, чтобы ни один из них не узнал чистую стоимость другого. Решение этой ситуации по сути заключается в безопасной оценке функции сравнения.
Многосторонний протокол вычислений должен быть безопасным, чтобы быть эффективным. В современной криптографии безопасность протокола связана с доказательством безопасности. Доказательство безопасности — это математическое доказательство, в котором безопасность протокола сводится к безопасности его базовых примитивов. Тем не менее, не всегда возможно формализовать проверку безопасности криптографического протокола на основе знаний сторон и корректности протокола. Для протоколов MPC среда, в которой работает протокол, связана с парадигмой реального мира/идеального мира. [18] Нельзя сказать, что стороны ничему не учатся, поскольку им необходимо узнать выходные данные операции, а выходные данные зависят от входных данных. Кроме того, корректность выходных данных не гарантируется, поскольку корректность выходных данных зависит от входных данных сторон, а входные данные должны предполагаться корректными.
Парадигма реального мира/идеального мира утверждает два мира: (i) В модели идеального мира существует неподкупная доверенная сторона, которой каждый участник протокола отправляет свои входные данные. Эта доверенная сторона вычисляет функцию самостоятельно и отправляет соответствующие выходные данные каждой стороне. (ii) Напротив, в модели реального мира нет доверенной стороны, и все, что могут сделать стороны, это обмениваться сообщениями друг с другом. Протокол считается безопасным, если о частных входных данных каждой стороны в реальном мире нельзя узнать больше, чем можно было бы узнать в идеальном мире. В идеальном мире стороны не обмениваются сообщениями, поэтому сообщения, обмениваемые в реальном мире, не могут раскрыть никакой секретной информации.
Парадигма реального мира/идеального мира обеспечивает простую абстракцию сложностей MPC, чтобы позволить создание приложения под предлогом того, что протокол MPC по своей сути на самом деле является идеальным исполнением. Если приложение безопасно в идеальном случае, то оно также безопасно, когда вместо него запускается реальный протокол.
Требования безопасности к протоколу MPC строгие. Тем не менее, в 1987 году было продемонстрировано, что любая функция может быть безопасно вычислена с безопасностью для злонамеренных противников [5] и других начальных работ, упомянутых ранее. Несмотря на эти публикации, MPC не был разработан достаточно эффективным для использования на практике в то время. Безусловно или теоретически безопасный MPC тесно связан и основывается на проблеме разделения секрета , и, более конкретно, проверяемого разделения секрета (VSS), который многие безопасные протоколы MPC используют против активных противников.
В отличие от традиционных криптографических приложений, таких как шифрование или подпись, необходимо предположить, что противник в протоколе MPC является одним из игроков, вовлеченных в систему (или контролирующих внутренние стороны). Эта коррумпированная сторона или стороны могут вступить в сговор, чтобы нарушить безопасность протокола. Пусть будет числом сторон в протоколе и числом сторон, которые могут быть состязательными. Протоколы и решения для случая (т. е. когда предполагается честное большинство) отличаются от тех, где такое предположение не делается. Этот последний случай включает важный случай двухсторонних вычислений, когда один из участников может быть коррумпирован, и общий случай, когда неограниченное число участников коррумпированы и вступают в сговор, чтобы атаковать честных участников.
Противники, с которыми сталкиваются различные протоколы, могут быть классифицированы в зависимости от того, насколько они готовы отклониться от протокола. По сути, есть два типа противников, каждый из которых порождает различные формы безопасности (и каждый вписывается в различные сценарии реального мира):
Защита от активных противников обычно приводит к снижению эффективности. Скрытая защита [19] — это альтернатива, которая направлена на обеспечение большей эффективности в обмен на ослабление определения безопасности; она применима к ситуациям, когда активные противники готовы обмануть, но только если их не поймают. Например, их репутация может быть испорчена, что помешает будущему сотрудничеству с другими честными сторонами. Таким образом, протоколы, которые являются скрытно безопасными, предоставляют механизмы, гарантирующие, что если некоторые из сторон не будут следовать инструкциям, то это будет замечено с высокой вероятностью, скажем, 75% или 90%. В некотором смысле, скрытые противники — это активные противники, вынужденные действовать пассивно из-за внешних некриптографических (например, деловых) проблем. Этот механизм устанавливает мост между обеими моделями в надежде найти протоколы, которые будут эффективными и достаточно безопасными на практике.
Как и многие криптографические протоколы , безопасность протокола MPC может основываться на различных предположениях:
Набор честных сторон, которые могут выполнить вычислительную задачу, связан с концепцией структуры доступа . Структуры противника могут быть статическими, когда противник выбирает своих жертв до начала многостороннего вычисления, или динамическими, когда он выбирает своих жертв в ходе выполнения многостороннего вычисления, что усложняет защиту. Структуру противника можно определить как пороговую структуру или как более сложную структуру. В пороговой структуре противник может повредить или прочитать память ряда участников до некоторого порога. Между тем, в сложной структуре он может влиять на определенные предопределенные подмножества участников, моделируя различные возможные сговоры.
Существуют существенные различия между протоколами, предлагаемыми для двухсторонних вычислений (2PC) и многосторонних вычислений (MPC). Кроме того, часто для специальных протоколов важности должен быть разработан специализированный протокол, который отличается от общих протоколов (голосование, аукционы, платежи и т. д.)
Двухсторонняя настройка особенно интересна не только с точки зрения приложений, но и потому, что в двухсторонней настройке могут применяться специальные методы, которые не применяются в многостороннем случае. Действительно, безопасное многостороннее вычисление (фактически ограниченный случай безопасной оценки функции, когда оценивается только одна функция) было впервые представлено в двухсторонней настройке. Оригинальная работа часто цитируется как одна из двух статей Яо; [20] хотя статьи на самом деле не содержат того, что сейчас известно как протокол искаженной схемы Яо .
Базовый протокол Яо защищен от получестных противников и чрезвычайно эффективен с точки зрения количества раундов, которое является постоянным и не зависит от оцениваемой целевой функции. Функция рассматривается как булева схема с входами в двоичном коде фиксированной длины. Булева схема представляет собой набор вентилей, соединенных тремя различными типами проводов: проводами входа схемы, проводами выхода схемы и промежуточными проводами. Каждый вентиль получает два входных провода и имеет один выходной провод, который может быть разветвлен (т. е. передан нескольким вентилям на следующем уровне). Простая оценка схемы выполняется путем оценки каждого вентиля по очереди; предполагая, что вентили были топологически упорядочены. Вентиль представлен в виде таблицы истинности, такой что для каждой возможной пары бит (тех, которые исходят от вентиля входных проводов) таблица назначает уникальный выходной бит; который является значением выходного провода вентиля. Результатами оценки являются биты, полученные в проводах выхода схемы.
Яо объяснил, как исказить схему (скрыть ее структуру), чтобы две стороны, отправитель и получатель, могли узнать выход схемы и ничего больше. На высоком уровне отправитель подготавливает искаженную схему и отправляет ее получателю, который, не обращая внимания, оценивает схему, изучая кодировки, соответствующие как его выходу, так и выходу отправителя. Затем он просто отправляет обратно кодировки отправителя, позволяя отправителю вычислить свою часть выходных данных. Отправитель отправляет сопоставление выходных кодировок получателя в биты получателю, позволяя получателю получить их выход.
Более подробно, искаженная схема вычисляется следующим образом. Основным ингредиентом является симметричная схема шифрования с двойным ключом. При наличии ворот схемы каждое возможное значение ее входных проводов (либо 0, либо 1) кодируется случайным числом (меткой). Значения, полученные в результате оценки ворот в каждой из четырех возможных пар входных битов, также заменяются случайными метками. Искаженная таблица истинности ворот состоит из шифровок каждой выходной метки, использующих ее входные метки в качестве ключей. Положение этих четырех шифровок в таблице истинности рандомизировано, поэтому никакая информация о вороте не утекает.
Для правильной оценки каждого искаженного гейта схема шифрования имеет следующие два свойства. Во-первых, диапазоны функции шифрования под любыми двумя различными ключами не пересекаются (с подавляющей вероятностью). Второе свойство говорит, что можно эффективно проверить, был ли данный шифротекст зашифрован под данным ключом. С этими двумя свойствами получатель, получив метки для всех входных проводов схемы, может оценить каждый гейт, сначала выяснив, какой из четырех шифротекстов был зашифрован с его ключами меток, а затем расшифровав, чтобы получить метку выходного провода. Это делается незаметно, поскольку все, что получатель узнает во время оценки, — это кодировки битов.
Входные биты отправителя (т. е. создателей схемы) могут быть просто отправлены в виде кодировок оценщику; тогда как кодировки получателя (т. е. оценщиков схемы), соответствующие его входным битам, получаются через протокол забывчивой передачи (OT) 1-из-2. Протокол OT 1-из-2 позволяет отправителю, обладающему двумя значениями C1 и C2, отправить одно, запрошенное получателем (значение ba в {1,2}), таким образом, что отправитель не знает, какое значение было передано, а получатель узнает только запрошенное значение.
Если рассматривать злонамеренных противников, необходимо предусмотреть дополнительные механизмы для обеспечения корректного поведения обеих сторон. По конструкции легко показать безопасность для отправителя, если протокол OT уже защищен от злонамеренного противника, поскольку все, что может сделать получатель, это оценить искаженную схему, которая не достигнет выходных проводов схемы, если он отклонится от инструкций. На стороне отправителя ситуация совершенно иная. Например, он может отправить неправильную искаженную схему, которая вычисляет функцию, раскрывающую входные данные получателя. Это будет означать, что конфиденциальность больше не сохраняется, но поскольку схема искажена, получатель не сможет это обнаружить. Однако можно эффективно применять доказательства с нулевым разглашением, чтобы сделать этот протокол защищенным от злонамеренных противников с небольшими накладными расходами по сравнению с получестным протоколом. [8]
Большинство протоколов MPC, в отличие от протоколов 2PC и особенно при безусловной настройке частных каналов, используют разделение секрета. В методах, основанных на разделении секрета, стороны не играют особых ролей (как в Yao, создателя и оценщика). Вместо этого данные, связанные с каждым проводом, распределяются между сторонами, а затем протокол используется для оценки каждого вентиля. Функция теперь определяется как «схема» над конечным полем, в отличие от двоичных схем, используемых для Yao. Такая схема в литературе называется арифметической схемой, и она состоит из «вентилей» сложения и умножения, где оперируемые значения определяются над конечным полем.
Разделение секрета позволяет распределить секрет между несколькими сторонами, распределяя доли каждой стороне. Обычно используются два типа схем разделения секрета: разделение секрета Шамира и аддитивное разделение секрета. В обоих случаях доли являются случайными элементами конечного поля, которые добавляются к секрету в поле; интуитивно безопасность достигается, поскольку любой неквалифицированный набор долей выглядит распределенным случайным образом.
Схемы разделения секрета могут допускать, чтобы противник контролировал до t сторон из n всех сторон, где t варьируется в зависимости от схемы, противник может быть пассивным или активным, и делаются различные предположения о мощности противника. Схема разделения секрета Шамира безопасна против пассивного противника, когда и активного противника, когда при достижении информационной теоретико-безопасности, что означает, что даже если у противника неограниченная вычислительная мощность, он не может узнать никакой информации о секрете, лежащем в основе доли. Протокол BGW [21] , который определяет, как вычислять сложение и умножение на долях секрета, часто используется для вычисления функций с долями секрета Шамира. Аддитивные схемы разделения секрета могут допускать, чтобы противник контролировал всех, кроме одной стороны, то есть , при сохранении безопасности против пассивного и активного противника с неограниченной вычислительной мощностью. Некоторые протоколы требуют фазы настройки, которая может быть безопасной только против ограниченного в вычислительном отношении противника.
Ряд систем реализовали различные формы MPC с секретными схемами разделения. Наиболее популярной является SPDZ, [22] , которая реализует MPC с аддитивными секретными разделами и защищена от активных противников.
В 2014 году была описана «модель справедливости в безопасных вычислениях, в которой противоборствующая сторона, которая прерывает работу при получении выходных данных, вынуждена платить взаимно предопределенный денежный штраф» для сети Bitcoin или для честной лотереи, и она была успешно реализована в Ethereum . [23] [24]
За последние годы было достигнуто много успехов в системах 2PC и MPC.
Одной из основных проблем при работе с протоколами на основе Yao является то, что функция, которая должна быть безопасно оценена (которая может быть произвольной программой), должна быть представлена в виде схемы, обычно состоящей из вентилей XOR и AND. Поскольку большинство реальных программ содержат циклы и сложные структуры данных, это весьма нетривиальная задача. Система Fairplay [25] была первым инструментом, разработанным для решения этой проблемы. Fairplay состоит из двух основных компонентов. Первый из них — компилятор, позволяющий пользователям писать программы на простом языке высокого уровня и выводить эти программы в виде булевой схемы. Второй компонент затем может искажать схему и выполнять протокол для безопасной оценки искаженной схемы. Помимо двусторонних вычислений на основе протокола Yao, Fairplay также может выполнять многосторонние протоколы. Это делается с помощью протокола BMR [25] , который расширяет пассивно защищенный протокол Yao до активного случая.
В последующие годы после внедрения Fairplay было создано много улучшений базового протокола Яо, в форме как улучшений эффективности, так и методов активной безопасности. Они включают такие методы, как метод свободного XOR, который позволяет значительно упростить оценку вентилей XOR, и сокращение искаженных строк, уменьшая размер искаженных таблиц с двумя входами на 25%. [26]
Подход, который до сих пор кажется наиболее плодотворным в получении активной безопасности, исходит из комбинации техники искажения и парадигмы «вырезать и выбрать». Эта комбинация, кажется, делает конструкции более эффективными. Чтобы избежать вышеупомянутых проблем в отношении нечестного поведения, множество искажений одной и той же схемы отправляется от конструктора к оценщику. Затем около половины из них (в зависимости от конкретного протокола) открываются для проверки согласованности, и если это так, то подавляющее большинство неоткрытых являются правильными с высокой вероятностью. Выход — это большинство голосов всех оценок. Здесь необходим выход большинства. Если есть разногласия по выходам, получатель знает, что отправитель мошенничает, но он не может жаловаться, так как в противном случае это приведет к утечке информации о его входе.
Этот подход к активной безопасности был инициирован Линделлом и Пинкасом. [27] Этот метод был реализован Пинкасом и др. в 2009 году. [26] Это обеспечило первую активно безопасную двухстороннюю оценку схемы Advanced Encryption Standard (AES), рассматриваемой как очень сложная (состоящая из примерно 30 000 вентилей AND и XOR), нетривиальная функция (также имеющая некоторые потенциальные приложения), требующая около 20 минут для вычисления и 160 схем для получения вероятности мошенничества.
Поскольку оценивается множество схем, стороны (включая получателя) должны подтвердить свои входные данные, чтобы гарантировать, что во всех итерациях используются одни и те же значения. Эксперименты Пинкаса и др., о которых сообщалось [26], показывают, что узкое место протокола заключается в проверках согласованности. Им пришлось отправить по сети около 6 553 600 обязательств по различным значениям для оценки схемы AES. В недавних результатах [28] эффективность активно защищенных реализаций на основе Яо была улучшена еще больше, требуя всего 40 схем и гораздо меньшее количество обязательств для получения вероятности мошенничества. Улучшения происходят из новых методологий для выполнения разрезания и выбора на переданных схемах.
В последнее время основное внимание уделяется высокопараллельным реализациям на основе искаженных схем, разработанных для работы на процессорах с большим количеством ядер. Кройтер и др. [29] описывают реализацию, работающую на 512 ядрах мощного кластерного компьютера. Используя эти ресурсы, они смогли оценить 4095-битную функцию расстояния редактирования , схема которой включает почти 6 миллиардов вентилей. Для достижения этого они разработали собственный, лучше оптимизированный компилятор схем, чем Fairplay, и несколько новых оптимизаций, таких как конвейеризация, при которой передача искаженной схемы по сети начинается, пока остальная часть схемы все еще генерируется. Время вычисления AES было сокращено до 1,4 секунд на блок в активном случае с использованием кластерной машины с 512 узлами и до 115 секунд с использованием одного узла. Шелат и Шен [30] улучшают это, используя стандартное оборудование, до 0,52 секунд на блок. В той же статье сообщается о пропускной способности 21 блок в секунду, но с задержкой 48 секунд на блок.
Между тем, другая группа исследователей исследовала использование потребительских графических процессоров для достижения схожих уровней параллелизма. [31] Они используют расширения передачи данных без уведомления и некоторые другие новые методы для разработки своего протокола, специфичного для графического процессора. Этот подход, по-видимому, достигает сопоставимой эффективности с реализацией кластерных вычислений, используя схожее количество ядер. Однако авторы сообщают только о реализации схемы AES, которая имеет около 50 000 вентилей. С другой стороны, требуемое здесь оборудование гораздо более доступно, поскольку аналогичные устройства уже могут быть найдены во многих настольных компьютерах или игровых консолях людей. Авторы получают время 2,7 секунды на блок AES на стандартном настольном компьютере со стандартным графическим процессором. Если они позволяют безопасности снизиться до чего-то похожего на скрытую безопасность, они получают время выполнения 0,30 секунды на блок AES. В случае пассивной безопасности есть сообщения об обработке схем с 250 миллионами вентилей и со скоростью 75 миллионов вентилей в секунду. [32]
Одним из основных применений безопасных многосторонних вычислений является возможность анализа данных, хранящихся несколькими сторонами, или слепого анализа данных третьими сторонами, не позволяющего хранителю данных понять тип выполняемого анализа данных.
{{cite journal}}
: CS1 maint: несколько имен: список авторов ( ссылка ){{cite journal}}
: CS1 maint: несколько имен: список авторов ( ссылка )