ポータ暗号
パスフレーズPORTAでは「Hello, World!」が「Oytub, Chjuq!」になり、同じパスフレーズで元に戻ります。文字は13組の対になったアルファベットで変わり、空白、数字、句読点はそのまま残ります。ブラウザで無料で使えます。
- 無料
- ブラウザで動作
- 登録不要
- データは端末の外に出ません
無料で実行
計算例
- テキスト
- Hello, World!
- Key
- PORTA
- 結果
- Oytub, Chjuq!
- エンコード
- porta
- キーの文字
- PORTA
- 鍵の長さ
- 5
ポータ暗号はジョヴァンニ・バッティスタ・デッラ・ポルタが考案した古典的な相互可逆の多表式換字暗号です。ラテン文字は13組のアルファベットのひとつを使い、繰り返すパスフレーズに対して変換されます。その表は自分自身の逆写像であるため、同じ鍵で暗号文を再度通すと元の平文に戻ります。テキストと、ラテン文字を少なくとも1文字含むパスフレーズを貼り付けてください。AからZおよびaからzは鍵に従って動き、数字・空白・句読点などはそのまま残るため、読みやすい構造が保たれます。
ポータ暗号がパスフレーズでテキストを変換する仕組み
ポータはヴィジュネル族の多表式の親戚ですが、暗号化表は異なり相互可逆です。26の鍵文字は13行にまとまります。AとBがひとつのアルファベットを共有し、CとDが次、YとZまで続きます。
メッセージ中の各英字について、次のパスフレーズ文字を取り(変換する文字がある限り鍵は繰り返します)、その対の行を選び、半アルファベット表で平文文字を写像します。アルファベット前半(AからM)は行依存の回転で後半(NからZ)に、後半は前半に移ります。大文字小文字は保たれ、大文字のHは大文字の暗号文字になり、小文字は小文字のままです。
AからZおよびaからz以外の文字(空白、カンマ、数字、絵文字、基本ラテン以外のアクセント付き文字など)は変更せずコピーされ、パスフレーズのポインタを進めません。この設計は古典暗号の教科書のポータ表と一致します。表は対合であるため、同じパスフレーズを2回適用すると最初の変換が取り消されます。
暗号化と復号は同じ操作なので、このツールに別モードのフラグは不要です。数学的には各段が固定の13対構造上の整数剰余演算であり、鍵の浮動小数点丸め、ネットワーク呼び出し、乱数シード、壁時計の時刻はありません。ヴィジュネル加算、ボーフォート減算、AES、辞書語を総当りする自動鍵復元は対象外です。
それらは別ツール・別検索意図・別ランディングです。
ポータ暗号ツールが実務で使われる場面
暗号入門の授業ではカエサルの後、他の多表式表と並んでポータを紹介し、別の復号規則を必要としない相互可逆写像を練習させ、鍵文字の対が26文字を13アルファベットに畳む様子を見せます。
キャプチャ・ザ・フラッグのウォームアップやパズルハントでは今なおポータやその変種のメッセージが隠れ、解く側は汎用の暗号解析スイートではなく、速く予測可能なパスフレーズ変換を求めます。サポートやコンテンツのチームは、ネタバレ、クイズの答え、内部ラベルを古典パスフレーズ暗号で軽く難読化し、言語固有の暗号ライブラリを入れずに逆変換を必要とすることがあります。
1文字のカエサルシフト、多表ヴィジュネル加算、ボーフォート減算、強力な認証付き暗号、Base32やBase64符号化、頻度分析による自動鍵復元が必要な場合は、この古典ポータのパスフレーズページを過負荷にせず、別の検索意図とランディングとして扱ってください。
活用例
授業での相互可逆多表式デモ
既知のパスフレーズで例文を暗号化・復号し、暗号入門でポータの13組アルファベットを、別の復号モードなしで示します。
パズルとCTFのパスフレーズ暗号
課題セットごとに使い捨てスクリプトを書かず、挑戦文字列にポータのパスフレーズを適用または逆転します。
よくある質問
ポータ暗号とは何ですか?
鍵文字の対(A/B、C/D、…、Y/Z)で選ばれる13のアルファベットのひとつを通して各文字を写像する、古典的な相互可逆多表式暗号です。同じ操作が暗号化と復号を行います。
ポータの暗号文はどう復号しますか?
暗号文をtext、元のパスフレーズをkeyとして同じ能力をもう一度呼び出します。ポータは自己逆写像のため、2回目で平文に戻ります。
鍵が欠落または空の場合はどうなりますか?
パスフレーズにはラテン文字A–Zまたはa–zが少なくとも1文字必要です。欠落・空・文字なしの鍵は拒否され、課金されません。
空白や句読点は暗号化されますか?
いいえ。 変換されるのはA–Zとa–zのみです。空白、数字、句読点、その他の文字はそのまま通り、鍵を進めません。
料金はいくらですか?
ブラウザツールは無料でローカル実行です。無効な入力は課金されません。
関連ツール
開発者向け — APIアクセス
このページの機能はすべてAPIからも利用できます。自社システムに組み込みたいチーム向けのセクションです。それ以外の方は上のツールをそのままお使いください。
エンドポイント
Bearerトークンで認証し、POST1回でタスクをキューに登録します。結果はWebhookまたは署名付きリンクで受け取れます。
お使いのスタックから呼び出す
curl -X POST https://api.kit.forhosting.com/enc/porta \
-H "Authorization: Bearer $KIT_KEY" \
-H "Content-Type: application/json" \
-d '{"text":"Hello, World!","key":"PORTA"}'const res = await fetch("https://api.kit.forhosting.com/enc/porta", {
method: "POST",
headers: {
"Authorization": `Bearer ${process.env.KIT_KEY}`,
"Content-Type": "application/json"
},
body: JSON.stringify({
"text": "Hello, World!",
"key": "PORTA"
})
});
const { task_id } = await res.json();import os, requests
res = requests.post(
"https://api.kit.forhosting.com/enc/porta",
headers={"Authorization": f"Bearer {os.environ['KIT_KEY']}"},
json={
"text": "Hello, World!",
"key": "PORTA"
},
)
task_id = res.json()["task_id"]<?php
$res = file_get_contents("https://api.kit.forhosting.com/enc/porta", false, stream_context_create([
"http" => [
"method" => "POST",
"header" => "Authorization: Bearer " . getenv("KIT_KEY") . "\r\nContent-Type: application/json",
"content" => '{"text":"Hello, World!","key":"PORTA"}',
],
]));
$task = json_decode($res, true);body := bytes.NewBufferString(`{"text":"Hello, World!","key":"PORTA"}`)
req, _ := http.NewRequest("POST", "https://api.kit.forhosting.com/enc/porta", body)
req.Header.Set("Authorization", "Bearer "+os.Getenv("KIT_KEY"))
req.Header.Set("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)リクエスト例
{
"text": "Hello, World!",
"key": "PORTA"
}レスポンス例
{
"task_id": "tsk_a1b2c3d4e5f6a1b2c3d4e5f6",
"type": "enc.porta",
"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 | リクエストが多すぎます。しばらく待ってから再度お試しください。 |
技術的な注記
鍵が欠落している、空である、またはアルファベット文字を含まない場合は即座にinvalid_inputで拒否され、課題チェッカーやスクリプトが黙って既定パスフレーズに落ちることはありません。無料のブラウザツールと有料APIは同じ純粋な同型関数を共有するため、授業デモ、CTFのウォームアップ、自動パイプラインはネットワーク呼び出しや乱数シードなしで、同じ入力に対して常に同じ変換結果に一致します。
ポータ暗号がパスフレーズでテキストを変換する仕組み
同一のテキストとパスフレーズは常に同一のJSONを生成します。このページは古典ポータのみを実装します。
送信するものと返ってくるもの
textは変換するメッセージの空でない文字列である必要があります。keyはアルファベットフィルタ後に空であってはなりません。検証失敗は前払い残高を消費しません。古典的な確認例は、パスフレーズPORTAでHello, World!を変換し、暗号文と同じ鍵を入れると元の句が戻ること、空の鍵が恒等変換として扱われず拒否されることです。必須の文字列フィールドtextと必須の文字列フィールドkeyを送ってください。空白のみの文字列や数字・記号だけの鍵はinvalid_inputで失敗し、欠落または空の鍵の要件を述べる明確な英語メッセージが返ります。成功時の応答には変換後文字列result、encodingのporta、実際に使われた大文字A–Zストリームのkey_letters、そのストリームの英字位置数key_length、input_lengthとoutput_length、移動した英字数shifted_chars、reciprocalのtrue、およびクライアントが到達プロファイルを検証できる対表ルールのformula文字列が含まれます。text欠落、key欠落、いずれかのフィールドが文字列でない、空のtext、文字のない鍵はinvalid_inputになります。成功したAPI呼び出しの料金は公開ベースの1件あたり$0.002です。
ポータ暗号ツールが実務で使われる場面
この能力は純粋なparseエンジンであるため、API料金は成功した1件あたり公開ベースの$0.002で、検証失敗は残高を消費しません。
連携の活用例
ネタバレとラベルの軽い難読化
クイズの答えや内部ラベルを古典パスフレーズで混ぜ、のちにブラウザまたはAPIの同じ契約で復元します。