Что представляет собой цифровая подпись в криптографии

Ответ

Цифровая подпись — это криптографический механизм, используемый для проверки подлинности и целостности цифровых данных. Она является аналогом рукописной подписи и обеспечивает три ключевых свойства безопасности:

  • Аутентификация: Гарантирует, что сообщение было создано именно владельцем закрытого ключа.
  • Целостность: Подтверждает, что данные не были изменены после подписания.
  • Неотрекаемость (Non-repudiation): Отправитель не может впоследствии отказаться от факта подписания документа.

Как это работает?

  1. Создание подписи: Хеш сообщения шифруется с помощью закрытого ключа отправителя. Результат и есть цифровая подпись.
  2. Проверка подписи: Получатель расшифровывает подпись с помощью открытого ключа отправителя, получая исходный хеш. Затем он самостоятельно вычисляет хеш полученного сообщения. Если хеши совпадают, подпись считается действительной.

Пример на Python с библиотекой cryptography

from cryptography.hazmat.primitives import hashes
from cryptography.hazmat.primitives.asymmetric import padding, rsa
from cryptography.exceptions import InvalidSignature

# 1. Генерация пары ключей (в реальном приложении ключи хранятся)
private_key = rsa.generate_private_key(
    public_exponent=65537,
    key_size=2048
)
public_key = private_key.public_key()

message = b"This is a very important message that needs to be signed."

# 2. Создание подписи с использованием закрытого ключа
signature = private_key.sign(
    message,
    padding.PSS(
        mgf=padding.MGF1(hashes.SHA256()),
        salt_length=padding.PSS.MAX_LENGTH
    ),
    hashes.SHA256()
)

# 3. Проверка подписи с использованием открытого ключа
try:
    public_key.verify(
        signature,
        message,
        padding.PSS(
            mgf=padding.MGF1(hashes.SHA256()),
            salt_length=padding.PSS.MAX_LENGTH
        ),
        hashes.SHA256()
    )
    print("Подпись верна. Целостность и аутентичность подтверждены.")
except InvalidSignature:
    print("Подпись недействительна! Данные были изменены или ключ неверный.")