アフィン暗号とは|mod計算で作る換字暗号
アフィン暗号とは|mod計算で作る換字暗号
アフィン暗号は、アルファベットを A=0 から Z=25 に数値化し、E(x)=(a·x+b) mod 26 で1文字ずつ置き換える換字式暗号です。シーザー暗号が「足すだけ」なのに対し、アフィン暗号は「掛けてから足す」ことで鍵を a と b の2つに増やし、少しだけ数学的になった暗号として位置づけられます。
アフィン暗号は、アルファベットを A=0 から Z=25 に数値化し、E(x)=(a·x+b) mod 26 で1文字ずつ置き換える換字式暗号です。
シーザー暗号が「足すだけ」なのに対し、アフィン暗号は「掛けてから足す」ことで鍵を a と b の2つに増やし、少しだけ数学的になった暗号として位置づけられます。
暗号化は数値化して式に代入し、26で割った余りを文字に戻すだけですが、たとえば a=5、b=8 なら HELLO が RCLLA になるように、手順そのものは驚くほど素直です。
ただし、この記事の山場は復号です。
掛け算を戻すにはモジュラ逆数 a⁻¹ が必要で、a=5 なら a⁻¹=21 となり、この逆元が使えるのは a が26と互いに素な場合に限られます。
謎解きイベントの監修でも、参加者がシーザー暗号までは解けてアフィン暗号で止まる場面を何度も見てきましたが、つまずきの中心はまさにこの「掛け算をどう戻すか」にあります。
アフィン暗号は、暗号として動くことと安全であることが別問題だと教えてくれる好例でもあります。
鍵は12×26=312通りしかなく、さらに単一換字なので文字頻度が残り、総当たりや頻度分析、既知平文2文字からの復元にも弱い仕組みです。
教養として学ぶ価値は高いので、まずは復号の逆元を図で押さえながら、仕組みを落ち着いて追ってみてください。
アフィン暗号とは:式 (ax+b) mod 26 で文字を置き換える換字暗号
アフィン暗号は、アルファベットを A=0、B=1、…、Z=25 と数値に置き換え、E(x)=(a·x+b) mod 26 で1文字ずつ変換する換字暗号です。
式の見た目は少し硬くても、中身は「掛けて足して26で割った余りを取る」だけだと捉えると入りやすいでしょう。
シーザー暗号をもう一段ひねったもの、と先に押さえておくと全体像がすぐ見えてきます。
アルファベットを0〜25の数字に置き換える
最初の手順は、文字を数字にすることです。
A=0、B=1、C=2、…、Z=25 と並べておけば、暗号化も復号も「文字のまま」ではなく「数の計算」として扱えるようになります。
謎解きワークショップで初めてアフィン暗号を出したときに「なぜ掛け算が要るの?」と真っ先に聞かれたのですが、そこでいきなり式を見せるより、まずこの対応表をホワイトボードに書いたほうが参加者は自分で文字↔数字を追えるようになりました。
この数値化が効くのは、暗号の中身が単純な算術に落ちるからです。
各文字は E(x)=(a·x+b) mod 26 に通され、計算後は 26 で割った余りをまた文字へ戻します。
たとえば a=5、b=8 なら HELLO は RCLLA になります。
H=7 を 5×7+8=43 にして、26 の余り 17 を R に戻す、といった具合です。
数式アレルギーがあっても、ひとつずつ追えば難しいところはありません。
鍵は a と b の2つ:乗してから足す
アフィン暗号の鍵は a と b の2つです。
a は乗法側の鍵で「何倍するか」を決め、b は加法側の鍵で「いくつ足すか」を決めます。
ここがシーザー暗号との最大の違いで、シーザー暗号が b だけの移動だとすれば、アフィン暗号はそこに a の倍率が加わるため、文字の並び替えがずっと複雑になります。
シーザー暗号だけ知っている人には乗法の追加が唐突に映るので、導入では式より先に「シーザー暗号をもう一段ひねったもの」と位置づけてから入るのが自然です。
『アフィン(affine)』という名前も、この形を見れば腑に落ちます。
数学で y=ax+b と書く一次関数、あるいはアフィン変換を指す言葉で、暗号化式がまさにその姿をしているからです。
a と b を動かすだけで違う換字表が作れるので、見た目は同じ1本の式でも、実際には複数の変換パターンを持たせられます。
ここが、ただの平行移動にとどまらない面白さです。
1文字が必ず同じ文字に化ける『単一換字』
アフィン暗号は、同じ平文の文字なら必ず同じ暗号文の文字に変わる単一換字式暗号です。
A が出るたびに別の文字へ変わるわけではなく、同じ A は常に同じ文字へ置き換えられます。
この性質があるから、後半で解読を考えるときには文字の出現回数や既知平文の手がかりがそのまま効いてきます。
つまり、変換規則は少し複雑でも、暗号の構造自体は読み取れる範囲に残るわけです。
ただし、この「同じ文字に対して同じ置換が起きる」という性質は、裏を返せば弱点にもなります。
頻度の偏りは消えないので、英語なら E や T のような多用される文字が手がかりになりますし、平文と暗号文の対応が2組わかれば a と b を連立で逆算する道も開けます。
アフィン暗号がシーザー暗号の上位版と呼ばれるのは、単に式が少し派手だからではなく、両者を含む一般形でありながら、なお単一換字として解析の対象に残るからです。
シーザー暗号・乗法暗号との関係:アフィン暗号は両者を含む一般形
アフィン暗号は、アルファベットを A=0〜Z=25 と数値化し、E(x)=(a·x+b) mod 26 で1文字ずつ置換する暗号です。
鍵は乗法側の a と加法側の b の2つだけで、見た目は少し複雑でも、実際には「掛け算で混ぜて、足し算でずらす」だけの素直な構造を持っています。
ここを特殊形として分解して眺めると、シーザー暗号と乗法暗号が別物ではなく、アフィン暗号の中に自然に含まれていることが見えてきます。
シーザー暗号=アフィン暗号で a=1 にしたもの
a=1 を代入すると、式は E(x)=(x+b) mod 26 になります。
これは文字を一定数だけ前へずらすシーザー暗号そのものです。
『シーザー暗号は a=1 の場合だよ』と一言添えた瞬間に参加者の表情がほぐれるのを何度も見てきましたが、その反応は自然です。
新しい暗号を覚えるのではなく、よく知る暗号がアフィン暗号の一部だと分かれば、式は暗記対象ではなく分解して読める対象になるからです。
たとえば b=3 なら、A は D に、B は E に、C は F に移ります。
ずらす量こそ違っても、やっていることは全文字に同じ加算を施すだけで、規則はきわめて単純です。
だからこそ、アフィン暗号を学ぶときはまずシーザー暗号を「a を1に固定した姿」として捉えるのが近道になります。
一般形から特殊形が見えれば、逆に特殊形から一般形も無理なく組み立てられるでしょう。
乗法暗号=アフィン暗号で b=0 にしたもの
b=0 とすると、E(x)=(a·x) mod 26 になり、これは乗法暗号、つまり掛け算だけの暗号です。
加える成分が消えるので、文字の位置は a 倍されて並び替えられます。
アフィン暗号はこの乗法暗号に、さきほどのシーザー暗号の「ずらし」を組み合わせた一般形だと考えると、a と b が別々に入っている理由がはっきりします。
ただし、乗法だけで済ませると弱点がすぐ顔を出します。
x=0、つまり文字Aは、a を何倍しても 0 のままで、必ず A に固定されてしまうのです。
実際に乗法暗号だけを試すと、誰かが「Aが動かない!」と気づくことがあります。
その驚きが残るうちに b を足す発想へつなげると、b が単なる飾りではなく、固定点をずらして弱点を消すための必須要素だと体験として理解できます。
乗法→加法の二段がけで弱点を消す
アフィン暗号の本質は、まず乗法で混ぜ、そのあと加法でずらす二段がけにあります。
掛け算だけでは 0 が 0 のまま残りますが、最後に b を足せば、その固定点は別の位置へ押し出されます。
だから「乗法暗号で混ぜてからシーザー暗号でずらす」という順番が、そのまま式 E(x)=(a·x+b) mod 26 の意味になっているのです。
この順番を理解すると、暗号化と復号の手順も自然に見えてきます。
暗号化では先に a·x を計算してから b を足し、mod 26 で文字に戻しますが、復号では逆に b を引いてから a の逆元を掛けます。
mod の世界では普通の割り算が使えないため、a で割る代わりに a⁻¹ を使う必要があるのも、この二段がけの裏返しです。
式を丸暗記するより、まず混ぜて、あとでずらす。
その発想で捉えると、a と b の2パラメータがなぜ必要なのかがすっきり腑に落ちます。
手を動かす暗号化:a=5, b=8 で『HELLO』を暗号化する
鍵 a=5、b=8 で HELLO を暗号化する手順は、文字をいったん数字に置き、その数字に 5x+8 を当て、26で割った余りをもう一度文字へ戻す、という流れで進みます。
ここでの mod 26 は難しい記号ではなく、「26を引けるだけ引いたあとの残り」を取る操作だと考えると、暗算でも追いやすくなります。
実演では最初の H だけを丁寧に追うと定着しやすく、残りは同じ型で一気に処理すると理解が揃います。
Step1:平文を数字に変換する
まずは HELLO の各文字を、A=0 から Z=25 までの対応で数字に直します。
H は 7、E は 4、L は 11、O は 14 です。
最初の 1 文字を一緒に計算すると、あとの文字も同じ規則で動くと気づきやすいので、ここでは H を起点にして手順を固めましょう。
文字を数字にするのは、暗号を「見た目の置き換え」ではなく「計算できる形」に変えるためであり、ここが再現性の土台になります。
Step2:ax+b を計算して mod 26 を取る
H=7 なら、5·7+8=43 です。
ここで 43 mod 26 は 17 になりますが、意味は単純で、43 から 26 を 1回引くと 17 が残る、ということです。
電卓なしでつまずきやすいのはこの部分ですが、「26を引けるだけ引く」と言い換えると処理しやすくなります。
実際、参加者に H だけを一緒に計算してもらうと、その後の E 以降はテンポよく進めても手が止まりません。
同じ要領で E=4 なら 5·4+8=28、28 mod 26=2 です。
L=11 なら 5·11+8=63、63 mod 26=11 となり、O=14 では 5·14+8=78、78 mod 26=0 になります。
L が L のまま残るのは、暗号化で元の文字に戻るように見える固定点の一種で、異常ではありません。
むしろ、式がたまたま同じ位置へ戻すことがあると知っておくと、結果を見たときに不安にならずに済みます。
| 平文文字 | 数値 | 5x+8 | mod26 | 暗号文字 |
|---|---|---|---|---|
| H | 7 | 43 | 17 | R |
| E | 4 | 28 | 2 | C |
| L | 11 | 63 | 11 | L |
| L | 11 | 63 | 11 | L |
| O | 14 | 78 | 0 | A |
Step3:数字をアルファベットに戻す
最後に、mod 26 で得た数字をアルファベットへ戻します。
17 は R、2 は C、11 は L、0 は A なので、HELLO は RCLLA になります。
ここまでの変換が1文字ずつ独立しているので、別の文字でも別の鍵でも、同じ表を作れば再現できます。
暗号化の式と数値対応を目で確認できるようにしておくと、手計算でも仕組みが崩れません。
おすすめです。
この見方を一度つかむと、暗号文は「謎の文字列」ではなく、元の平文を規則でずらした結果だとわかります。
自分で別の単語を選び、同じ手順で計算してみてください。
つまずいたら、まず H の1文字に戻って、5x+8 と 26で割った余りだけを丁寧に追えば十分です。
復号の式とモジュラ逆数 a⁻¹:暗号文を平文に戻す
復号では、暗号化でやった「a を掛けて b を足す」操作を、逆向きにたどります。
つまり y からまず b を引き、そのあと a の逆元 a⁻¹ を掛けるので、式は D(y)=a⁻¹·(y−b) mod 26 になります。
ここでつまずきやすいのが、mod の世界ではふつうの割り算がそのまま使えない点です。
割る代わりに a⁻¹ を掛ける、これが復号の核心です。
復号は『b を引いて a⁻¹ を掛ける』
暗号文を平文へ戻すときは、順番がそのまま逆になります。
先にずらし量 b を打ち消し、次に拡大率 a を戻す、という流れです。
ここを取り違えると答えはすぐ崩れます。
復号の節で脱落者が最も出るのも、原因がほぼ「割り算をどう mod でやるか」の一点に絞られるからでしょう。
逆元を「掛けると1に戻る相棒の数」と考えると、抽象式より先に手触りがつかめます。
モジュラ逆数 a⁻¹ とは何か
モジュラ逆数 a⁻¹ は、a·a⁻¹≡1 (mod 26) を満たす数です。
普通の数なら 1/a に当たりますが、26で割った余りの世界では整数として現れます。
たとえば a=5 のとき a⁻¹=21 で、5·21=105=4·26+1 となり、26で割ると1余ることが確かめられます。
電卓でただ答えを出すより、この検算を一度見ておくと、逆元が「計算のための記号」ではなく、実際に働く道具だと分かりやすいはずです。
RCLLA を HELLO に戻してみる
暗号化で作った RCLLA を HELLO に戻すと、R=17 に対して 21·(17−8)=21·9=189 となります。
ここで大きい数が出ますが、mod を取るのは掛け算のあとです。
189 mod 26=7、7=H です。
手で確かめるなら、189 から 26 を7回引くと 7 に戻るので、余りの感覚が身体に残ります。
続く文字も同じ要領でたどれば、RCLLA は HELLO に戻ります。
典型的なミスは、b を引く前に a⁻¹ を掛けてしまうこと、そして a⁻¹ ではなく a を掛けてしまうことです。
順序と逆元の取り違えさえ避ければ、復号は安定して読めるようになります。
なぜ a は12通りしか使えないのか:26と互いに素という条件
アフィン暗号は、アルファベットをA=0、B=1、…、Z=25と数値化し、暗号化式 E(x)=(a·x+b) mod 26 で置き換える単一換字式暗号です。
ここで a が乗法側の鍵、b が加法側の鍵になります。
シーザー暗号は b だけを動かす特殊例ですが、アフィン暗号はそこに a を加えた上位版として、置換の幅を一気に広げます。
互いに素 gcd(a,26)=1 が逆元の存在条件
a を自由に選べない理由は、復号に必要な逆元 a⁻¹ が存在するかどうかで決まるからです。
a⁻¹ が見つかるのは gcd(a,26)=1、つまり a と 26 が互いに素のときだけで、これがアフィン暗号の土台になります。
ワークショップで a=2 を選ぶ人が出ると、たいていそこで復号が止まりますが、その失敗こそ条件の意味を体で覚える近道です。
a=2 や a=4 のように 26 の因数を含む値を入れると、異なる平文が同じ暗号文に衝突します。
26 は 2×13 なので、2や13の倍数を a にすると、写像が1対1にならず、受け取った側は元の文字を一意に戻せません。
単一換字式暗号として成立するには、見た目の置換ではなく、復号可能な置換であることが前提になるわけです。
シーザー暗号が「ずらすだけ」なのに対し、アフィン暗号はずらし方そのものを数学的に管理する点が違います。
使える a は12個・鍵は全部で312通り
26 と互いに素な a は 1,3,5,7,9,11,15,17,19,21,23,25 の12個です。
そこに b の26通りを掛けるので、鍵空間は 12×26=312 通りになります。
数だけを見ると小さく感じるかもしれませんが、ここで大切なのは「a が12通りしかない」のではなく、「復号できる a が12通りに厳しく絞られる」という点です。
この12個を押さえておけば、暗号化と復号の流れはぐっと見通しやすくなります。
a が乗法側の鍵、b が加法側の鍵だと意識すると、どちらを変えたときに何が起こるかも整理しやすいでしょう。
さらに、a ごとの逆元を表にしておけば、実践では表引きだけで十分回せます。
参加者に対応表を配ったとき復号が一気に速くなったのは、理屈より先に手を動かせる形へ落とし込めたからです。
拡張ユークリッド互除法で a⁻¹ を求める
a⁻¹ を求める方法は大きく2つあります。
ひとつは 26 を法として a·k mod 26=1 となる k を総当たりで探すやり方、もうひとつは拡張ユークリッド互除法で係数を逆向きにたどるやり方です。
前者は計算が単純で、後者は手順が体系的なので、どちらも「逆元を見つける」という目的に直結しています。
実用上は、12個の a それぞれについて逆元の対応表を持っておくのがいちばん軽い運用です。
理屈としては gcd(a,26)=1 であることを確認し、復号では a⁻¹ を使って元の x を戻す、ただそれだけです。
アフィン暗号は仕組みを知ると複雑そうに見えて、実際には「使える a を見分け、逆元を押さえ、b でずらす」だけの明快な暗号だとわかります。
アフィン暗号の解読:頻度分析と既知平文2文字で鍵が割れる
アフィン暗号は、見た目は洗練されていても、鍵空間の小ささと単一換字という性質であっさり崩れます。
総当たりは 312 通りしかなく、計算機なら一瞬、人の手でも試し切れる規模です。
しかも1文字が常に同じ文字に化けるため、暗号文には統計的な癖がそのまま残ります。
鍵が312通りしかない:総当たりで即陥落
アフィン暗号の鍵は 312 通りしかありません。
暗号化する側から見れば選択肢は十分でも、破る側から見れば話は別で、全数探索の負担が軽すぎます。
実際には計算機で片端から試せば一瞬で尽きるため、CTF の古典問題では慣れた人ほどまずスクリプトを書き、頻度分析を飛ばしてでも総当たりで抜きます。
安全でない暗号が破る側にとってどれほど楽か、ここでよくわかります。
この小ささは、アフィン暗号が学習用や遊びの題材には向いていても、守る対象が現れる現実の通信には向かないことを示します。
鍵空間が狭い暗号は、計算能力の向上に耐えられません。
人間が手で破れるかどうかが議論になる時点で、実用暗号としてはすでに厳しいのです。
現代暗号がまず鍵空間を巨大化させるのは、この弱点を正面から潰すためです。
頻度分析:最頻文字をEと仮定して連立を解く
アフィン暗号は単一換字なので、平文のある文字は暗号文でも常に同じ文字になります。
だから統計的特徴が消えず、英語なら最頻出文字の E と次に多い T が、そのまま暗号文の頻度にも反映されます。
ここで最頻文字を E、次を T と仮定すると、対応候補が2つ得られ、鍵の絞り込みが始まります。
頻度分析が効く理由は単純で、文字の出現傾向までまとめて隠せていないからです。
謎解きの現場でも、この性質はよく効きます。
参加者に解読を競わせたとき、平文の冒頭が THE だと当たりをつけたチームが、最初に既知平文攻撃へ持ち込んで最速でした。
crib、つまり手がかり平文が一つあるだけで、暗号は急に“推理ゲーム”から“方程式の問題”に変わります。
実運用で平文を推測されてはいけない理由は、まさにここにあります。
既知平文2文字から a, b を逆算する
平文・暗号文のペアが2組、\((m_1,c_1),(m_2,c_2)\) と分かれば、鍵は代数的に一意に求まります。
差を取ると \(c_1-c_2=a(m_1-m_2)\mod 26\) となり、そこから \(a=(c_1-c_2)\cdot(m_1-m_2)^{-1}\) と求められます。
続けて \(b=c_1-a\cdot m_1\) を計算すれば、鍵を逆算できます。
見た目は文字の置き換えでも、内部では連立方程式そのものです。
2文字で崩れるのは、暗号としての厚みが足りないからです。
この手順は、解読を「感覚」ではなく「計算」に変えます。
CTF でアフィン暗号が出ると、慣れた人が既知平文の候補を探し、当たりを引いた瞬間に鍵が確定するのはそのためです。
数学の入門教材、謎解き、CTF の題材としては優秀でも、312 通りの鍵と頻度の漏れでは実用的な安全性はありません。
だからこそ、より大きな鍵空間と頻度を隠す仕組みを備えた現代暗号へ進む必要があるのです。
サイエンスライター。暗号と映画・文学・パズル文化の接点を探るコラムを得意とし、暗号を「解く楽しさ」から伝えます。
関連記事
アトバシュ暗号とは|逆順換字の仕組みと聖書の起源
アトバシュ暗号は、アルファベットを逆順に折り返して対応させるだけの、きわめて単純な換字式暗号である。A は Z、B は Y と対応し、暗号化と復号が同じ操作になる自己反転性を持つため、仕組みの核心はこの一文だけでほぼつかめます。
レールフェンス暗号とは?柵で並べ替える解き方
レールフェンス暗号は、平文の文字を柵のレールにジグザグに書き、段ごとに拾い直して並び順だけを変える転置式暗号である。別名はジグザグ暗号で、換字式と違って文字そのものは置き換えないため、暗号文の文字の出現頻度が平文と一致する。
ポリュビオスの暗号表とは?5×5マスの数字暗号を解読する
ポリュビオスの暗号表は、5×5のマス目に文字を並べ、その位置を行番号と列番号の2桁で示すだけの、きわめてシンプルな換字式暗号である。名前は難しそうでも、数学の知識は要らず、表さえあれば誰でも文字を数字に変え、数字を文字に戻せます。
踊る人形の暗号とは?ホームズの換字式を読み解く
踊る人形は、アーサー・コナン・ドイルの短編に登場する暗号で、1903年12月に雑誌発表され、1905年刊行の『シャーロック・ホームズの帰還』にも収録された作品です。