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
- Sélecteur de variation : utilisez la plage U+FE00-U+FE0F
- ESPACE SANS SÉPARATION DE LARGEUR ZÉRO (U+FEFF) : marqueur de début de chaîne caché
- Encodage : convertissez les caractères en HEX et exprimez-les avec le sélecteur de variantes
- 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.
hsb.horse