Кольцевая подпись: различия между версиями

Материал из Википедии — свободной энциклопедии
Перейти к навигации Перейти к поиску
[отпатрулированная версия][отпатрулированная версия]
Содержимое удалено Содержимое добавлено
Новая страница: «'''Кольцевая подпись''' ({{lang-en|ring signature}}) — анонимная электронная подпись, кото…»
 
Строка 26: Строка 26:
=== Прослеживаемая кольцевая подпись ===
=== Прослеживаемая кольцевая подпись ===
В дополнение к связываемой подписи раскрывается открытый ключ подписывающего лица. Системы [[электронное голосование|электронного голосования]] могут быть реализованы с использованием этого протокола<ref name="FS07">{{cite journal|last1=Fujisaki|first1=Eiichiro|last2=Suzuki|first2=Koutarou|title=Traceable Ring Signature|journal=Public Key Cryptography|date=2007|pages=181–200}}</ref>.
В дополнение к связываемой подписи раскрывается открытый ключ подписывающего лица. Системы [[электронное голосование|электронного голосования]] могут быть реализованы с использованием этого протокола<ref name="FS07">{{cite journal|last1=Fujisaki|first1=Eiichiro|last2=Suzuki|first2=Koutarou|title=Traceable Ring Signature|journal=Public Key Cryptography|date=2007|pages=181–200}}</ref>.

