🔐 ComfyUI EncryptMaster
Pack ComfyUI de nœuds pour chiffrer et cacher du texte ou des images.
Sécurité : AES-256-GCM (authentifié) avec dérivation de clé scrypt.
Stéganographie : LSB (PNG/TIFF) et DCT/JPEG (plus robuste aux recompressions).
📁 Contenu
Dossier : ComfyUI/custom_nodes/Comfyui_EncryptMaster/
text_cipher.py— Text Cipher (chiffrer/déchiffrer une chaîne)stego_text.py— Stego Text (cacher/extraire du texte dans une image, LSB)stego_capacity.py— Stego Capacity Estimator (capacité d’une image en LSB)image_cipher.py— Image ⇄ Noise (image chiffrée rendue comme “bruit”)stego_image_in_image.py— Stego Image-in-Image (cacher une image dans une autre, compression avant chiffrement)generate_passphrase.py— Generate Passphrase (phrases de passe solides)
⚙️ Installation
-
Copier ce dépôt dans :
ComfyUI/custom_nodes/Comfyui_EncryptMaster
-
Activer votre venv puis installer les dépendances :
pip install cryptography pillow numpy
-
Relancer ComfyUI. Les nœuds « EncryptMaster — … » apparaissent dans la recherche.
Testé avec Python 3.10–3.12, ComfyUI ≥ 0.3.x, Windows / Linux.
🔑 Sécurité (résumé)
- Chiffrement : AES-256-GCM (authentifié).
- Dérivation : scrypt (N=2^14, r=8, p=1) depuis une passphrase humaine.
- Associated Data (AAD) : champ
associated_dataoptionnel, non chiffré mais authentifié.
Si l’AAD ne correspond pas entre chiffrement et déchiffrement, le déchiffrement échoue.
🧩 Nœuds et usages
1) EncryptMaster — Text Cipher (AES-GCM)
-
Entrées
text(STRING) : texte clair ou blob chiffré.passphrase(STRING) : mot/phrase de passe.mode(STRING) : "encrypt" ou "decrypt".associated_data(STRING, optionnel).
-
Sorties
text(STRING) : texte chiffré « armored » ou texte déchiffré.
-
Notes
- Parfait pour sécuriser prompts, JSON ou credentials avant stockage.
2) EncryptMaster — Stego Embed Text (AES-GCM) / Stego Extract Text
-
But : cacher un texte chiffré dans les bits de poids faible (LSB) d’une image.
-
Entrées (Embed)
image(IMAGE),text(STRING),passphrase(STRING)bits_per_channel: 1 (discret) ou 2 (×2 capacité)associated_data(STRING, optionnel)
-
Sorties (Embed)
image(IMAGE) : même visuel, message caché.
-
Entrées (Extract)
image(IMAGE),passphrase(STRING),associated_data(STRING, optionnel)
-
Sorties (Extract)
text(STRING) : texte en clair.
-
Conseils
- Sauvegarder en PNG/TIFF (sans perte).
- Éviter toute recompression/redimensionnement après l’embed.
3) EncryptMaster — Stego Capacity Estimator
-
But : estimer la capacité maximale (octets et nombre de caractères) d’une image pour l’embed LSB.
-
Entrées
image(IMAGE),bits_per_channel(1/2)
-
Sorties
capacity_bytes(INT),capacity_chars(INT),report(STRING)
-
Rappel rapide
- Capacité brute ≈
largeur × hauteur × 3 × bpc / 8octets.
- Capacité brute ≈
4) EncryptMaster — Image Cipher → Noise (AES-GCM)
EncryptMaster — Image Decipher ← Noise (AES-GCM)
-
But : chiffrer tous les pixels d’une image et produire une image de bruit aléatoire (réversible).
-
Entrées (Cipher)
image(IMAGE),passphrase(STRING)associated_data(STRING, optionnel)preserve_width(BOOLEAN) : conserve la largeur; la hauteur s’ajuste si nécessaire.
-
Sorties (Cipher)
image(IMAGE bruitée),out_width(INT),out_height(INT)
-
Entrées (Decipher)
image(IMAGE bruitée),passphrase(STRING),associated_data(STRING, optionnel)
-
Sorties (Decipher)
image(IMAGE originale),report(STRING)
-
Important
- Toujours sauver en PNG/TIFF. Le JPEG détruit des octets → déchiffrement impossible.
5) EncryptMaster — Stego Embed Image (LSB/AES-GCM) / Stego Extract Image
-
But : cacher une image secrète B dans une image porteuse A (LSB), en compressant le secret avant chiffrement.
-
Entrées (Embed)
cover_image(IMAGE),secret_image(IMAGE),passphrase(STRING)bits_per_channel: 1 ou 2secret_encode: "jpeg" (recommandé) ou "png"jpeg_quality(50–95) : qualité du secret si "jpeg"resize_secret_to_cover(BOOLEAN) : redimensionner le secret à la coverassociated_data(STRING, optionnel)
-
Sorties (Embed)
image(IMAGE),report(STRING)
-
Entrées (Extract)
image(IMAGE),passphrase(STRING),associated_data(STRING, optionnel)
-
Sorties (Extract)
image(secret reconstruit),report(STRING)
-
Capacité (ordre de grandeur)
- Cover 1216×1600 @ 1 bpc ≈ ~712 KiB ; @ 2 bpc ≈ ~1.42 MiB.
- Secret 1216×1600 en JPEG q85 ≈ 200–400 Ko → OK avec 2 bpc.
- Mode PNG lossless souvent plus volumineux → nécessitera une cover plus grande ou 2 bpc.
-
Format de sortie
- Sauver la cover modifiée en PNG/TIFF (pas de recompression JPEG après embed).
6) EncryptMaster — Generate Passphrase
- But : générer une phrase de passe robuste (type Diceware).
- Astuce : viser ≥ 24 caractères ou 8–9 mots aléatoires.
🧪 Workflows types
A) Cacher un texte chiffré dans une image (PNG)
[Text Box] -> [Text Cipher (encrypt)] -> [Stego Embed Text] -> [Save Image (PNG)]
B) Cacher une image dans une autre
[Load Cover] + [Load Secret] -> [Stego Embed Image (secret_encode=jpeg, bpc=2)] -> [Save Image (PNG)]
C) Chiffrer une image en « bruit » (réversible)
[Load Image] -> [Image Cipher → Noise] -> [Save Image (PNG)]
[Load Noise] -> [Image Decipher ← Noise] -> [Preview]
✅ Bonnes pratiques
- Utiliser Generate Passphrase pour des passphrases solides.
- Renseigner un
associated_datastable (ex.project=EncryptMaster;v=1) et le réutiliser à l’extraction. - Ne pas compresser les images codées, format export png ou tiff, ne pas réenregister les images en jpeg, beaucoup de réseaux sociaux réencodent les images (cryptage infonctionnel).