Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Лабораторная работа №3

.docx
Скачиваний:
0
Добавлен:
03.07.2026
Размер:
113.64 Кб
Скачать

МИНОБРНАУКИ РОССИИ

Федеральное государственное бюджетное образовательное учреждение

высшего образования

"Костромской государственный университет"

(КГУ)

Институт «Высшая ИТ-школа»

Кафедра защиты информации

Направление 10.03.01 - Информационная безопасность,

профиль Организация и технология защиты информации

Лабораторная работа №3

Сравнение процедур подписи ECDSA и EdDSA. 3 вариант.

Выполнил______________ Владимиров Петр Алексеевич

гр. 22-ИБбо-6

Проверил_______________ Потафеев Семен Алексеевич

Кострома 2025

Задание на лабораторную: Используя криптографическую библиотеку, создайте подписи для одного и того же сообщения с помощью ECDSA (на secp256r1) и EdDSA (Ed25519). Сравните полученные подписи по длине (в байтах). Исследуйте, является ли каждая из схем по умолчанию детерминированной (EdDSA) или вероятностной (ECDSA), создав две подписи для одного сообщения.

Сравнение алгоритмов

Для написания программы я использовал библиотеки hashlib, ec, ed25519, hashes.

Чтобы проверить какой из алгоритмов является детерминированным, а какой вероятностным я использовал один и тот же ключ. Сообщением, которое я собираюсь подписывать, является «Peter Vladimirov».

При использовании алгоритма ECDSA мы получаем подпись длиной 70-72 байта. При этом она всегда разная, что подтверждает ее вероятностное свойство.

При использовании алгоритма EdDSA подпись всегда одинакова и равна 64 байта, что доказывает ее детерминированность.

Результаты запуска программы

Рис. 1. Первый запуск

Рис. 2. Второй запуск

Как мы видим, при запуске программы с одинаковым ключом подпись ECDSA меняется, иногда даже по длине от 70-72 байт, а EdDSA всегда одинакова и по длине, и по содержанию.

Исходный код

import hashlib

from cryptography.hazmat.primitives.asymmetric import ec, ed25519

from cryptography.hazmat.primitives import hashes

seed = b"\x11" * 32

ed_priv = ed25519.Ed25519PrivateKey.from_private_bytes(seed)

ed_pub = ed_priv.public_key()

curve = ec.SECP256R1()

order = curve.group_order

secexp = int.from_bytes(hashlib.sha256(seed).digest(), "big") % order

if secexp == 0:

secexp = 1

ecdsa_priv = ec.derive_private_key(secexp, curve)

ecdsa_pub = ecdsa_priv.public_key()

message = b"Peter Vladimirov"

# ECDSA

ecdsa_sig1 = ecdsa_priv.sign(message, ec.ECDSA(hashes.SHA256()))

ecdsa_sig2 = ecdsa_priv.sign(message, ec.ECDSA(hashes.SHA256()))

# EdDSA

ed_sig1 = ed_priv.sign(message)

ed_sig2 = ed_priv.sign(message)

ecdsa_pub.verify(ecdsa_sig1, message, ec.ECDSA(hashes.SHA256()))

ecdsa_pub.verify(ecdsa_sig2, message, ec.ECDSA(hashes.SHA256()))

ed_pub.verify(ed_sig1, message)

ed_pub.verify(ed_sig2, message)

print("ECDSA sig1 len:", len(ecdsa_sig1), "hex:", ecdsa_sig1.hex())

print("ECDSA sig2 len:", len(ecdsa_sig2), "hex:", ecdsa_sig2.hex())

print("ECDSA одинаковы?", ecdsa_sig1 == ecdsa_sig2)

print("EdDSA sig1 len:", len(ed_sig1), "hex:", ed_sig1.hex())

print("EdDSA sig2 len:", len(ed_sig2), "hex:", ed_sig2.hex())

print("EdDSA одинаковы?", ed_sig1 == ed_sig2)

Контрольные вопросы

В чем заключаются основные преимущества EdDSA перед ECDSA, согласно лекции?

Ответ:

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

Основные преимущества EdDSA заключаются в следующем:

• Использование кривых в форме Эдвардса позволяет эффективно выполнять операции, обеспечивая при этом защиту от побочных каналов (например, атак по времени вычислений).

• Алгоритм реализован как детерминированная схема: для данного сообщения и закрытого ключа подпись всегда одинакова. Это исключает необходимость использования внешних источников случайности, что предотвращает широкий класс атак, связанных с плохой генерацией случайных чисел.

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