import subprocess import json import sys from pathlib import Path from cli.parse_args import parse_args LAB2 = Path(__file__).resolve().parents[2] / \ "lab2-the-RSA-algorithm" / "app" / "app.py" LAB3 = Path(__file__).resolve().parents[2] / \ "lab3-hash-function" / "app" / "app.py" def run_lab2_keygen(bits: int, seed: int | None): cmd = [sys.executable, str(LAB2), "keygen", "--bits", str(bits)] if seed is not None: cmd += ["--seed", str(seed)] res = subprocess.run(cmd, capture_output=True, text=True, check=True) return json.loads(res.stdout) def run_lab3_hash(variant: str, text: str, bytes_len: int): cmd = [ sys.executable, str(LAB3), "hash", "-v", variant, "-m", text, "--bytes", str(bytes_len), ] res = subprocess.run(cmd, capture_output=True, text=True, check=True) return res.stdout.strip() # ожидается hex-строка def main(): args = parse_args() # Фиксированные параметры RSA и HASH bits = 32 bytes_len = 7 # 1. Генерация ключей RSA keys = run_lab2_keygen(bits, args.seed) n = int(keys["n"]["dec"]) e = int(keys["e"]["dec"]) d = int(keys["d"]["dec"]) print("RSA ключи сгенерированы:") print(json.dumps(keys, indent=2, ensure_ascii=False)) # 2. Хэш исходного текста h_hex = run_lab3_hash(args.variant, args.text, bytes_len) h = int(h_hex, 16) print(f"\nХэш исходного сообщения: {h_hex} (dec={h})") # 3. Проверка условия n > h if h >= n: print( "\n[ОШИБКА] Хэш больше или равен n. Нужно пересоздать ключи с большим размером.") sys.exit(1) # 4. Подпись: S = h^d mod n S = pow(h, d, n) print(f"\nПодпись (S): {S}") # 5. Проверка подписи для исходного сообщения h_check = pow(S, e, n) print(f"Проверка подписи: {h_check} == {h} ? { 'OK' if h_check == h else 'FAIL'}") # 6. Если передан модифицированный текст — проверить и его if args.tampered: h_tampered_hex = run_lab3_hash(args.variant, args.tampered, bytes_len) h_tampered = int(h_tampered_hex, 16) print(f"\nХэш модифицированного сообщения: { h_tampered_hex} (dec={h_tampered})") h_check_tampered = pow(S, e, n) print( f"Проверка подписи для модифицированного текста: " f"{h_check_tampered} == {h_tampered} ? { 'OK' if h_check_tampered == h_tampered else 'FAIL'}" ) if __name__ == "__main__": main()