logo hsb.horse
← Retour au blog

Blog

Implémentation TypeScript de la stéganographie à l'aide de sélecteurs de variantes

Une implémentation TypeScript d'une méthode de stéganographie qui exploite le sélecteur de variantes d'Unicode pour intégrer des chaînes cachées et invisibles dans le texte.

Publié:

Je voulais réellement essayer Stéganographie à l’aide de sélecteurs de variantes Unicode : Comment cacher secrètement des chaînes secrètes dans le texte #JavaScript - Qiita, mais je voulais l’implémenter dans TypeScript et le faire fonctionner correctement.

Je l’ai donc mis en œuvre.

##Code

class Steganography {
static #components = {
VS_BEGIN: 0xfe00,
STR_EMPTY: "",
REPLACER: /\uFEFF[\uFE00-\uFE0F]+/u,
toHex(value: number) {
return value.toString(16);
},
toHexDecimal(str: string): number {
return Number.parseInt(str, 16);
},
encode: {
PREFIX: "\u{FEFF}"
}
}
static encode(body: string, hidden: string): string {
const { VS_BEGIN, STR_EMPTY, encode, toHex, toHexDecimal } = this.#components;
return encode.PREFIX + [...hidden].flatMap(c => [...toHex(c.charCodeAt(0))])
.map((s) => String.fromCodePoint(VS_BEGIN + toHexDecimal(s)))
.join(STR_EMPTY) + body
}
static decode(value: string): [body: string, hidden: string] {
const { VS_BEGIN, STR_EMPTY, REPLACER, toHex, toHexDecimal } = this.#components;
let hidden = STR_EMPTY;
const body = value.replace(REPLACER, ([_, ...variationSelectors]) => {
hidden += variationSelectors
.map((c) => toHex(c.codePointAt(0)! - VS_BEGIN))
.reduce<string[][]>((acc, _, index, arr) => {
return index % 2 === 0 ? [...acc, arr.slice(index, index + 2)] : acc;
}, [])
.map(([a, b]) => String.fromCharCode(toHexDecimal(a + b)))
.join(STR_EMPTY);
return STR_EMPTY;
});
return [body, hidden]
}
}

Points

  1. Sélecteur de variation : utilisez la plage U+FE00-U+FE0F
  2. ESPACE SANS SÉPARATION DE LARGEUR ZÉRO (U+FEFF) : marqueur de début de chaîne caché
  3. Encodage : convertissez les caractères en HEX et exprimez-les avec le sélecteur de variantes
  4. Décoder : extraire avec une expression régulière et restaurer la chaîne d’origine

Exemple d’utilisation

const body = "公開されるテキスト";
const hidden = "秘密のメッセージ";
const encoded = Steganography.encode(body, hidden);
console.log(encoded); // 見た目は「公開されるテキスト」
const [decodedBody, decodedHidden] = Steganography.decode(encoded);
console.log(decodedBody); // "公開されるテキスト"
console.log(decodedHidden); // "秘密のメッセージ"

résumé

En tirant parti du sélecteur de glyphes d’Unicode, vous pouvez intégrer des chaînes secrètes dans du texte d’une manière visuellement indétectable.

Indépendamment de son côté pratique, c’est un bon sujet pour apprendre comment fonctionne Unicode.