logo hsb.horse
← Voltar para o índice do blog

Blog

Implementação TypeScript de esteganografia usando seletores de variantes

Uma implementação TypeScript de um método de esteganografia que aproveita o seletor de variantes do Unicode para incorporar strings ocultas e invisíveis no texto.

Publicado:

Na verdade, eu queria experimentar Esteganografia usando seletores de variantes Unicode: como ocultar secretamente strings secretas no texto #JavaScript - Qita, mas queria implementá-lo em TypeScript e fazê-lo funcionar corretamente.

Então eu implementei.

Código

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]
}
}

Pontos

  1. Seletor de variação: Use a faixa U+FE00-U+FE0F
  2. ZERO WIDTH NO-BREAK SPACE(U+FEFF): Marcador de início de string oculto
  3. Codificação: Converta caracteres em HEX e expresse com seletor de variante
  4. Decodificar: Extraia com expressão regular e restaure a string original

Exemplo de uso

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); // "秘密のメッセージ"

resumo

Ao aproveitar o seletor de glifos do Unicode, você pode incorporar sequências secretas no texto de uma forma visualmente indetectável.

Independente da praticidade, é um bom assunto para aprender como funciona o Unicode.