=== Криптовалюты ===
Система [[CryptoNote]] использует кольцевые подписи<ref>[https://cryptonote.org/inside#untraceable-payments CryptoNote Technology — Untraceable payments]</ref>. Впервые это было использовано в [[Bytecoin]] (BCN) в июле 2012 года<ref>[http://bravenewcoin.com/profiles/coins/bytecoin/ Bytecoin profile] Bravenewcoin.com</ref>.

Криптовалюта [[ShadowCash]] использует прослеживаемую кольцевую подпись для анонимности отправителя транзакции<ref>[http://shadow.cash/downloads/shadowcash-anon.pdf Shadow — Zero-knowledge Anonymous Distributed Electronic Cash via Traceable Ring Signatures]</ref>. Однако они были первоначально реализованы неправильно, что привело к частичной де-анонимизации ShadowCash с их первой реализации до февраля 2016 года<ref>[https://shnoe.wordpress.com/2016/02/11/de-anonymizing-shadowcash-and-oz-coin/ Broken Crypto in Shadowcash]</ref>. Правда, только 20 % всех ключей в системе были затронуты этой ошибкой, анонимность отправителя была скомпрометирована, но анонимность получателя осталась незатронутой.

== Эффективность ==
Большинство предложенных алгоритмов имеют [[«O» большое и «o» малое|асимптотический]] размер выхода <math>O(n)</math>, то есть размер результирующей подписи увеличивается линейно с размером ввода (количества открытых ключей). Это означает, что такие схемы нецелесообразны для реальных случаев использования с достаточно большими <math>n</math> (например, электронное голосование с миллионами участников). Но для некоторого применения с относительно небольшим средним размером ввода это может быть приемлемо. [[CryptoNote]] реализует кольцевые подписи в платежах [[p2p]], чтобы обеспечить возможность отслеживания отправителя<ref name="FS07" />.

В последнее время появились более эффективные алгоритмы. Существуют схемы с сублинейным размером подписи<ref>{{cite journal|last1=Fujisaki|first1=Eiichiro|title=Sub-linear size traceable ring signatures without random oracles|journal=CTRSA|date=2011|pages=393–415}}</ref>, а также с постоянным размером<ref>{{cite journal|last1=Au|first1=Man Ho|last2=Liu|first2=Joseph K.|last3=Susilo|first3=Willy|last4=Yuen|first4=Tsz Hon|title=Constant-Size ID-Based Linkable and Revocable-iff-Linked Ring Signature|journal=Lecture Notes in Computer Science|date=2006|volume=4329|pages=364–378|doi=10.1007/11941378_26}}</ref>.

== Реализация ==
Ниже приведена реализация исходного описания на языке [[Python]] с использованием [[RSA]].

<source lang="python">
import os, hashlib, random, Crypto.PublicKey.RSA

class ring:
def __init__(self, k, L=1024):
self.k = k
self.l = L
self.n = len(k)
self.q = 1 << (L - 1)

def sign(self, m, z):
self.permut(m)
s = [None] * self.n
u = random.randint(0, self.q)
c = v = self.E(u)
for i in (range(z+1, self.n) + range(z)):
s[i] = random.randint(0, self.q)
e = self.g(s[i], self.k[i].e, self.k[i].n)
v = self.E(v^e)
if (i+1) % self.n == 0:
c = v
s[z] = self.g(v^u, self.k[z].d, self.k[z].n)
return [c] + s

def verify(self, m, X):
self.permut(m)
def _f(i):
return self.g(X[i+1], self.k[i].e, self.k[i].n)
y = map(_f, range(len(X)-1))
def _g(x, i):
return self.E(x^y[i])
r = reduce(_g, range(self.n), X[0])
return r == X[0]

def permut(self, m):
self.p = int(hashlib.sha1('%s' % m).hexdigest(),16)

def E(self, x):
msg = '%s%s' % (x, self.p)
return int(hashlib.sha1(msg).hexdigest(), 16)

def g(self, x, e, n):
q, r = divmod(x, n)
if ((q + 1) * n) <= ((1 << self.l) - 1):
rslt = q * n + pow(r, e, n)
else:
rslt = x
return rslt
</source>

Подпись и проверка 2 сообщений при кольце из 4 пользователей:

<source lang="python">
size = 4
msg1, msg2 = 'hello', 'world!'

def _rn(_):
return Crypto.PublicKey.RSA.generate(1024, os.urandom)

key = map(_rn, range(size))
r = ring(key)
for i in range(size):
s1 = r.sign(msg1, i)
s2 = r.sign(msg2, i)
assert r.verify(msg1, s1) and r.verify(msg2, s2) and not r.verify(msg1, s2)
</source>



== Примечания ==
== Примечания ==

Версия от 14:30, 18 сентября 2017

Кольцевая подпись (англ. ring signature) — анонимная электронная подпись, которую может анонимно выполнить любой из членов некоторой группы (кольца) пользователей. Кольцевая подпись подтверждает, что её наложил один из членов группы, но при этом не будет доподлинно известно, кто именно. Каждый из участников группы имеет свой уникальный ключ, но невозможно вычислить, какой из ключей использовался для создания подписи.

Кольцевые подписи изобрели Рон Ривест, Ади Шамир и Яэль Тауман (англ. Yael Tauman), которые представили свою разработку в 2001 году на международной конференции Asiacrypt[1].

Кольцевые подписи похожи на групповые подписи, но отличаются двумя ключевыми особенностями:

  • нет возможности отменить анонимность отдельной подписи;
  • любая группа пользователей может использоваться как кольцо без дополнительной настройки.

Описание

Каждая группа участников имеет пары из открытых (приватных) и закрытых (секретных) ключей, P1, S1), (P2, S2), …, (Pn, Sn. Любой участник i может создать кольцевую подпись σ для сообщения m, используя только свой закрытый ключ и открытые ключи остальных членов группы (даже без их ведома), подав на вход функции (m, Si, P1, …, Pn). Любой желающий может убедиться в действительности кольцевой подписи, используя σ, m и список открытых ключей P1, …, Pn. С другой стороны, для постороннего должно быть невозможно или крайне сложно создать кольцевую подпись для любого сообщения для любой группы, не зная ни одного из закрытых ключей участников этой группы[2].

Использование

Схема кольцевой подписи

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

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

Позднее появились работы, в которых были предложены новые функции и варианты применения.

Пороговые кольцевые подписи

В отличие от стандартной пороговой подписи?! «t-out-of-n», когда t из n пользователей должны сотрудничать для дешифрования сообщения, этот вариант кольцевой подписи требует, чтобы t пользователей сотрудничали в процессе подписания. Для этого t участников (i1, i2, ..., it) должны вычислить сигнатуру σ для сообщения m подав на вход n открытых ключей (m, Si1, Si2, ..., Sit, P1, ..., Pn)[3].

Связываемые кольцевые подписи

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

Прослеживаемая кольцевая подпись

В дополнение к связываемой подписи раскрывается открытый ключ подписывающего лица. Системы электронного голосования могут быть реализованы с использованием этого протокола[5].

Криптовалюты

Система CryptoNote использует кольцевые подписи[6]. Впервые это было использовано в Bytecoin (BCN) в июле 2012 года[7].

Криптовалюта ShadowCash использует прослеживаемую кольцевую подпись для анонимности отправителя транзакции[8]. Однако они были первоначально реализованы неправильно, что привело к частичной де-анонимизации ShadowCash с их первой реализации до февраля 2016 года[9]. Правда, только 20 % всех ключей в системе были затронуты этой ошибкой, анонимность отправителя была скомпрометирована, но анонимность получателя осталась незатронутой.

Эффективность

Большинство предложенных алгоритмов имеют асимптотический размер выхода , то есть размер результирующей подписи увеличивается линейно с размером ввода (количества открытых ключей). Это означает, что такие схемы нецелесообразны для реальных случаев использования с достаточно большими (например, электронное голосование с миллионами участников). Но для некоторого применения с относительно небольшим средним размером ввода это может быть приемлемо. CryptoNote реализует кольцевые подписи в платежах p2p, чтобы обеспечить возможность отслеживания отправителя[5].

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

Реализация

Ниже приведена реализация исходного описания на языке Python с использованием RSA.

import os, hashlib, random, Crypto.PublicKey.RSA

class ring:
    def __init__(self, k, L=1024):
        self.k = k
        self.l = L
        self.n = len(k)
        self.q = 1 << (L - 1)

    def sign(self, m, z):
        self.permut(m)
        s = [None] * self.n
        u = random.randint(0, self.q)
        c = v = self.E(u) 
        for i in (range(z+1, self.n) + range(z)):
            s[i] = random.randint(0, self.q)
            e = self.g(s[i], self.k[i].e, self.k[i].n)
            v = self.E(v^e) 
            if (i+1) % self.n == 0:
                c = v
        s[z] = self.g(v^u, self.k[z].d, self.k[z].n)
        return [c] + s

    def verify(self, m, X):
        self.permut(m)
        def _f(i):
            return self.g(X[i+1], self.k[i].e, self.k[i].n)
        y = map(_f, range(len(X)-1))
        def _g(x, i):
            return self.E(x^y[i])
        r = reduce(_g, range(self.n), X[0])
        return r == X[0]

    def permut(self, m):
        self.p = int(hashlib.sha1('%s' % m).hexdigest(),16)

    def E(self, x): 
        msg = '%s%s' % (x, self.p)
        return int(hashlib.sha1(msg).hexdigest(), 16)

    def g(self, x, e, n):
        q, r = divmod(x, n)
        if ((q + 1) * n) <= ((1 << self.l) - 1):
            rslt = q * n + pow(r, e, n)
        else:
            rslt = x
        return rslt

Подпись и проверка 2 сообщений при кольце из 4 пользователей:

size = 4
msg1, msg2 = 'hello', 'world!'

def _rn(_):
  return Crypto.PublicKey.RSA.generate(1024, os.urandom)

key = map(_rn, range(size))
r = ring(key)
for i in range(size):
    s1 = r.sign(msg1, i)
    s2 = r.sign(msg2, i)
    assert r.verify(msg1, s1) and r.verify(msg2, s2) and not r.verify(msg1, s2)


Примечания

  1. How to leak a secret, Рон Ривест, Ади Шамир, Yael Tauman, Asiacrypt 2001. Volume 2248 of Lecture Notes in Computer Science, pages 552—565.
  2. Debnath, Ashmita; Singaravelu, Pradheepkumar; Verma, Shekhar (19 December 2012). "Efficient spatial privacy preserving scheme for sensor network". Central European Journal of Engineering. 3 (1): 1—10. doi:10.2478/s13531-012-0048-7.
  3. E. Bresson; J. Stern; M. Szydlo (2002). "Threshold ring signatures and applications to ad-hocgroups" (PDF). Advances in Cryptology: Crypto 2002: 465—480.
  4. Liu, Joseph K.; Wong, Duncan S. (2005). "Linkable ring signatures: Security models and new schemes". ICCSA. 2: 614—623. doi:10.1007/11424826_65.
  5. 1 2 Fujisaki, Eiichiro; Suzuki, Koutarou (2007). "Traceable Ring Signature". Public Key Cryptography: 181—200.
  6. CryptoNote Technology — Untraceable payments
  7. Bytecoin profile Bravenewcoin.com
  8. Shadow — Zero-knowledge Anonymous Distributed Electronic Cash via Traceable Ring Signatures
  9. Broken Crypto in Shadowcash
  10. Fujisaki, Eiichiro (2011). "Sub-linear size traceable ring signatures without random oracles". CTRSA: 393—415.
  11. Au, Man Ho; Liu, Joseph K.; Susilo, Willy; Yuen, Tsz Hon (2006). "Constant-Size ID-Based Linkable and Revocable-iff-Linked Ring Signature". Lecture Notes in Computer Science. 4329: 364—378. doi:10.1007/11941378_26.