90 lines
2.8 KiB
Python
90 lines
2.8 KiB
Python
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()
|