- •Федеральное агенство воздушного транспорта (росавиация)
- •1. Моделирование функции хэширования на основе алгоритма симметричного блочного шифрования.
- •2. Исследование функции хэширования по гост р 34.11-94
- •3. Исследование электронной цифровой подписи по алгоритму Эль-Гамаля (egsa)
- •4. Исследование электронной цифровой подписи по гост р 34.10-94 (гост р 34.10-01)
- •Сравнительный анализ алгоритмов эцп:
3. Исследование электронной цифровой подписи по алгоритму Эль-Гамаля (egsa)
Рис. 3. Начальное окно программы.
Рис. 4. Окно с генерацией ключей и подписи по Эль-Гамалю.
Рис. 5. Окно с алгоритмом Эль-Гамаля и имитацией подготовки документа.
Рис. 6. Окно с проверкой подписи Эль-Гамаля.
Рис. 7. Окно с фрагментом отчета, сформированным на основе работы приложения.
Ручная реализация.
z=35 , P=41 , G=34 , x=25, k=23.
Листинг.
# Параметры задачи P = 41 # простое число (модуль) G = 34 # генератор (primitive root modulo P) x = 25 # секретный ключ (1 <= x <= P-2) k = 23 # эфемерный ключ (1 <= k <= P-2, gcd(k, P-1) == 1) z = 35 # хеш сообщения (в EGSA обычно используется хеш, но здесь z задан напрямую) # Шаг 1: Вычисление открытого ключа Y = G^x mod P Y = pow(G, x, P) print(f"Открытый ключ Y = {Y}") # Шаг 2: Генерация подписи S = (a, b) # a = G^k mod P a = pow(G, k, P) # Нужно вычислить обратный элемент k^(-1) mod (P-1) # Поскольку в EGSA: b = (z - x*a) * k^(-1) mod (P-1) from math import gcd phi = P - 1 # так как P — простое, φ(P) = P - 1 if gcd(k, phi) != 1: raise ValueError("k должно быть взаимно простым с P-1!") # Функция для нахождения модульного обратного (через расширенный алгоритм Евклида) def modinv(a, m): # Возвращает a^(-1) mod m, если существует g, x, y = extended_gcd(a, m) if g != 1: raise ValueError("Обратный элемент не существует") return x % m def extended_gcd(a, b): if a == 0: return b, 0, 1 gcd, x1, y1 = extended_gcd(b % a, a) x = y1 - (b // a) * x1 y = x1 return gcd, x, y k_inv = modinv(k, phi) # b = (z - x * a) * k^(-1) mod (P-1) b = ((z - x * a) * k_inv) % phi # Убедимся, что b положительное b = b % phi print(f"ЭЦП S = (a, b) = ({a}, {b})") # Шаг 3: Проверка подписи # Проверка: G^z ≡ Y^a * a^b (mod P) left = pow(G, z, P) right = (pow(Y, a, P) * pow(a, b, P)) % P print(f"\nПроверка подписи:") print(f"G^z mod P = {left}") print(f"Y^a * a^b mod P = {right}") print(f"Подпись корректна: {left == right}") |
Демонстрация работы программы.
Рис. 8. Результат работы программы.
4. Исследование электронной цифровой подписи по гост р 34.10-94 (гост р 34.10-01)
z=35 , P=41 , G=34 , x=25, k=23.
Листинг.
def egcd(a, b): if a == 0: return b, 0, 1 g, x1, y1 = egcd(b % a, a) return g, y1 - (b // a) * x1, x1 def modinv(a, m): g, x, _ = egcd(a, m) if g != 1: raise ValueError(f"Обратный элемент не существует для {a} mod {m}") return x % m # === Ваши данные === p = 41 g = 34 x_orig = 25 k_orig = 23 z = 35 q = 5 # делитель p-1 # Адаптация x = x_orig % q or 1 k = k_orig % q or 1 h = z % q or 1 print(f"Исходные данные: p={p}, g={g}, x={x_orig}, k={k_orig}, z={z}") print(f"Адаптировано: x={x}, k={k}, h={h}, q={q}") # Открытый ключ y = pow(g, x, p) print(f"Открытый ключ y = {y}") # Подпись r = pow(g, k, p) % q s = (k * h + x * r) % q # Если s == 0 — подбираем другой k if r == 0 or s == 0: found = False for k_new in range(1, q): r_new = pow(g, k_new, p) % q s_new = (k_new * h + x * r_new) % q if r_new != 0 and s_new != 0: k, r, s = k_new, r_new, s_new print(f"⚠️ Исправлено: выбрано k = {k} для корректной подписи") found = True break if not found: raise RuntimeError("Не удалось сгенерировать подпись") print(f"ЭЦП (r, s) = ({r}, {s})") # Проверка h_inv = modinv(h, q) z1 = (s * h_inv) % q z2 = ((q - r) * h_inv) % q u = (pow(g, z1, p) * pow(y, z2, p)) % p % q print(f"Проверка: u = {u}, r = {r} → {'✅ Корректно' if u == r else '❌ Ошибка'}") |
Демонстрация работы программы.
Рис. 9. Результат работы программы.
Вывод.
В ходе выполнения лабораторной работы были изучены и практически апробированы современные принципы и механизмы обеспечения подлинности и целостности электронных документов, основанные на методах криптографического преобразования информации. Работа позволила достичь следующих ключевых результатов:
