Encodeur de caractères largeur nulle
Cache un secret dans un texte ordinaire avec des caractères Unicode invisibles : « Hi » glissé dans « Hello world » devient 18 caractères de largeur nulle que personne ne voit, et le décodage le révèle. Utile pour filigranes et cours, mais pas un chiffrement. Gratuit dans votre navigateur.
- Gratuit
- Fonctionne dans votre navigateur
- Sans inscription
- Vos données restent sur votre appareil
Lancer gratuitement
Exemple résolu
- Clé secrète
- Hi
- Texte de couverture
- Hello world
- Mode de calcul
- encode
- Résultat
- Hello world
- Encodage
- zero_width
- Longueur du secret
- 2
- Longueur du texte de couverture
- 11
Les caractères de largeur nulle sont des points de code Unicode qui n'occupent aucune largeur visible, de sorte que le lecteur ordinaire ne les remarque pas tandis que les analyseurs et le copier-coller transportent encore les octets. Cet encodeur de caractères de largeur nulle transforme une chaîne secrète UTF-8 en un flux de symboles U+200B et U+200C encadré par les marqueurs U+200D et U+FEFF, puis insère cette charge invisible dans le texte de couverture après le premier caractère. Le décodage recherche le même cadre, reconstruit les bits en octets et renvoie le secret d'origine. L'outil n'est pas un chiffrement : quiconque connaît le schéma peut extraire la charge ; traitez-le comme aide pédagogique, filigrane léger ou couche de démonstration, non comme frontière de secret.
Comment le codage binaire en largeur nulle dissimule un secret à vue
Le texte de couverture visible reste lisible parce que la charge n'emploie que des caractères de format à avance de largeur nulle. L'encodeur convertit d'abord le secret en octets UTF-8, puis parcourt chaque bit du plus significatif au moins significatif au sein de chaque octet. Le bit zéro devient U+200B (ZERO WIDTH SPACE) et le bit un devient U+200C (ZERO WIDTH NON-JOINER).
Un marqueur de début U+200D et un marqueur de fin U+FEFF encadrent ce flux de bits afin que le décodage ignore d'autres caractères invisibles hors sujet dans le document et récupère néanmoins une charge bien définie. Comme chaque étape est de l'arithmétique pure de chaînes et d'octets, le même secret et la même couverture produisent toujours le même texte stéganographique sur tout environnement d'exécution.
Ce contrat rejoint les explications de cours sur la stéganographie sans prétendre que le canal soit confidentiel : dissimuler en largeur nulle porte sur l'invisibilité dans l'interface, non sur la résistance à un lecteur motivé qui inspecte les points de code.
Où un encodeur de largeur nulle apporte de la valeur en produit et en enseignement
Les ateliers de sécurité et de confidentialité utilisent un encodeur de caractères de largeur nulle pour que les apprenants collent un texte stéganographique dans un chat ou un document, confirment que le message paraît encore propre, puis le décodent en une seconde étape en voyant la carte des bits dans le champ formula. Comme l'implémentation est pure analyse, sans jetons de modèle ni réseau sortant, la latence reste au plancher analytique et le coût reste prévisible.
Préférez cet outil lorsque la tâche est de cacher et révéler avec des caractères de format Unicode ; choisissez de vraies bibliothèques cryptographiques lorsque la confidentialité sous attaque est l'exigence. Documentez pour les utilisateurs finaux que certaines plateformes normalisent ou suppriment les caractères de largeur nulle à l'envoi, donc faites toujours un aller-retour via decode après le canal réel qui vous importe.
Cas d’usage
Démonstrations de stéganographie en classe
Montrez aux élèves comment des bits Unicode invisibles cachent un court secret dans des phrases de couverture ordinaires, puis révélez-le avec decode sur le même module déterministe.
Filigranes anti-fuite de brouillons
Incorporez un identifiant d'équipe ou de ticket en bits de largeur nulle dans des textes marketing d'exemple pour attribuer les collages fuités sans changer la mise en page visible.
Questions fréquentes
Comment révéler un message caché ?
Appelez avec mode decode et passez la chaîne stéganographique comme text.
Quels caractères Unicode sont utilisés ?
Le bit 0 est U+200B, le bit 1 est U+200C, le marqueur de début est U+200D et celui de fin est U+FEFF.
S'agit-il d'un chiffrement ?
Non. Le codage en largeur nulle ne fait que dissimuler des bits aux lecteurs occasionnels. Quiconque connaît le schéma — ou inspecte les points de code — peut récupérer la charge. Utilisez la cryptographie lorsque vous avez besoin de confidentialité.
Comment cacher un message dans un texte ?
Saisissez le secret et le texte visible qui servira de couverture. Le secret devient des bits invisibles, encadrés par une marque de début et une marque de fin, puis il est inséré juste après le premier caractère de la couverture, qui se lit toujours pareil.
Le message caché survit-il au copier-coller ?
En général oui, car les caractères invisibles voyagent avec le texte. Certaines applications normalisent ou suppriment les caractères de largeur nulle à l'envoi : après avoir fait passer le texte par le canal qui vous intéresse, décodez-le une fois pour vérifier que le secret est toujours là.
Outils associés
Pour les développeurs — accès API
Tout sur cette page est disponible par programmation. Cette section s'adresse aux équipes qui veulent l'intégrer à leurs systèmes ; les autres peuvent simplement utiliser l'outil ci-dessus.
Endpoint
Authentification par jeton Bearer : un seul POST met la tâche en file d’attente, et le résultat vous parvient par webhook ou lien signé.
Appeler depuis votre stack
curl -X POST https://api.kit.forhosting.com/enc/zero-width \
-H "Authorization: Bearer $KIT_KEY" \
-H "Content-Type: application/json" \
-d '{"mode":"encode","op":"encode"}'const res = await fetch("https://api.kit.forhosting.com/enc/zero-width", {
method: "POST",
headers: {
"Authorization": `Bearer ${process.env.KIT_KEY}`,
"Content-Type": "application/json"
},
body: JSON.stringify({
"mode": "encode",
"op": "encode"
})
});
const { task_id } = await res.json();import os, requests
res = requests.post(
"https://api.kit.forhosting.com/enc/zero-width",
headers={"Authorization": f"Bearer {os.environ['KIT_KEY']}"},
json={
"mode": "encode",
"op": "encode"
},
)
task_id = res.json()["task_id"]<?php
$res = file_get_contents("https://api.kit.forhosting.com/enc/zero-width", false, stream_context_create([
"http" => [
"method" => "POST",
"header" => "Authorization: Bearer " . getenv("KIT_KEY") . "\r\nContent-Type: application/json",
"content" => '{"mode":"encode","op":"encode"}',
],
]));
$task = json_decode($res, true);body := bytes.NewBufferString(`{"mode":"encode","op":"encode"}`)
req, _ := http.NewRequest("POST", "https://api.kit.forhosting.com/enc/zero-width", body)
req.Header.Set("Authorization", "Bearer "+os.Getenv("KIT_KEY"))
req.Header.Set("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)Exemple de requête
{
"mode": "encode",
"op": "encode"
}Exemple de réponse
{
"task_id": "tsk_a1b2c3d4e5f6a1b2c3d4e5f6",
"type": "enc.zero_width",
"status": "queued",
"_links": {
"result": "/tasks/tsk_…/result"
}
}L’API est asynchrone : chaque appel renvoie un task_id immédiatement, puis vous interrogez l’état à raison d’une requête par seconde.
Tarifs
Le prix est publié, sans tokens ni crédits. Une tâche qui échoue n’est pas facturée.
Erreurs
| HTTP | Code | Signification |
|---|---|---|
401 | unauthorized | Clé API absente ou invalide : vérifiez l’en-tête Authorization. |
402 | insufficient_balance | Solde insuffisant : rechargez votre compte pour lancer cette tâche. |
404 | unknown_type | Type de tâche inconnu : vérifiez le champ type de votre requête. |
429 | rate_limited | Trop de requêtes : ralentissez la cadence, puis réessayez. |
Notes techniques
Marqueurs invalides, groupes de bits incomplets ou champs manquants échouent avec invalid_input et ne sont pas facturés.
Comment le codage binaire en largeur nulle dissimule un secret à vue
Le décodage inverse le chemin : localiser le premier marqueur de début, le marqueur de fin suivant, n'accepter que U+200B et U+200C entre eux, exiger un nombre de bits multiple de huit, réassembler les octets et décoder en UTF-8 avec un décodeur fatal pour que les flux corrompus apparaissent en invalid_input plutôt qu'en texte illisible.
Contrat d'entrée, modes, forme de la réponse et erreurs
Envoyez mode encode ou decode. Les champs optionnels inapplicables à un mode sont simplement ignorés ; le gestionnaire n'invente jamais de secret en l'absence de marqueurs. Encode exige un secret non vide (alias message ou payload, max 4096 caractères) et un texte de couverture non vide (aussi accepté comme text, input, value ou data, max 100000 caractères). Decode exige un text non vide contenant une charge encadrée (alias cover, input, value, data ou stego, max 200000 caractères). Les alias de mode incluent hide et embed pour encode, et reveal ou extract pour decode ; la valeur par défaut est encode si mode est omis. En cas d'encode réussi le corps inclut result (chaîne stéganographique), mode, encoding zero_width, secret_length, cover_length, result_length, byte_count, bit_count, zero_width_count, formula et un court message indiquant combien d'octets UTF-8 ont été cachés. En cas de decode réussi le corps inclut result et secret (la chaîne révélée), mode, encoding, longueurs, compteurs de bits et d'octets, zero_width_count, formula et un message de révélation. Champs manquants, chaînes vides, mode inconnu, marqueurs de début ou de fin absents, caractères non bits dans le cadre, marqueurs imbriqués, longueur de bits non multiple de huit ou UTF-8 invalide après assemblage des bits lèvent invalid_input avec un message clair en anglais. Ces échecs ne consomment pas le solde prépayé. Gardez des charges modestes pour les widgets et figez les chaînes result dans les tests : les caractères de largeur nulle sont du vrai Unicode, donc les exemples JSON doivent les conserver exactement.
Où un encodeur de largeur nulle apporte de la valeur en produit et en enseignement
Les équipes QA injectent des filigranes invisibles dans des textes marketing d'exemple pour détecter les fuites de brouillons via des chemins de collage non contrôlés ; un appel API déterministe à $0.002 par élément réussi coûte moins cher que de monter un Worker sur mesure pour un script ponctuel.
Cas d'intégration
Contrôles CI des pipelines de collage
Encodez un secret connu dans des fixtures, faites-les passer par votre éditeur ou intégration de chat, puis décodez pour vérifier que les caractères de largeur nulle ont survécu au trajet.
Questions techniques
Comment cacher un secret avec des caractères de largeur nulle ?
Appelez avec mode encode (ou omettez mode), passez secret et cover non vides. L'API renvoie un texte stéganographique avec un cadre U+200D…U+FEFF de bits U+200B/U+200C inséré après le premier caractère de couverture.
Combien coûte l'encodeur de caractères de largeur nulle ?
L'outil navigateur est gratuit. Les requêtes API utilisent le solde prépayé KIT à $0.002 par appel réussi ; une entrée invalide n'est pas facturée.