# 🔐 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
1) Copier ce dépôt dans :
ComfyUI/custom_nodes/Comfyui_EncryptMaster
2) Activer votre venv puis installer les dépendances :
pip install cryptography pillow numpy
3) 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_data` optionnel, 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 / 8` octets.
---
### 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 2
- `secret_encode` : "jpeg" (recommandé) ou "png"
- `jpeg_quality` (50–95) : qualité du secret si "jpeg"
- `resize_secret_to_cover` (BOOLEAN) : redimensionner le secret à la cover
- `associated_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_data`** stable (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).
---