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
- Seletor de variação: Use a faixa U+FE00-U+FE0F
- ZERO WIDTH NO-BREAK SPACE(U+FEFF): Marcador de início de string oculto
- Codificação: Converta caracteres em HEX e expresse com seletor de variante
- 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.
hsb.horse