Initial commit

This commit is contained in:
user
2026-07-12 14:06:45 +04:00
commit a75028d68f
148 changed files with 3275 additions and 0 deletions
@@ -0,0 +1,89 @@
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()
@@ -0,0 +1,25 @@
from argparse import ArgumentParser
def parse_args(argv=None):
ap = ArgumentParser(
prog="app.py",
description="ЭЦП (RSA + собственная хэш-функция). "
"Выполняет полный цикл: генерация ключей, подпись и проверку."
)
# --- RSA ---
ap.add_argument("-s", "--seed", type=int,
help="Seed для ГСЧ (опционально, для воспроизводимости).")
# --- HASH ---
ap.add_argument("-v", "--variant", choices=["1", "2", "3"], required=True,
help="Вариант хэш-функции (см. lab3).")
# --- MESSAGES ---
ap.add_argument("-t", "--text", type=str, required=True,
help="Исходное сообщение (ASCII).")
ap.add_argument("-m", "--tampered", type=str,
help="Модифицированное сообщение для имитации нарушения целостности.")
return ap.parse_args(argv)