Вот, даже на Вики в статье один из возможных способов применения -
ClickТо, что цифровые подписи можно использовать для аутентификации, это понятно, но разве что - интуитивно.
Конечно же, интересуют схемы или реализации, а лучше - код.
Пока, на данный момент, лучшее что я нашёл - это
WAVES AUTH API,
которое работает при попытке подвязать WAVES-адрес на кране
H2OX.ioА DSA и RSA видимо не подойдут?
Конечно подойдут. Только там, в википедии - одна строчка лишь.
Открытый ключ всегда передается отдельно, сертификатом где помимо ключа указано какой алгоритм (ECDSA, RSA, DSA или что-то другое) использовался.
Скорее всего, они уже включены в подпись, но я чё-то не вижу где.
Как можно заметить выше - нет. Да это и по логике видно, подпись == шифрование. Если ты зашифруешь что-то ключиком который только закрывает, то получить это что-то без ключика который открывает нельзя. А если ты этот ключик который открывает положил в сундучок, а потом закрыл ключом который закрывает, то все.
А теперь, смотри сюда...
Вот
в этой строке, можно видеть, что в параметры функции проверки подписи,
помимо самой подписи и текста сообщения - входит
address подписанта:
def verify_message(address, signature, message):
Но этот адрес нужен лишь для сравнения с другим адресом -
addr:
if address == addr:
return True
При этом, вторая переменная
addr, с которым сравнивается указанный
address,
она получается из публичного ключа
public_key:
addr = public_key_to_bc_address(encode_point(public_key, compressed))
А он, в свою очередь - вычисляется из некоей точки
Qpublic_key = ecdsa.VerifyingKey.from_public_point( Q, curve = SECP256k1 )
высчитываемой из параметров
r (от которого зависит
inv_r) и
s:
Q = inv_r * ( s * R + minus_e * G )
Сами же эти параметры
r,
s (и
order) - они уже содержатся в самой цифровой подписи
sig:
r,s = util.sigdecode_string(sig[1:], order)
Точка
Q, очень похожа, на описанный тобой
сертификат,
так как при получении публичного ключа
public_key,
из неё - указывается не только алгоритм
ecdsa,
но и сама эллиптическая кривая
SECP256k1 (ну потому что их куча там, этих кривых).
Таким образом,
public_key, а значит и
addr (как
ripemd160 sha256-хэша
pub) -
они уже содержится в цифровой подписи
sig, правда - косвенно, и передаются - вместе с ней.
Поэтому,
public_key и
addr, они могут быть извлечены - только лишь из неё, из подписи
sig.
Сам же
address подписанта сообщения (даже не
pub) - он передаётся отдельно, в теле сообщения,
и нужен разве что - только для сравнения с ним, вычисленного из подписи
sig - значения
addr.
Но если не указать
address, в теле сообщения,
то проверка всё-равно может пройти
(в том смысле, что
public_key - всё-равно извлекается из подписи
sig).
Ну и следовательно, пример, указанный мною выше,
вот тут,
выдал адрес подписанта - по одной лишь подписи,
в то время как сам адрес - не был указан в подписанном сообщении,
а был вычислен из строки цифровой подписи
sig,
и просто выведен, в результате проверки - без какого-либо сравнения.