МИНИСТЕРСТВО ОБРАЗОВАНИЯ И НАУКИ РОССИЙСКОЙ ФЕДЕРАЦИИ ФГБОУ ВО «ХТУ» ОТЧЁТ Лабораторная работа 3 по дисциплине «Системы распределенных реестров в информационной безопасности» Изучение основ шифрования, используемого в блокчейне Выполнил(а) студент(ка) 2ИБ группы_______________ ФИО_________________ Геническ, 2024 год. Что такое криптография с публичным ключом и как она работает? Криптография с публичным ключом, также известная как асимметричная криптография, — это метод шифрования, который использует пару ключей: публичный ключ и приватный ключ. Эти ключи математически связаны между собой, но вычислительно сложно определить приватный ключ, зная только публичный ключ. Как работает криптография с публичным ключом: 1. Создание ключевой пары: Когда пользователь хочет начать использовать асимметричное шифрование, он генерирует пару ключей. Публичный ключ предназначен для распространения и может быть известным всем, кто хочет отправить сообщение пользователю. Приватный ключ хранится в секрете и известен только владельцу. 2. Шифрование сообщения: Чтобы отправить сообщение пользователю, отправитель берет публичный ключ получателя и использует его для шифрования данных. После шифрования сообщение может быть расшифровано только с помощью соответствующего приватного ключа, который имеет только получатель. 3. Расшифровка сообщения: Получатель использует свой приватный ключ для расшифровки полученного сообщения. Так как приватный ключ связан с публичным ключом математически, только он может успешно расшифровать сообщение, зашифрованное с помощью публичного ключа. Примеры использования: Электронная почта: Шифрование электронных писем с использованием публичных и приватных ключей для обеспечения конфиденциальности и целостности сообщений. Цифровые подписи: Приватный ключ используется для создания цифровой подписи, которая удостоверяет личность отправителя и целостность сообщения. Публичный ключ используется для проверки подписи. Блокчейн и криптовалюты: Асимметричное шифрование используется для управления транзакциями и обеспечения безопасности в системах, таких как Bitcoin. Криптография с публичным ключом является фундаментальной технологией в современной информационной безопасности, обеспечивая защиту данных и аутентификацию в цифровом мире. Для чего используется ЭЦПУ в блокчейне? Электронная цифровая подпись (ЭЦПУ) играет важную роль в блокчейне и используется для следующих целей: 1. Аутентификация: ЭЦПУ позволяет подтвердить, что транзакция была инициирована действительным владельцем кошелька. Когда пользователь подписывает транзакцию своим приватным ключом, он создает цифровую подпись, которая может быть проверена с использованием его публичного ключа. Если подпись совпадает с публичным ключом, это доказывает, что транзакция была действительно инициирована владельцем приватного ключа. 2. Неотрекаемость: Поскольку только владелец приватного ключа может создать действительную цифровую подпись, ЭЦПУ предотвращает отказ от авторства транзакции. Это означает, что после подтверждения транзакции в блокчейне, пользователь не может заявить, что он не инициировал ее. 3. Целостность данных: ЭЦПУ гарантирует, что данные транзакции не были изменены после того, как они были подписаны. Если даже один бит данных изменится, цифровая подпись не будет соответствовать, и транзакция будет признана недействительной. 4. Безопасность: Использование ЭЦПУ в сочетании с криптографией с публичным ключом обеспечивает высокий уровень безопасности транзакций. Это делает практически невозможным фальсификацию или подделку транзакций без доступа к приватному ключу. В блокчейне, таком как Bitcoin или Ethereum, каждая транзакция сопровождается цифровой подписью, созданной с использованием приватного ключа отправителя. Когда транзакция распространяется в сети, другие узлы проверяют эту подпись, используя публичный ключ отправителя, чтобы убедиться в ее действительности и законности. Этот процесс является основным механизмом, который поддерживает целостность и безопасность блокчейна. Опишите процесс генерации ключевой пары ЭЦПУ. Генерация ключевой пары в контексте электронной цифровой подписи (ЭЦПУ) включает в себя создание пары ключей: публичного и приватного. Эти ключи математически связаны, но вычислительно сложно определить приватный ключ, зная только публичный ключ. Вот шаги, которые обычно выполняются при генерации ключевой пары: 1. Выбор кривой и модуля: В системах ЭЦПУ, таких как RSA или ECDSA, используются определенные математические конструкции. Например, в ECDSA (Elliptic Curve Digital Signature Algorithm) выбирается эллиптическая кривая и точка на этой кривой, которая используется в качестве базовой точки для генерации ключей. 2. Генерация приватного ключа: Приватный ключ обычно представляет собой случайно сгенерированное большое число. В случае ECDSA это число должно быть меньше, чем порядок базовой точки на эллиптической кривой. Приватный ключ должен храниться в секрете, так как он используется для создания цифровых подписей. 3. Вычисление публичного ключа: Публичный ключ вычисляется на основе приватного ключа и выбранной математической конструкции. В ECDSA публичный ключ получается путем умножения базовой точки на эллиптической кривой на приватный ключ. Результат этой операции является точкой на кривой, которая и представляет собой публичный ключ. 4. Проверка ключевой пары: После генерации ключевой пары проводится проверка, чтобы убедиться в корректности вычислений. Это может включать в себя проверку, что публичный ключ действительно может быть получен из приватного ключа с использованием выбранной математической конструкции. 5. Хранение ключей: Приватный ключ должен быть сохранен в безопасном месте, так как потеря приватного ключа может привести к невозможности подтверждения владения активами или данными. Публичный ключ, напротив, может быть свободно распространен, так как он используется для проверки подписей, созданных приватным ключом. Генерация ключевой пары является первым шагом для любого пользователя, желающего использовать ЭЦПУ для защиты данных или проведения транзакций в сети, например, в блокчейне. Как происходит подпись сообщения и верификация подписи? Подпись сообщения и верификация подписи в контексте электронной цифровой подписи (ЭЦПУ) включают в себя несколько шагов, которые гарантируют, что сообщение действительно было отправлено конкретным пользователем и не было изменено в процессе передачи. Вот как это происходит: Подпись сообщения 1. Создание хэша сообщения: Прежде чем подписывать сообщение, оно преобразуется в хэш — уникальную строку фиксированной длины, которая представляет содержимое сообщения. Это делается с помощью алгоритма хэширования, такого как SHA-256. 2. Подписание хэша: Затем владелец приватного ключа использует его для подписи хэша сообщения. Этот процесс зависит от используемого алгоритма ЭЦПУ, например, в ECDSA это выполняется с использованием математических операций на эллиптической кривой. Результатом является цифровая подпись, которая обычно состоит из двух компонентов: r и s. 3. Отправка сообщения и подписи: Сообщение вместе с цифровой подписью отправляется получателю. Сообщение отправляется в открытом виде, а подпись — это результат подписи хэша сообщения. Верификация подписи 1. Получение сообщения и подписи: Получатель собирает сообщение и соответствующую цифровую подпись. 2. Создание хэша сообщения: Получатель вычисляет хэш от полученного сообщения с использованием того же алгоритма хэширования, который использовался при подписи. 3. Проверка подписи: Получатель использует публичный ключ отправителя для проверки цифровой подписи. Это включает в себя применение математических операций, которые должны привести к тому же результату, что и при вычислении хэша сообщения. В случае ECDSA это включает в себя использование точки на эллиптической кривой, соответствующей публичному ключу. 4. Сравнение результатов: Если результаты вычисления хэша сообщения и проверки подписи совпадают, это означает, что подпись действительна. Это доказывает, что сообщение было отправлено владельцем приватного ключа и не было изменено после подписи. Верификация подписи является ключевым элементом в обеспечении безопасности и неотрекаемости в цифровых коммуникациях, особенно в контексте блокчейна и криптовалют. Какие свойства ЭЦПУ вы наблюдали при выполнении лабораторной работы? В лабораторной работе по ЭЦПУ (электронной цифровой подписи) мы изучили и продемонстрировали следующие свойства: 1. Аутентификация: ЭЦПУ позволяет подтвердить, что сообщение было отправлено конкретным пользователем. В лабораторной работе это продемонстрировано путем подписи сообщения с использованием приватного ключа и последующей проверки подписи с использованием соответствующего публичного ключа. 2. Неотрекаемость: ЭЦПУ предотвращает отказ от авторства сообщения. В лабораторной работе это свойство продемонстрировано путем подтверждения того, что только владелец приватного ключа мог создать конкретную цифровую подпись. 3. Целостность данных: ЭЦПУ гарантирует, что сообщение не было изменено после подписи. В лабораторной работе это показано путем изменения сообщения и демонстрации того, что измененное сообщение не соответствует подписи, что указывает на нарушение целостности. 4. Безопасность: Использование ЭЦПУ обеспечивает высокий уровень безопасности сообщений. В лабораторной работе это продемонстрировано путем анализа сложности подбора приватного ключа по известному публичному ключу и подписи. 5. Проверка подписи: В лабораторной работе также изучается процесс проверки подписи, который включает в себя использование публичного ключа для проверки того, что подпись действительно была создана с использованием соответствующего приватного ключа. 6. Использование хэшей: В контексте ЭЦПУ часто изучается использование хэш-функций для создания компактного представления сообщения, которое затем подписывается. Это позволяет подписывать сообщения любой длины, не увеличивая размер подписи. Лабораторная работа по ЭЦПУ включает в себя практические упражнения, в которых я создаю свои собственные ключевые пары, подписываю сообщения и проверяю подписи, чтобы лучше понять принципы работы ЭЦПУ и ее важность для безопасности цифровых коммуникаций. Добавляю в отчет скриншоты с результатами выполненных команд и примерами сгенерированных ключей, подписей и верификации. Вызвав функцию , сохраняем сгенерированные ключи. Выведем закрытый и публичный ключи в шестнадцатиричном формате: Закрытый ключ: 3f26756b575c37b6278125f47d6935069784051a67928273a73954253fb1a45d Публичный ключ: ca91de7d9f21fe2c32b429eb7cececcf35b34b00f8e8bf696232ce5632f613cd14b414317a027d5c80a4e6b6a587e12 aba5efc8d83fc2b4a85e392f1d2005890 Создаём функцию для подписания сообщения с помощью закрытого ключа Создаём функцию для верификации подписи с помощью публичного ключа Протестируем функции подписи и верификации сообщения "Пример сообщения для подписи" Соответственно подпись закрытым ключом в 16-ричном коде: 01fe786ecf12c4be2027807c1ab523ab8820202cd6b20bc9e5bfa821d12f868e349eb9176ca3e6ff908db49bcbd2bdd9dbd85 6e85cf92787b71cab613bfd432c Верифицируем подпись публичным ключом—результат: « Подпись верна: True» Полный текст рабочего скрипта с ремарками: import sys import subprocess # Проверка, установлен ли модуль ecdsa try: import ecdsa except ImportError: print("Модуль ecdsa не установлен. Установка...") subprocess.check_call([sys.executable, '-m', 'pip', 'install', 'ecdsa']) # Теперь, когда модуль установлен, мы можем импортировать его import ecdsa # Создание функции для генерации ключевой пары ЭЦПУ def generate_keys(): # Создание объекта кривой ЭЦПУ curve = ecdsa.SECP256k1 # Генерация закрытого ключа private_key = ecdsa.SigningKey.generate(curve=curve) # Получение публичного ключа из закрытого public_key = private_key.get_verifying_key() return private_key, public_key # Вызываем функцию и сохраняем сгенерированные ключи private_key, public_key = generate_keys() # Выводим закрытый и публичный ключи в шестнадлатеричном формате print(f"Закрытый ключ: {private_key.to_string().hex()}") print(f"Публичный ключ: {public_key.to_string().hex()}") # Подпись и верификация сообщения # Создадим функцию для подписания сообщения с помощью закрытого ключа def sign_message(message, private_key): # Преобразование сообщения в байты message_bytes = message.encode('utf-8') # Подписание сообщения закрытым ключом signature = private_key.sign(message_bytes) return signature # Создадим функцию для верификации подписи с помощью публичного ключа def verify_signature(message, signature, public_key): # Преобразование сообщения в байты message_bytes = message.encode('utf-8') # Верификация подписи публичным ключом is_valid = public_key.verify(signature, message_bytes) return is_valid # Протестируем функции подписи и верификации message = "Пример сообщения для подписи" signature = sign_message(message, private_key) is_valid = verify_signature(message, signature, public_key) print(f"Сообщение: {message}") print(f"Подпись: {signature.hex()}") print(f"Подпись верна: {is_valid}") Попробуем верифицировать подпись с измененным сообщением («Пример измененного сообщения») и ЭЦПУ. Убедимся, что верификация не проходит. Полный код рабочего скрипта с изменением сообщения и цифровой подписи. import sys import subprocess # Проверка, установлен ли модуль ecdsa try: import ecdsa except ImportError: print("Модуль ecdsa не установлен. Установка...") subprocess.check_call([sys.executable, '-m', 'pip', 'install', 'ecdsa']) # Теперь, когда модуль установлен, мы можем импортировать его import ecdsa # Создание функции для генерации ключевой пары ЭЦПУ def generate_keys(): # Создание объекта кривой ЭЦПУ curve = ecdsa.SECP256k1 # Генерация закрытого ключа private_key = ecdsa.SigningKey.generate(curve=curve) # Получение публичного ключа из закрытого public_key = private_key.get_verifying_key() return private_key, public_key # Вызываем функцию и сохраняем сгенерированные ключи private_key, public_key = generate_keys() # Выводим закрытый и публичный ключи в шестнадлатеричном формате print(f"Закрытый ключ: {private_key.to_string().hex()}") print(f"Публичный ключ: {public_key.to_string().hex()}") # Подпись и верификация сообщения # Создадим функцию для подписания сообщения с помощью закрытого ключа def sign_message(message, private_key): # Преобразование сообщения в байты message_bytes = message.encode('utf-8') # Подписание сообщения закрытым ключом signature = private_key.sign(message_bytes) return signature # Создадим функцию для верификации подписи с помощью публичного ключа def verify_signature(message, signature, public_key): # Преобразование сообщения в байты message_bytes = message.encode('utf-8') # Верификация подписи публичным ключом is_valid = public_key.verify(signature, message_bytes) return is_valid # Протестируем функции подписи и верификации message = "Пример сообщения для подписи" signature = sign_message(message, private_key) is_valid = verify_signature(message, signature, public_key) print(f"Сообщение: {message}") print(f"Подпись: {signature.hex()}") print(f"Подпись верна: {is_valid}") # Изменение сообщения и попытка верификации modified_message = "Пример измененного сообщения для подписи" is_valid_modified_message = verify_signature(modified_message, signature, public_key) print(f"Сообщение после изменения: {modified_message}") print(f"Подпись верна после изменения сообщения: {is_valid_modified_message}") # Изменение подписи и попытка верификации modified_signature = signature[:-1] # Удаление последнего байта из подписи is_valid_modified_signature = verify_signature(message, modified_signature, public_key) print(f"Подпись после изменения: {modified_signature.hex()}") print(f"Подпись верна после изменения подписи: {is_valid_modified_signature}") Исполнение скрипта с первоначальным сообщением(верификация проходит) и модифицированными сообщением и ЭЦПУ(верификация не проходит). Попытаемся подписать сообщение чужим закрытым ключом. Убедимся, что верификация подписи не проходит. Полный код рабочего скрипта с использованием дополнительной чужой пары ключей. import sys import subprocess # Проверка, установлен ли модуль ecdsa try: import ecdsa except ImportError: print("Модуль ecdsa не установлен. Установка...") subprocess.check_call([sys.executable, '-m', 'pip', 'install', 'ecdsa']) # Теперь, когда модуль установлен, мы можем импортировать его import ecdsa # Создание функции для генерации ключевой пары ЭЦПУ def generate_keys(): # Создание объекта кривой ЭЦПУ curve = ecdsa.SECP256k1 # Генерация закрытого ключа private_key = ecdsa.SigningKey.generate(curve=curve) # Получение публичного ключа из закрытого public_key = private_key.get_verifying_key() return private_key, public_key # Вызываем функцию и сохраняем сгенерированные ключи private_key1, public_key1 = generate_keys() # Выводим закрытый и публичный ключи в шестнадлатеричном формате print(f"Закрытый ключ 1: {private_key1.to_string().hex()}") print(f"Публичный ключ 1: {public_key1.to_string().hex()}") # Подпись и верификация сообщения # Создадим функцию для подписания сообщения с помощью закрытого ключа def sign_message(message, private_key): # Преобразование сообщения в байты message_bytes = message.encode('utf-8') # Подписание сообщения закрытым ключом signature = private_key.sign(message_bytes) return signature # Создадим функцию для верификации подписи с помощью публичного ключа def verify_signature(message, signature, public_key): # Преобразование сообщения в байты message_bytes = message.encode('utf-8') # Верификация подписи публичным ключом is_valid = public_key.verify(signature, message_bytes) return is_valid # Протестируем функции подписи и верификации message = "Пример сообщения для подписи" signature = sign_message(message, private_key1) is_valid = verify_signature(message, signature, public_key1) print(f"Сообщение: {message}") print(f"Подпись: {signature.hex()}") print(f"Подпись верна: {is_valid}") # Генерируем вторую пару ключей private_key2, public_key2 = generate_keys() # Используем закрытый ключ второй пары для подписания сообщения signature_with_other_key = sign_message(message, private_key2) # Верифицируем подпись с использованием публичного ключа первой пары is_valid_with_other_key = verify_signature(message, signature_with_other_key, public_key1) print(f"Подпись, созданная другим ключом: {signature_with_other_key.hex()}") print(f"Подпись верна с другим ключом: {is_valid_with_other_key}") Исполнение скрипта с первоначальной парой ключей (верификация проходит) и чужой парой ключей(верификация не проходит).