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