Неанонимно не болтай!
Неанонимно не болтай!

Ситуации

К примеру контрибьютер опенсорс проекта хочет рассказать о планах но при этом остаться анонимным.

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

Или просто какая-то тема запрещена для обсуждения которую очень хочется обсудить.

Как же быть? Использовать кольцевые подписи!

Кольцевая подпись

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

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

Пример подписи

Для начала создадим пару ключей. В этом примере я буду использовать OpenSSH формат для ED25519 ключей

ssh-keygen -t ed25519 -N "" -f demo

Получаем два файла: demo и demo.pub. Содержимое файла с публичным ключом:

> cat demo.pub
ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIMm1mCqNBuabE7TJtUUVvQUYQEa3TFuOShS9ytPahlx3 vasilii@carbon

и с приватным (это демо, поэтому можно смело выкладывать)

> cat demo
-----BEGIN OPENSSH PRIVATE KEY-----
b3BlbnNzaC1rZXktdjEAAAAABG5vbmUAAAAEbm9uZQAAAAAAAAABAAAAMwAAAAtzc2gtZW
QyNTUxOQAAACDJtZgqjQbmmxO0ybVFFb0FGEBGt0xbjkoUvcrT2oZcdwAAAJjU2/q/1Nv6
vwAAAAtzc2gtZWQyNTUxOQAAACDJtZgqjQbmmxO0ybVFFb0FGEBGt0xbjkoUvcrT2oZcdw
AAAEBtElLYWTIfj186r9w8EhF748GQuEVWtDs6jikaUcEK+cm1mCqNBuabE7TJtUUVvQUY
QEa3TFuOShS9ytPahlx3AAAADnZhc2lsaWlAY2FyYm9uAQIDBAUGBw==
-----END OPENSSH PRIVATE KEY-----

