/
mariadavydova
/
Coursework_2026
Обзор
Документация
Войти
/
mariadavydova
/
Coursework_2026
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
master
test_attack.py
153 строки
7 KB
mariadavydova
загрузка файлов
30 апр 2026, 20:42
Верифицирован
30 апр 2026, 20:42
af72564
Код
Авторство
О чём код?
# test_attack.py import requests import time from voter_client import VoterClient, setup_voting_server_with_ca_key from blind_signature import BlindSignatureRSA def test_double_voting(): """Тест: попытка повторного голосования одним избирателем""" print("\n" + "="*50) print("ТЕСТ 1: Попытка повторного голосования") print("="*50) voter = VoterClient("attacker_001") # Первое голосование (должно быть успешным) print("\n➡️ Первая попытка:") success1 = voter.vote("Алиса") print(f" Результат: {'✅ Успех' if success1 else '❌ Провал'}") # Вторая попытка с тем же ID (должна провалиться в ЦИК) print("\n➡️ Вторая попытка (тот же избиратель):") success2 = voter.vote("Боб") # Пытается голосовать снова print(f" Результат: {'❌ Должно быть провал' if not success2 else '⚠️ Успех (проблема!)'}") return not success2 # Тест пройден, если вторая попытка провалилась def test_signature_replay(): """Тест: повторная отправка той же подписи""" print("\n" + "="*50) print("ТЕСТ 2: Атака повторной отправкой (Replay attack)") print("="*50) # Сначала получаем валидную подпись voter = VoterClient("attacker_002") voter.fetch_ca_public_key() voter.prepare_vote("Алиса") voter.request_blind_signature() voter.unblind_signature() # Отправляем голос первый раз print("\n➡️ Первая отправка:") success1 = voter.submit_vote() print(f" Результат: {'✅ Успех' if success1 else '❌ Провал'}") # Пытаемся отправить тот же голос с той же подписью повторно print("\n➡️ Повторная отправка (той же подписи):") success2 = voter.submit_vote() print(f" Результат: {'❌ Должно быть провал' if not success2 else '⚠️ Успех (проблема!)'}") return not success2 def test_fake_signature(): """Тест: поддельная подпись""" print("\n" + "="*50) print("ТЕСТ 3: Поддельная подпись") print("="*50) # Получаем ключ ЦИК voter = VoterClient("attacker_003") voter.fetch_ca_public_key() # Создаем поддельную подпись fake_signature = 12345 signature_b64 = BlindSignatureRSA.int_to_base64(fake_signature) # Пытаемся отправить голос с поддельной подписью payload = { "vote": "Алиса", "signature": signature_b64 } response = requests.post("http://localhost:8001/submit-vote", json=payload) success = response.status_code == 200 print(f"➡️ Отправка голоса с поддельной подписью:") print(f" Результат: {'❌ Должно быть провал' if not success else '⚠️ Успех (проблема!)'}") if not success: print(f" Сообщение сервера: {response.json().get('detail', 'Unknown error')}") return not success def test_privacy(): """Тест: проверка конфиденциальности""" print("\n" + "="*50) print("ТЕСТ 4: Проверка конфиденциальности") print("="*50) # Проверяем, что ЦИК не хранит связь между избирателем и голосом try: # Запрашиваем статистику ЦИК response = requests.get("http://localhost:8000/stats") if response.status_code == 200: data = response.json() print(f"📊 Статистика ЦИК:") print(f" Всего выдано подписей: {data['total_voters_signed']}") print(f" Список получивших подписи: {data['signed_voters_list']}") print("\n✅ Важно: ЦИК знает только кто получил подпись, но НЕ ЗНАЕТ за кого они голосовали!") except: print("❌ Не удалось получить статистику ЦИК") def main(): print("="*70) print(" ТЕСТИРОВАНИЕ БЕЗОПАСНОСТИ ПРОТОКОЛА СЛЕПОЙ ПОДПИСИ") print("="*70) # Проверка доступности серверов try: requests.get("http://localhost:8000/") requests.get("http://localhost:8001/") except: print("❌ Ошибка: Серверы не запущены!") print("Запустите сначала ca_server.py и voting_server.py") return # Настройка сервера голосования setup_voting_server_with_ca_key() # Запуск тестов tests = [ ("Защита от двойного голосования", test_double_voting), ("Защита от атак повторением", test_signature_replay), ("Защита от подделки подписей", test_fake_signature), ] results = [] for test_name, test_func in tests: result = test_func() results.append((test_name, result)) time.sleep(2) # Тест конфиденциальности test_privacy() # Итоги print("\n" + "="*70) print(" ИТОГИ ТЕСТИРОВАНИЯ") print("="*70) all_passed = True for test_name, passed in results: status = "✅ ПРОЙДЕН" if passed else "❌ ПРОВАЛЕН" print(f"{status} - {test_name}") if not passed: all_passed = False if all_passed: print("\n🎉 Все тесты безопасности пройдены успешно!") print("Протокол слепой подписи работает корректно.") else: print("\n⚠️ Некоторые тесты не пройдены. Проверьте реализацию.") if __name__ == "__main__": main()