CLI: -o optional, unauffaelliger Default-Dateiname wie im Web

hide ohne -o vergibt jetzt automatisch Screenshot_YYYYMMDD_HHMMSS.png
(gleiche Konvention wie das Web-Frontend). Expliziter -o-Name geht weiter.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
2026-07-14 22:12:15 +00:00
parent 685a72ab89
commit dac9550b46

View File

@@ -39,9 +39,18 @@ import argparse
import os import os
import struct import struct
import sys import sys
from datetime import datetime
from PIL import Image from PIL import Image
# Unauffälliger Default-Dateiname (Screenshot-Stil passt zu PNG; echte
# Kamerafotos sind JPG). Identisch zum Web-Frontend.
CARRIER_PREFIX = "Screenshot"
def default_carrier_name() -> str:
return datetime.now().strftime(f"{CARRIER_PREFIX}_%Y%m%d_%H%M%S.png")
# --- Schlüsseldatei --------------------------------------------------------- # --- Schlüsseldatei ---------------------------------------------------------
KEY_MAGIC = b"SPK1" KEY_MAGIC = b"SPK1"
KEY_VERSION = 1 KEY_VERSION = 1
@@ -228,6 +237,7 @@ def cmd_hide(args):
if not plaintext: if not plaintext:
sys.exit("[!] Leere Nachricht.") sys.exit("[!] Leere Nachricht.")
out_path = args.output or default_carrier_name()
key = read_key(args.key) key = read_key(args.key)
if key["role"] != ROLE_SEND: if key["role"] != ROLE_SEND:
sys.exit("[!] Das ist ein Empfangsschlüssel (recv.key). Zum Senden " sys.exit("[!] Das ist ein Empfangsschlüssel (recv.key). Zum Senden "
@@ -242,11 +252,11 @@ def cmd_hide(args):
ciphertext = otp_xor(plaintext, key["material"], offset) ciphertext = otp_xor(plaintext, key["material"], offset)
header = struct.pack(STEGO_FMT, STEGO_MAGIC, STEGO_VERSION, header = struct.pack(STEGO_FMT, STEGO_MAGIC, STEGO_VERSION,
key["stream_id"], offset, len(ciphertext)) key["stream_id"], offset, len(ciphertext))
embed(args.carrier, header + ciphertext, args.output) embed(args.carrier, header + ciphertext, out_path)
advance_send_offset(args.key, offset + len(plaintext)) advance_send_offset(args.key, offset + len(plaintext))
print(f"[+] Verschlüsselt ({len(plaintext)} B) ab Sende-Offset {offset}.") print(f"[+] Verschlüsselt ({len(plaintext)} B) ab Sende-Offset {offset}.")
print(f"[+] Versteckt in: {args.output}") print(f"[+] Versteckt in: {out_path}")
print(f"[+] Sende-Offset im Schlüssel weitergezählt -> " print(f"[+] Sende-Offset im Schlüssel weitergezählt -> "
f"{offset + len(plaintext)}") f"{offset + len(plaintext)}")
print("[i] Als DATEI/Dokument verschicken, nicht als Foto!") print("[i] Als DATEI/Dokument verschicken, nicht als Foto!")
@@ -302,7 +312,9 @@ def build_parser():
h.add_argument("-i", "--infile") h.add_argument("-i", "--infile")
h.add_argument("-k", "--key", required=True, help="Dein send.key.") h.add_argument("-k", "--key", required=True, help="Dein send.key.")
h.add_argument("-c", "--carrier", required=True, help="Trägerbild.") h.add_argument("-c", "--carrier", required=True, help="Trägerbild.")
h.add_argument("-o", "--output", required=True, help="Stego-PNG.") h.add_argument("-o", "--output",
help="Stego-PNG (Default: unauffälliger Screenshot_-Name "
"mit Zeitstempel).")
h.set_defaults(func=cmd_hide) h.set_defaults(func=cmd_hide)
r = sub.add_parser("reveal", help="Nachricht extrahieren + entschlüsseln.") r = sub.add_parser("reveal", help="Nachricht extrahieren + entschlüsseln.")