Eigentlich wollte ich Steganographie mit Unicode-Variantenselektoren: Wie man geheime Zeichenfolgen im Text versteckt #JavaScript - Qiita ausprobieren, aber ich wollte es in TypeScript implementieren und dafür sorgen, dass es richtig funktioniert.
Also habe ich es umgesetzt.
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] }}Punkte
- Variationsauswahl: Verwenden Sie den Bereich U+FE00-U+FE0F
- ZERO WIDTH NO-BREAK SPACE(U+FEFF): Versteckter String-Startmarker
- Kodierung: Konvertieren Sie Zeichen in HEX und drücken Sie sie mit der Variantenauswahl aus
- Dekodieren: Mit regulärem Ausdruck extrahieren und Originalzeichenfolge wiederherstellen
Anwendungsbeispiel
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); // "秘密のメッセージ"Zusammenfassung
Durch die Nutzung des Glyphenselektors von Unicode können Sie geheime Zeichenfolgen auf eine Weise in Text einbetten, die visuell nicht erkennbar ist.
Ungeachtet seiner Praktikabilität ist es ein gutes Thema, um zu lernen, wie Unicode funktioniert.
hsb.horse