Initial commit
This commit is contained in:
@@ -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)
|
||||
Reference in New Issue
Block a user