Мультиподпись ed25519 (m of n)? Есть система базирующаяся на ed25519. Хотелось бы с минимальной доработкой получить мультиподпись размер которой не увеличивается с ростом участников (количество участников тысячи), публичные ключи всех возможных участников известны на момент подписи. Вначале смотрел в сторону BLS, но для них нужна отдельная кривая, с отдельными ключами. Не хотелось бы расширять кодовую базу сильно. Если я правильно понимаю то ed25519 это разновидность Шнорра (поправьте я не криптограф), и если я не ошибаюсь подписи Шнорра как раз и позволяет аггрегировать в единую подпись множество ключей. Снова таки если не ошибаюсь то происходит это за счёт дерева Меркла из публичных ключей Буду признателен за описание алгоритма с технической стороны а не в общих чертах, или рабочий пример на каком-то языке.

23 Июн 2021 в 20:08
302 +1
1
Ответы
1

Да, Вы правильно понимаете. Мультиподпись ed25519 (m of n) можно реализовать с использованием подписей Шнорра. Идея заключается в том, что каждый участник генерирует свою пару ключей (приватный и публичный) на основе кривой ed25519.

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

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

Вот пример кода на языке Python, демонстрирующий создание мультиподписи ed25519 (m of n) с использованием MuSig:

from hashlib import sha25
from ed25519.public_key import PublicKe
from ed25519 import SigningKey, VerifyingKe
# Генерация приватных и публичных ключей для каждого участник
signing_keys = [SigningKey(seed) for seed in range(1, n+1)
verifying_keys = [k.get_verifying_key() for k in signing_keys
# Создание подписей каждым участнико
messages = [b'message'] *
signatures = [k.sign(bytes(message)) for k, message in zip(signing_keys, messages)
# Агрегация подписе
R = sum(k.get_verifying_key().to_bytes() for k in signing_keys
hash_R = sha256(R).digest(
challenge = sha256(hash_R + b''.join(messages)).digest(
s = sum(k.get_verifying_key().to_bytes() * k.sign_challenge(challenge).s for k in signing_keys
mu_sig = PublicKey(s, R
# Проверка мультиподпис
assert mu_sig.verify_challenge(challenge
print("Мультиподпись успешно создана и проверена!")

Это простой пример реализации мультиподписи ed25519 (m of n) с использованием MuSig на языке Python. Надеюсь, это будет полезным для Вас. Если у Вас есть другие вопросы или нужна дополнительная помощь, пожалуйста, дайте знать.

17 Апр в 15:49
Не можешь разобраться в этой теме?
Обратись за помощью к экспертам
Название заказа не должно быть пустым
Введите email
Бесплатные доработки
Гарантированные бесплатные доработки
Быстрое выполнение
Быстрое выполнение от 2 часов
Проверка работы
Проверка работы на плагиат
Интересные статьи из справочника
Поможем написать учебную работу
Название заказа не должно быть пустым
Введите email
Доверьте свою работу экспертам
Разместите заказ
Наша система отправит ваш заказ на оценку 90 700 авторам
Первые отклики появятся уже в течение 10 минут
Прямой эфир