ゼロ幅文字エンコーダ
見えないUnicode文字で、普通の文章に秘密を隠します。「Hi」を「Hello world」に埋め込むと、誰にも見えない18個のゼロ幅文字になり、復号で取り出せます。透かしや授業には便利ですが、暗号化ではありません。ブラウザで無料で使えます。
- 無料
- ブラウザで動作
- 登録不要
- データは端末の外に出ません
無料で実行
計算例
- 秘密鍵
- Hi
- カバーテキスト
- Hello world
- 計算モード
- encode
- 結果
- Hello world
- エンコード
- zero_width
- 秘密の長さ
- 2
- カバーテキストの長さ
- 11
ゼロ幅文字は表示幅を持たないUnicode符号点であり、通常の読者には見えませんが、パーサやコピー&ペーストではバイトが保持されます。デコードでは同じ枠を探し、ビットをバイトに組み立て、元の秘密を返します。ステガノグラフィを学ぶ方、貼り付け経路を検証する開発者、見本文に透かしを入れるコンテンツ担当者は、決定的な純粋パース契約を利用できます。本ツールは暗号化ではありません。
ゼロ幅ビット符号化が秘密を目の前で隠す仕組み
エンコーダはまず秘密をUTF-8バイトに変換し、各バイト内で最上位ビットから最下位ビットまで順に走査します。ビット0はU+200B(ZERO WIDTH SPACE)、ビット1はU+200C(ZERO WIDTH NON-JOINER)になります。各手順は文字列とバイトの純算術なので、同じ秘密とカバーはどの実行環境でも同じステゴ文を生成します。
デコードは逆順です。 最初の開始マーカーと次の終了マーカーを見つけ、その間はU+200BとU+200Cのみを受け付け、ビット数が8の倍数であることを要求し、バイトを再構成し、致命的デコーダでUTF-8を復号します。ゼロ幅による隠蔽はUI上の不可視性であり、符号点を調べる動機ある読者への耐性ではありません。
プロダクトと教育でゼロ幅エンコーダが役立つ場面
セキュリティとプライバシーのワークショップでは、学習者がステゴ文をチャットや文書に貼り付け、見た目がきれいなままか確認し、次にデコードしてformula欄のビット対応を見るためにゼロ幅文字エンコーダを使います。QAチームは見本のマーケ文に不可視透かしを入れ、管理外の貼り付け経路で下書きが漏れたかを検知します。
CMSやローカライズのパイプラインは、描画レイアウトを変えずに合成フィクスチャ文字列へ印を付け、CIでdecodeを呼んでマーカーを除去または検証できます。ブラウザ拡張や教育用サンドボックスはサーバハンドラと同じ同型ライブラリを共有し、それがtier Aの約束です。無料のクライアント実行が有料自動化とバイト単位で一致します。
実装はモデルトークンも外向きネットワークもない純粋パースなので、遅延は分析下限に留まり、費用も予測しやすいです。Unicode書式文字で隠して戻す仕事なら本ツールを、攻撃下での機密性が要件なら本格的な暗号ライブラリを選んでください。
一部のプラットフォームは送信時にゼロ幅文字を正規化または削除するため、関心のある実チャネルの後に必ずdecodeで往復確認するようエンドユーザーへ案内してください。
活用例
授業でのステガノグラフィ演示
不可視のUnicodeビットが通常のカバー文に短い秘密を隠す様子を学習者に示し、同じ決定的モジュールのdecodeで復元してください。
下書き漏えい向け透かし
チームやチケットのIDをゼロ幅ビットとして見本マーケ文に埋め込み、見た目のレイアウトを変えずに漏れた貼り付けを帰属できます。
貼り付け経路のCI検証
既知の秘密をフィクスチャに符号化し、エディタやチャット連携を通し、decodeしてゼロ幅文字が経路を生き残ったか確認してください。
よくある質問
隠したメッセージを取り出すには?
mode decodeでステゴ文字列をtextとして送ってください。
どのUnicode文字が使われますか?
ビット0はU+200B、ビット1はU+200C、開始マーカーはU+200D、終了マーカーはU+FEFFです。
これは暗号化ですか?
いいえ。 ゼロ幅符号化はカジュアルな読者からビットを隠すだけです。機密性が必要なら暗号を使ってください。
文章にメッセージを隠すには?
秘密の文と、表に見せる文章を入力します。秘密は開始と終了の印で囲まれた見えないビット列になり、表の文章の最初の1文字の直後に入ります。文章の見た目は変わりません。
隠したメッセージはコピー&ペーストで残りますか?
多くの場合は残ります。見えない文字も文章と一緒に運ばれるからです。ただし送信時にゼロ幅文字を消すアプリもあるため、実際に使う経路を通したあとで一度復号し、秘密が残っているか確かめてください。
関連ツール
開発者向け — APIアクセス
このページの機能はすべてAPIからも利用できます。自社システムに組み込みたいチーム向けのセクションです。それ以外の方は上のツールをそのままお使いください。
エンドポイント
Bearerトークンで認証し、POST1回でタスクをキューに登録します。結果はWebhookまたは署名付きリンクで受け取れます。
お使いのスタックから呼び出す
curl -X POST https://api.kit.forhosting.com/enc/zero-width \
-H "Authorization: Bearer $KIT_KEY" \
-H "Content-Type: application/json" \
-d '{"mode":"encode","op":"encode"}'const res = await fetch("https://api.kit.forhosting.com/enc/zero-width", {
method: "POST",
headers: {
"Authorization": `Bearer ${process.env.KIT_KEY}`,
"Content-Type": "application/json"
},
body: JSON.stringify({
"mode": "encode",
"op": "encode"
})
});
const { task_id } = await res.json();import os, requests
res = requests.post(
"https://api.kit.forhosting.com/enc/zero-width",
headers={"Authorization": f"Bearer {os.environ['KIT_KEY']}"},
json={
"mode": "encode",
"op": "encode"
},
)
task_id = res.json()["task_id"]<?php
$res = file_get_contents("https://api.kit.forhosting.com/enc/zero-width", false, stream_context_create([
"http" => [
"method" => "POST",
"header" => "Authorization: Bearer " . getenv("KIT_KEY") . "\r\nContent-Type: application/json",
"content" => '{"mode":"encode","op":"encode"}',
],
]));
$task = json_decode($res, true);body := bytes.NewBufferString(`{"mode":"encode","op":"encode"}`)
req, _ := http.NewRequest("POST", "https://api.kit.forhosting.com/enc/zero-width", body)
req.Header.Set("Authorization", "Bearer "+os.Getenv("KIT_KEY"))
req.Header.Set("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)リクエスト例
{
"mode": "encode",
"op": "encode"
}レスポンス例
{
"task_id": "tsk_a1b2c3d4e5f6a1b2c3d4e5f6",
"type": "enc.zero_width",
"status": "queued",
"_links": {
"result": "/tasks/tsk_…/result"
}
}非同期APIです。task_idは即時に返ります。ポーリングは1秒あたり1リクエストまでです。
料金
単価はすべて公開しています。トークン換算や独自クレジットはありません。失敗したタスクは課金されません。
エラー
| HTTP | コード | 意味 |
|---|---|---|
401 | unauthorized | APIキーが無効か、指定されていません。Authorizationヘッダーを確認してください。 |
402 | insufficient_balance | 残高が不足しています。チャージ後に再度お試しください。 |
404 | unknown_type | 指定されたタスクタイプは存在しません。タイプ名を確認してください。 |
429 | rate_limited | リクエストが多すぎます。しばらく待ってから再度お試しください。 |
技術的な注記
このゼロ幅文字エンコーダは、秘密のUTF-8文字列をU+200BとU+200Cの列に変換し、U+200DとU+FEFFの枠で囲んだうえで、カバー文の先頭文字の直後に不可視ペイロードとして挿入します。無効なマーカー、不完全なビット群、欠落フィールドはinvalid_inputで失敗し、課金されません。方式を知る者はペイロードを取り出せるため、教材・軽い透かし・デモ用途に留め、機密境界としては使わないでください。
ゼロ幅ビット符号化が秘密を目の前で隠す仕組み
可視のカバー文が読みやすいのは、ペイロードが前進幅ゼロの書式文字だけを使うからです。開始マーカーU+200Dと終了マーカーU+FEFFがそのビット列を囲むため、デコードは文書内の無関係な不可視文字を無視しつつ、定義どおりのペイロードを復元できます。壊れた列は文字化けではなくinvalid_inputとして表面化します。この契約は授業でのステガノグラフィ説明と一致しつつ、通信路が機密であるとは装いません。
入力契約・モード・応答形・エラー
modeにはencodeまたはdecodeを送ります。modeの別名はencode向けにhide・embed、decode向けにreveal・extractがあり、mode省略時の既定はencodeです。encodeでは空でないsecret(別名messageまたはpayload、最大4096文字)と空でないカバー文(text、input、value、dataとしても受理、最大100000文字)が必須です。decodeでは枠付きペイロードを含む空でないtext(別名cover、input、value、data、stego、最大200000文字)が必須です。encode成功時の本体にはresult(ステゴ文字列)、mode、encoding zero_width、secret_length、cover_length、result_length、byte_count、bit_count、zero_width_count、formula、隠したUTF-8バイト数を要約する短いmessageが含まれます。decode成功時にはresultとsecret(抽出文字列)、mode、encoding、各長さ、ビットとバイトの数、zero_width_count、formula、抽出messageが含まれます。欠落フィールド、空文字、未知のmode、開始・終了マーカー欠落、枠内の非ビット文字、入れ子マーカー、8の倍数でないビット長、ビット組立後の無効UTF-8は、明確な英語メッセージ付きのinvalid_inputを投げます。これらは前払い残高を消費しません。モードに不要な任意フィールドは使われず、マーカーが無いときにハンドラが秘密を捏造することはありません。ゼロ幅文字は本物のUnicodeなので、JSON例は正確に保持する必要があります。
プロダクトと教育でゼロ幅エンコーダが役立つ場面
成功1件あたり$0.002の決定的API呼び出しは、一度きりのスクリプト用に独自Workerを立てるより安価です。
技術的な質問
ゼロ幅文字で秘密を隠すにはどうすればよいですか?
mode encode(またはmode省略)で、空でないsecretとcoverを送ってください。APIはカバー先頭文字の直後にU+200B/U+200CビットのU+200D…U+FEFF枠を挿入したステゴ文を返します。
ゼロ幅文字エンコーダの料金は?
ブラウザツールは無料です。APIリクエストは成功1回あたり$0.002で前払いKIT残高を使い、無効入力は課金されません。