アフィン暗号
各文字の位置にaを掛けてbを足すアフィン暗号で、暗号化と復号ができます。aを5、bを8にすると、AFFINE CIPHERはIHHWVC SWFRCPになります。復号に使うaの逆数、この場合の21も表示されます。ブラウザで無料で使えます。
- 無料
- ブラウザで動作
- 登録不要
- データは端末の外に出ません
無料で実行
計算例
- テキスト
- AFFINE CIPHER
- A
- 5
- B
- 8
- 計算モード
- Encrypt
- 結果
- IHHWVC SWFRCP
- Aの逆数
- 21
- 長さ
- 13
- 変換された文字数
- 12
アフィン暗号は、各文字の位置xを線形の式 E(x)=(a·x+b) mod 26 で変換する古典的な単一換字暗号です。aは26と互いに素な乗数、bは加算シフトです。復号ではaのモジュラ逆数を掛けるため、有効な鍵ペアはすべて完全に可逆です。ROT13やアトバシュとは異なり、両方の鍵は許可された集合内の自由なパラメータであり、固定シフトのシーザー暗号と本格的なキーワード単一換字暗号の中間に位置する標準的な教材です。暗号解読の宿題、CTFの練習、パズル本、合同算術の授業デモなどに使われます。この機能は空でないテキスト、整数の鍵aとb、任意の暗号化・復号モードを受け付け、変換後の文字列とaの逆数、文字数を返します。
検証ルール、互いに素な鍵、よくある落とし穴
決定的な製品ルールは、a が26と互いに素でなければならないことです。モジュラ逆数が存在するには gcd(a,26) が1でなければなりません。有効な乗数は、1、3、5、7、9、11、15、17、19、21、23、25です。
偶数や13の倍数は26と約数を共有するため、a が互いに素でないという明確なメッセージとともに拒否されます。空白、数字、句読点は除去されません。出力を機密保持のための暗号として扱わないでください。
鍵空間はごく小さく、頻度分析は依然として有効であり、製品ページでアフィン暗号をパスワード、トークン、個人データのセキュリティ対策として宣伝してはいけません。検索意図がアフィン暗号、アフィンの暗号化・復号、モジュラ単一換字暗号の場合はこのランディングを選んでください。
アトバシュとROT13は固定写像、レールフェンスは転置、Base64はエンコードの意図に応えるため、別ツールのままです。復号時には暗号文を生成したのと同じ a と b を使ってください。間違ったペアでは別の換字になり、元の平文と一致しません。
成功する暗号化パスと互いに素でない a のエラーの両方で継続的インテグレーションのフィクスチャを固定し、逆数や gcd の不用意な変更が見落とされないようにしてください。
授業での使い方と限界
無料のブラウザ版アフィン暗号は、宿題の確認、講義スライド、CTFの練習、単発の暗号化・復号に、言語ごとにモジュラ逆数のコードを書くことなく利用できます。検証失敗は拒否後に残高を消費しません。典型的な授業の流れでは、シーザー暗号が a が1の特殊例であることを示し、次に互いに素な集合の中で a を変化させ、偶数の乗数が可逆性を壊すことを実演します。
サポートの手順書では、スタッフが既知の授業用鍵で書いた軽く難読化されたメモを元に戻せます。パズルサイトは答えを事前計算して表示し、mode decrypt でオンデマンドに公開できます。
ソーステキストは他のKITのparse項目と同じ保持ルールに従い、アルゴリズムはアイソレート間で完全に決定的なため、結果は継続的インテグレーションのフィクスチャに安全に固定できます。後の教材段階で別の暗号系が必要な場合にのみ、頻度分析など他の古典的ツールと組み合わせてください。
SEO意図を鍵付きモジュラ換字に絞るため、アフィン暗号は専用のランディングに保ちましょう。
活用例
暗号解読の宿題とCTFの練習
学生は既知の a と b で短いフレーズを暗号化し、クラスメートの暗号文を復号したり、CASをインストールせずに制約付きで鍵を復元したりします。
授業での合同算術デモ
教師は互いに素な乗数だけが可逆であることを示し、アフィン暗号を固定のアトバシュやROT13と対比し、a が5、b が8 を教科書のフィクスチャとして固定します。
パイプラインとCIのフィクスチャ
スクリプトや継続的インテグレーションのテストは、決定的なアフィン出力と互いに素でない a のエラーを固定し、逆数や gcd の不用意なバグを素早く失敗させます。
よくある質問
アフィン暗号文を復号するには?
暗号文を text として、暗号化に使ったのと同じ a と b、そして mode decrypt(または decode)を送信します。鍵が一致すれば、結果は復元された平文です。
a が26と互いに素でないとどうなりますか?
アフィン写像が全単射になるのは gcd(a,26)=1 のときだけで、偶数の乗数と13の倍数は拒否されます。
アフィン暗号ツールは無料ですか?
ブラウザツールはお使いのデバイス上で無料で動作します。検証失敗は課金されません。
アフィン暗号は安全な暗号ですか?
いいえ。 アフィン暗号はパズルや教育向けの古典的な単一換字暗号であり、機密保持用ではありません。パスワードや機密データには絶対に使用しないでください。
空白や数字、大文字はどう扱われますか?
変わるのはラテン文字だけです。数字や空白、記号、絵文字、ほかの文字体系はそのまま残り、各文字は大文字か小文字かも保たれます。
関連ツール
開発者向け — APIアクセス
このページの機能はすべてAPIからも利用できます。自社システムに組み込みたいチーム向けのセクションです。それ以外の方は上のツールをそのままお使いください。
エンドポイント
Bearerトークンで認証し、POST1回でタスクをキューに登録します。結果はWebhookまたは署名付きリンクで受け取れます。
お使いのスタックから呼び出す
curl -X POST https://api.kit.forhosting.com/enc/affine \
-H "Authorization: Bearer $KIT_KEY" \
-H "Content-Type: application/json" \
-d '{"text":"AFFINE CIPHER","a":5,"b":8}'const res = await fetch("https://api.kit.forhosting.com/enc/affine", {
method: "POST",
headers: {
"Authorization": `Bearer ${process.env.KIT_KEY}`,
"Content-Type": "application/json"
},
body: JSON.stringify({
"text": "AFFINE CIPHER",
"a": 5,
"b": 8
})
});
const { task_id } = await res.json();import os, requests
res = requests.post(
"https://api.kit.forhosting.com/enc/affine",
headers={"Authorization": f"Bearer {os.environ['KIT_KEY']}"},
json={
"text": "AFFINE CIPHER",
"a": 5,
"b": 8
},
)
task_id = res.json()["task_id"]<?php
$res = file_get_contents("https://api.kit.forhosting.com/enc/affine", false, stream_context_create([
"http" => [
"method" => "POST",
"header" => "Authorization: Bearer " . getenv("KIT_KEY") . "\r\nContent-Type: application/json",
"content" => '{"text":"AFFINE CIPHER","a":5,"b":8}',
],
]));
$task = json_decode($res, true);body := bytes.NewBufferString(`{"text":"AFFINE CIPHER","a":5,"b":8}`)
req, _ := http.NewRequest("POST", "https://api.kit.forhosting.com/enc/affine", body)
req.Header.Set("Authorization", "Bearer "+os.Getenv("KIT_KEY"))
req.Header.Set("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)リクエスト例
{
"text": "AFFINE CIPHER",
"a": 5,
"b": 8
}レスポンス例
{
"task_id": "tsk_a1b2c3d4e5f6a1b2c3d4e5f6",
"type": "enc.affine",
"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 | リクエストが多すぎます。しばらく待ってから再度お試しください。 |
技術的な注記
aが26と約数を共有する場合、対応が全単射にならないため invalid_input で失敗します。
アフィン写像の仕組みとレスポンスの内容
暗号化では、各ラテン文字を0から25までの数値として扱い、鍵aを掛け、鍵bを足し、26で剰余を取ってから、元の大文字小文字を保ったまま文字に戻します。AからZまでの大文字とaからzまでの小文字は同じオフセットを使うため、大文字小文字が混在する文は形を保ったまま文字の同一性だけが変わります。数字、空白、句読点、絵文字、ラテン文字以外の文字体系はそのまま通過するため、メッセージの空白や記号は維持されます。省略可能な mode の既定値は encrypt で、encrypt と encode は順方向の写像を、decrypt と decode は逆方向を実行します。復号では、a·a_inv ≡ 1 mod 26 を満たすモジュラ逆数 a_inv を計算し、各文字に対して D(y)=a_inv·(y−b) mod 26 を評価して平文を復元します。必須の文字列フィールド text に空でないメッセージ、1から25までで26と互いに素な必須の整数 a、0から25までの必須の整数 b を含む JSON を送信してください。input、value、s、message は本文のエイリアスとして機能し、multiplier、key_a、alpha は a のエイリアス、shift、key_b、beta は b のエイリアスです。成功時のレスポンスには、変換後のテキストを持つ result、encrypt または decrypt に正規化された mode、鍵をそのまま返す a と b、復号に使った逆数の a_inv、入力文字数と等しい length、実際に変換されたA–Zまたはa–zの文字を数える letters_transformed、クライアントが形を推測せずに分岐できるよう affine と等しい method が含まれます。ネットワークも乱数シードも時計も使わない純粋な合同算術なので、同一の入力からは常に同一の JSON が生成されます。
検証ルール、互いに素な鍵、よくある落とし穴
text の欠落、文字列でない text、空文字列はいずれも invalid_input を発生させ、エンジンがリクエストを拒否した後はプリペイドAPIで課金されません。a または b の欠落、整数でない鍵、1から25の範囲外の a、0から25の範囲外の b も invalid_input で失敗します。換字に参加するのはラテン文字だけなので、句読点の多い文字列でも letters_transformed の数値が小さいだけで完全な結果が返ります。
APIの使い方、料金、授業でのワークフロー、実用上の限界
バックエンド、サーバーレス関数、個別指導プラットフォーム、SDK が安定した契約を必要とする場合は、成功した項目ごとに$0.002の残高制プリペイドKIT APIをご利用ください。SDKを公開する開発者は result フィールドをコピーボタンに直接接続でき、a、b、a_inv、method はOpenAPIの例を自己説明的にします。ペイロードは Worker アイソレートの項目呼び出しに適した通常のテキストサイズに抑えてください。このツールはメッセージや断片向けであり、数メガバイトのバイナリblob向けではありません。
技術的な質問
アフィン暗号でテキストを暗号化するには?
空でない text、26と互いに素な整数 a(例:5)、0〜25の整数 b(例:8)、任意の mode encrypt(既定値)を含む JSON を送信します。レスポンスの result フィールドに暗号文が入ります。