Теперь возьмём публичные ключи среди которых будем прятаться. Я взял пару контрибьютеров Реакта (https://github.com/facebook/react/graphs/contributors) и их публичные ключи с гитхаба https://api.github.com/users/zpao/ssh_signing_keys и https://api.github.com/users/acdlite/ssh_signing_keys

ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIM7DuT1T4hHljylm/bTFKg8cGvfafQyI6O+aB1cHM7Yp
ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIELtSHIyptiTWlcjVK5HxH+L+AvmcLM3wFNOi7Yqg7UW

Добавим к ним мой публичный ключ, допустим, на последнее место, убрав при этом часть с именем (она работает как коммент):

ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIM7DuT1T4hHljylm/bTFKg8cGvfafQyI6O+aB1cHM7Yp
ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIELtSHIyptiTWlcjVK5HxH+L+AvmcLM3wFNOi7Yqg7UW
ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIMm1mCqNBuabE7TJtUUVvQUYQEa3TFuOShS9ytPahlx3

Создать и проверить кольцевую подпись можно на сайте https://cryptopoll.org/sign поэтому идём туда, импортируем наш приватный ключ (всё происходит на фронтэнде, ключ по сети никуда не уходит), в левое поле пишем сообщение, в правое список публичных ключей:

Подписываем сообщение
Подписываем сообщение

Получаем подписанное сообщение:

{"m":"Hello Habr, this is my secret message!",
 "mh":"2d84e3b802b62840ff08025d06f3fe03e0c1d67314b2af473c92108318b44452",
 "pkh":"b7822daca942eafac5e614063f5377ea3e2980baadfd57d02092aac799711a9f",
 "sig":{"II":"650bf8d4a6fa616a2e68b11bf0d23735668328aa850f50a14c46017c882d32de",
        "cc":"6180a0d3d2dcf5dde4892d7e4ba62e22a8217f8691d468471f6aee57aa2ded0e",
        "ss":["2eb3080ebab3bd418c81fd220df62b2ab2f2dc4c8848f2f5c98290be66b46e0a",
              "7d5b5e5218b4601ab0316869a51077dfe3f62e19956aaccfee39e26d011b5502",
              "093fa9e5c809120f71b95f92c3eecee42e4be5499470c238a5f8942966b8bc03"
             ]}}

Теперь можно его отправить кому-нибудь вместе с списком публичных ключей:

Всем привет, вот сообщение подписанное кем-то из нас:

{"m":"Hello Habr, this is my secret message!","mh":"2d84e3b802b62840ff08025d06f3fe03e0c1d67314b2af473c92108318b44452","pkh":"b7822daca942eafac5e614063f5377ea3e2980baadfd57d02092aac799711a9f","sig":{"II":"650bf8d4a6fa616a2e68b11bf0d23735668328aa850f50a14c46017c882d32de","cc":"6180a0d3d2dcf5dde4892d7e4ba62e22a8217f8691d468471f6aee57aa2ded0e","ss":["2eb3080ebab3bd418c81fd220df62b2ab2f2dc4c8848f2f5c98290be66b46e0a","7d5b5e5218b4601ab0316869a51077dfe3f62e19956aaccfee39e26d011b5502","093fa9e5c809120f71b95f92c3eecee42e4be5499470c238a5f8942966b8bc03"]}}

Публичные ключи были использованны вот эти, то, что они принадлежат нам можно проверить на гитхабе
ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIM7DuT1T4hHljylm/bTFKg8cGvfafQyI6O+aB1cHM7Yp
ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIELtSHIyptiTWlcjVK5HxH+L+AvmcLM3wFNOi7Yqg7UW
ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIMm1mCqNBuabE7TJtUUVvQUYQEa3TFuOShS9ytPahlx3

Любой получатель может проверить что ключи действительно есть на гитхабе и что подпись верная посетив https://cryptopoll.org/verify

Проверяем подпись
Проверяем подпись
Подпись верна!
Подпись верна!

Что это вообще за сайт?

Кольцевые подписи были придуманы достаточно давно, более 20 лет назад. В реальном мире эти подписи используются в криптовалюте Monero которая обеспечивает полную анонимность. Т.к. криптовалюта стоит реальных денег как и её анонимность, то к такому криптокоду предъявляются особо высокие требования по безопасности. До сих пор нет известного метода взлома или деанонимизации кольцевых подписей и их реализации в Monero. Сайт выше это просто копипаста кода из криптовалюты в WebAssembly, один-в-один как в транзакциях криптовалюты.

Один автор сообщения или разные?

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

Например, вот еще одно сообщение (используется то же самое кольцо публичных ключей):

{"m":"Hi, this is my second message!",
 "mh":"297c352910c386aac52c171beef2099a58432f6307cc7cf67709b48498168af8",
 "pkh":"b7822daca942eafac5e614063f5377ea3e2980baadfd57d02092aac799711a9f",
 "sig":{"II":"650bf8d4a6fa616a2e68b11bf0d23735668328aa850f50a14c46017c882d32de",
        "cc":"190394d0406ec4b2ef04b38f8a86f93a0682cbdd39f3caa4d7e881c723a6fd07",
        "ss":["20054842302128c11edc6ec9d806791017c3bbd1f45733ac6a28bb04184bf20d",
              "a727e3cb30cdf8e360921ae6f5eca512e7148181322e24f1625aa0c239ac1409",
              "70318a843f7e9a052e0f4bff9ccdf69d47558046a0b89d979e8dff1db900110f"
             ]}}

При проверке подписи мы видим что key image 650bf8d4a6fa616a2e68b11bf0d23735668328aa850f50a14c46017c882d32de точно такой же как и раньше поэтому мы понимаем что автор у этих сообщений один:

Подпись верная и key image такой же
Подпись верная и key image такой же

Соответственно, когда key image разный то мы можем быть уверены что авторы разные.

В Monero этот key image используется для того, чтобы не допустить двойных трат.

Еще возможные применения кольцевой подписи

Помимо приведённых в самом начале примеров этот крипрографический подход можно использовать для организации выборов или сбора обратной связи. Анонимность обеспечивается кольцом, а наличие key image обеспечивает защиту от двойного голосования.

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

Прямо сейчас я уже могу взять ключи своих коллег с гитхаба, взять свой гитхаб ключ, сделать сообщение к примеру "Мой начальник хороший", и распространить это сообщение на форумах или в сайтах наподобие glassdoor. В таком случае обвинения в накрутке будут необоснованными потому что это действительно сообщение от какого-то сотрудника. Так же в том числе если отзыв отрицательный то компании уже будет не отвертеться происками конкурентов!

Итого

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

Комментарии (4)


  1. qw1
    20.10.2024 18:24

    key image это уязвимость, потому что начальник может потребовать: а давай подпиши безобидное сообщение "hello world", чтобы доказать, что это не ты автор ереси. И если все так сделают, кроме одного, авторство этого "одного" будет доказано.


    1. roginvs Автор
      20.10.2024 18:24

      Действительно. В таком случае можно использовать вариант кольцевой подписи без key image (он тоже реализован в Monero но пока что не на сайте)


  1. Pi-man
    20.10.2024 18:24

    А сколько ключей максимум в кольце может быть?


    1. roginvs Автор
      20.10.2024 18:24

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