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:
@@ -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.")
|
||||||
|
|||||||
Reference in New Issue
Block a user