Мультиподпись ed25519 (m of n)? Есть система базирующаяся на ed25519. Хотелось бы с минимальной доработкой получить мультиподпись размер которой не увеличивается с ростом участников (количество участников тысячи), публичные ключи всех возможных участников известны на момент подписи. Вначале смотрел в сторону BLS, но для них нужна отдельная кривая, с отдельными ключами. Не хотелось бы расширять кодовую базу сильно. Если я правильно понимаю то ed25519 это разновидность Шнорра (поправьте я не криптограф), и если я не ошибаюсь подписи Шнорра как раз и позволяет аггрегировать в единую подпись множество ключей. Снова таки если не ошибаюсь то происходит это за счёт дерева Меркла из публичных ключей Буду признателен за описание алгоритма с технической стороны а не в общих чертах, или рабочий пример на каком-то языке.
Да, Вы правильно понимаете. Мультиподпись 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. Надеюсь, это будет полезным для Вас. Если у Вас есть другие вопросы или нужна дополнительная помощь, пожалуйста, дайте знать.
Да, Вы правильно понимаете. Мультиподпись ed25519 (m of n) можно реализовать с использованием подписей Шнорра. Идея заключается в том, что каждый участник генерирует свою пару ключей (приватный и публичный) на основе кривой ed25519.
Для создания мультиподписи, участники создают свои собственные подписи с использованием своих приватных ключей, и затем агрегируют их в единую подпись. Это можно сделать с использованием алгоритмов агрегации подписей, таких как MuSig.
MuSig агрегирует несколько подписей в одну, сохраняя при этом размер подписи и используя общий секретный ключ для этой цели. В случае ed25519, можно использовать производное от общего секретного ключа для подписи наших собственных подписей до агрегации.
Вот пример кода на языке Python, демонстрирующий создание мультиподписи ed25519 (m of n) с использованием MuSig:
from hashlib import sha25from 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. Надеюсь, это будет полезным для Вас. Если у Вас есть другие вопросы или нужна дополнительная помощь, пожалуйста, дайте знать.