スキュタレー暗号
5列ならHELLOWORLDはHWEOLRLLODになります。棒に巻いた帯のように、テキストを行ごとにマス目へ書き、列ごとに読み出します。同じ列数で元に戻り、文字は1つも失われません。ブラウザで無料で使えます。
- 無料
- ブラウザで動作
- 登録不要
- データは端末の外に出ません
無料で実行
計算例
- テキスト
- HELLOWORLD
- 列
- 5
- 計算モード
- Encrypt
- テキスト
- HWEOLRLLOD
- 長さ
- 10
スキュタレー暗号は古代ギリシャに由来する古典的な転置暗号です。一定の太さの棒に書字用の帯を巻き付け、棒に沿って文字を書き、帯をほどくと文字が列単位の順序に入れ替わります。本機能はこの発想を決定論的な列転置として実装します。テキスト、整数の列数キー(棒の太さ)、そして暗号化か復号かのモードを指定してください。暗号化は文字を格子に行方向へ並べ、各列を下向きに読み取ります。復号は同じキーで同じ対応を逆にたどるため、長さも、空白や句読点を含むすべての文字も保持されます。1列では文章が変わらず、意味のあるスキュタレーの太さにならないためです。
スキュタレー転置の仕組み
スキュタレーは換字式暗号ではありません。どの文字も文字そのものは変わらず、順序だけが変わります。キーは円筒上の列数だと考えてください。
暗号化モードでは、エンジンが指定された列数で、左から右、上から下へと文字列を長方形の配置に並べます。最後の行が埋まらない場合、空のセルは決して埋められず出力もされないため、暗号文の長さは常に平文の長さに等しく、詰め文字が作り出されることもありません。列0を下向きに、次に列1を、というように読み取ると暗号文になります。
これはその太さの棒に巻いて書いた帯をほどいたときに見えるのと同じ入れ替わりです。復号モードは暗号文からその列優先の配置を再構築し、再び左から右へ読み取るため、同じ列数を用いる限り元の文字列が復元されます。復号で誤った列数キーを選ぶと、クラッシュではなく誤った置換になります。
これは学生が近い太さを試すときに期待するとおりの挙動です。列数が1や0では、テキストがそのまま複製されるか、太さとして未定義になります。
暗号化の手順と結果の読み方
text(平文または暗号文の文字列)、columns(整数の太さ、最小2)、mode(encrypt または decrypt。enc や dec のような短い別名も受け付けます)です。入力の長さに等しい)が含まれます。
空白、改行、句読点は他の文字と同様に格子を通過します。何も除去されず小文字化もされないため、パスワード風のデモや複数行の教室用文字列がそのまま保たれます。ある columns 値で暗号化し、同じ値で復号することで往復できます。
異なるキーでは元に戻りません。空のテキストも許可され、長さ0の空の結果を返します。現代のAEADツールは別の意図と別の脅威モデルに対応します。
教室・CTF・製品での用途とコスト
歴史や暗号学の講義では、換字式や現代暗号の前に転置を導入するためにスキュタレーが使われます。実習では、太さを知っていればメッセージが復元でき、誤った太さでは復元できないことを示せます。CTFの作問者は短いフラグを列数キーの下に隠し、この同じ決定論的ルーチンに照らして解答を検証します。
ドキュメント作成者は、別途のオフラインスクリプトを保守せずに、チュートリアルへ暗号化と復号の組を埋め込めます。作業は外部サービスを持たない純粋な解析時の文字列添字操作であるため、レイテンシは低く保たれ、コストモデルは単純です。スキュタレーを本物の秘密の機密性として扱わないでください。
これは教育とパズルの道具です。ただし columns キーはこの玩具システムの秘密のパラメータとして扱ってください。
活用例
暗号学の教室実習
古典的な転置を実演します。学生が列数キーで文を暗号化し、同じ太さで復号して元に戻します。
CTFとパズルの作問者
短い課題文をスキュタレーキーの下に隠し、同じ決定論的な暗号化/復号の組に照らして解答の提出を検証します。
ドキュメントと遊び場のデモ
置換表を手作業で保守せずに、チュートリアルや古典暗号の遊び場向けに安定した暗号文の例を生成します。
よくある質問
スキュタレー暗号とは何ですか?
古典的な転置暗号です。 文字は値を保ちますが、列(太さ)キーに従って位置が変わります。本ツールは標準的な、行方向に書き列方向に読むモデルを実装しています。
なぜ columns は2以上でなければならないのですか?
1列の太さではテキストが同じ順序のまま残るため、意味のあるスキュタレーキーになりません。
復号には同じ columns 値が必要ですか?
はい。 暗号化と復号は同じ整数キーを用います。異なる columns 値は異なる置換を適用し、元のテキストを復元しません。
空白や句読点は保持されますか?
はい。 文字列内のすべての文字が転置に参加します。何も除去、小文字化、詰め物はされません。
最後の行が埋まらないとどうなりますか?
最後の行に残った空きマスは埋めずに飛ばし、出力にも含めません。そのため、暗号文の長さは常に元のテキストと同じで、余分な詰め物の文字が加わることもありません。
関連ツール
開発者向け — APIアクセス
このページの機能はすべてAPIからも利用できます。自社システムに組み込みたいチーム向けのセクションです。それ以外の方は上のツールをそのままお使いください。
エンドポイント
Bearerトークンで認証し、POST1回でタスクをキューに登録します。結果はWebhookまたは署名付きリンクで受け取れます。
お使いのスタックから呼び出す
curl -X POST https://api.kit.forhosting.com/enc/scytale \
-H "Authorization: Bearer $KIT_KEY" \
-H "Content-Type: application/json" \
-d '{"text":"HELLOWORLD","columns":5,"mode":"encrypt"}'const res = await fetch("https://api.kit.forhosting.com/enc/scytale", {
method: "POST",
headers: {
"Authorization": `Bearer ${process.env.KIT_KEY}`,
"Content-Type": "application/json"
},
body: JSON.stringify({
"text": "HELLOWORLD",
"columns": 5,
"mode": "encrypt"
})
});
const { task_id } = await res.json();import os, requests
res = requests.post(
"https://api.kit.forhosting.com/enc/scytale",
headers={"Authorization": f"Bearer {os.environ['KIT_KEY']}"},
json={
"text": "HELLOWORLD",
"columns": 5,
"mode": "encrypt"
},
)
task_id = res.json()["task_id"]<?php
$res = file_get_contents("https://api.kit.forhosting.com/enc/scytale", false, stream_context_create([
"http" => [
"method" => "POST",
"header" => "Authorization: Bearer " . getenv("KIT_KEY") . "\r\nContent-Type: application/json",
"content" => '{"text":"HELLOWORLD","columns":5,"mode":"encrypt"}',
],
]));
$task = json_decode($res, true);body := bytes.NewBufferString(`{"text":"HELLOWORLD","columns":5,"mode":"encrypt"}`)
req, _ := http.NewRequest("POST", "https://api.kit.forhosting.com/enc/scytale", body)
req.Header.Set("Authorization", "Bearer "+os.Getenv("KIT_KEY"))
req.Header.Set("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)リクエスト例
{
"text": "HELLOWORLD",
"columns": 5,
"mode": "encrypt"
}レスポンス例
{
"task_id": "tsk_a1b2c3d4e5f6a1b2c3d4e5f6",
"type": "enc.scytale",
"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 | リクエストが多すぎます。しばらく待ってから再度お試しください。 |
技術的な注記
列数が2未満の場合は invalid_input で拒否されます。本ページでは無料でお使いいただけるほか、同一の純粋なアルゴリズムを、教室のデモ、CTFの補助、再現性が求められるドキュメント例のために、APIで1リクエストあたり$0.002で呼び出せます。
スキュタレー転置の仕組み
そのため本APIは2以上の整数を要求し、その規則が破られると invalid_input を報告します。
APIの呼び出しと結果の読み方
3つのフィールドを送信してください。text の欠落、文字列でない text、columns の欠落や非整数、2未満の columns、未知の mode はすべて invalid_input と問題を明示するメッセージで失敗するため、フォームやスクリプトが修正可能なフィードバックを表示できます。成功時のJSONには text(変換後の文字列)、mode(正規化された encrypt または decrypt)、columns(使用した整数キー)、length(結果の文字数。検索意図がまさにスキュタレーや古典的な棒転置である場合は、このエンドポイントをお選びください。
教室・CTF・製品での用途とコスト
古典暗号の遊び場を提供する製品チームは、来訪者がブラウザで無料に実験する一方、サーバー側の確認のためにAPIを呼び出せます。本ページでは無制限の変換を無料でお試しいただき、スクリプトやバックエンドサービスから統合する際は、プリペイドのKIT残高から成功1件あたり$0.002で同一の入力を自動化してください。UIラベルを encrypt と decrypt に対応させ、同じ最小2でクライアント側でも columns を検証し、ユーザーが1列や非整数を送信したときは invalid_input のメッセージを太さの入力欄の隣に表示してください。
技術的な質問
費用はいくらですか?
対話ページはブラウザで無料で動作します。API経由では成功呼び出しごとにプリペイドのKIT残高から1件$0.002が課金されます。