暗号の不思議な数学:数学初心者でも楽しめる暗号入門
1 序章:暗号の不思議な世界へようこそ!
暗号というと、何を想像しますか?私は推理小説や某アニメのキャラクターを想像します。
では、その作品のキャラクターが数学を使っているかと聞かれると「NO!!」ですよね?私も学習するまでは、暗号と数学って関係していないと思っていました。
この記事を読み終わったとき、「へぇ~。こういうところに数学が使われているんだ」と思ってもらえる記事を書きたいと思います。また、数学が得意ではないという方にも楽しんでもらえる内容にしていきますので、最後まで読んでいただければと思います!!
2 暗号って何? 数学の力でメッセージを秘密にしよう!
・ 暗号の歴史
Q 暗号っていつからあると思いますか?
① 約30年前
② 約300年前
③ 約800年前
④ 約1300年前
⑤ 約1800年前
⑥ 約2300年前
答えは、⑥ 約2300年前 です。驚きですよね?
約2600年前に作られたのは、ポリュビオス式暗号という暗号です。
これは古代ギリシャの軍人たちが、戦場で離れた場所にいる味方と連絡を取り合うために、松明を利用した暗号です。

その後、紀元前60年ごろ、「賽は投げられた」や「ブルータスよお前もか」で有名なユリウス・カエサル(英語読みではシーザー)が、シーザー式暗号を作って戦争で多くの成果を出します。
時は経ち、世界大戦でも使われた「エニグマ暗号」が作られます。映画「イミテーションゲーム」で、一気に認知が広まった暗号です。
そして、1977年に公開鍵暗号方式の「RSA暗号」が作られました。
・ 暗号は何のためにあるの?
暗号は、「他者に知られたくないことを、安全に伝えるための方法」として作られました。そして残念なことですが、その性質上、戦争の中でその暗号の水準(レベル)が上がってきたことは事実です。
・ 暗号で使われる用語
暗号の分野では、次の用語が使われます。
「暗号鍵」:暗号を作るための手順
「平文」 :暗号鍵を使って暗号化する前の文
「暗文」 :暗号鍵を使って暗号化された文
「復号鍵」:暗文を平文に戻すための手順
「復号化」:暗文を平文に戻すこと
3 古典暗号「シーザー式暗号」の紹介
では、シーザー式暗号を紹介します。この暗号は、次の手順で行われます。
2人で暗号鍵(復号鍵)を共有する。
1人が暗号鍵を使って、平文を暗号化する。
もう一人が暗文を受け取る。
復号鍵を使って、暗文を復号化する。
では、次にこの方式の暗号鍵(暗号の作り方)です。それは、「打ち合わせした数だけ、アルファベットをずらす」ことです!!
具体的には、このようになります。
例 暗号鍵がアルファベットを右に1文字ずらす場合
平文が「apple」であれば、下の表を使って、暗文は「bqqmf」になります。この暗文は、また下の表を使って「平文」に戻せます。このように同じ1つの表(共通の表)を使えば平文にも暗文にもできるので、このような方式を「共通鍵方式」ともいいます。

もちろん鍵は色々作れます。アルファベットは26文字あるので、26種類の暗号鍵が作れます。ただ、逆を言うと、26種類しかないのでコンピュータが発達した現代では、この暗号は簡単に突破されてしまいます。なぜなら、次のようにシーザー式暗号はプログラムできてしまうからです。
<平文⇒暗文にするPythonのプログラム>
def caesar_cipher(plain_text, shift):
encrypted_text = ""
for char in plain_text:
if char.isalpha():
if char.isupper():
encrypted_text += chr((ord(char) - ord('A') + shift) % 26 + ord('A'))
else:
encrypted_text += chr((ord(char) - ord('a') + shift) % 26 + ord('a'))
else:
encrypted_text += char
return encrypted_text
plain_text = "Hello, World!" #平文
shift = 7 #右に何文字ずらすか
encrypted_text = caesar_cipher(plain_text, shift)
print("Encrypted Text:", encrypted_text)
<暗文⇒平文にするPythonのプログラム>
def caesar_decipher(encrypted_text, shift):
decrypted_text = ""
for char in encrypted_text:
if char.isalpha():
if char.isupper():
decrypted_text += chr((ord(char) - ord('A') - shift) % 26 + ord('A'))
else:
decrypted_text += chr((ord(char) - ord('a') - shift) % 26 + ord('a'))
else:
decrypted_text += char
return decrypted_text
encrypted_text = "Olssv, Dvysk!" #暗文
shift = 7 #右に何文字ずらしていたか
decrypted_text = caesar_decipher(encrypted_text, shift)
print("Decrypted Text:", decrypted_text)
もしPythonを動かせる環境があれば、試してみてください!友だちと暗号で会話もできます。
なぜこのようなことができるかというと、アルファベットを1度数字に変換(Aなら0、Bなら1、Cなら・・・)して、それに1を足して、またアルファベットに戻すという数学的な操作ができるからです。実はここに数学があるのです!!
4 数学で守る秘密の鍵:公開鍵暗号
上述したように、シーザー式暗号は現代のコンピュータにかかると突破されてしまいます。そこで考案されたのが、公開鍵暗号方式(RSA暗号)です。この説明の前にちょっと数学の話をさせてください。まだ逃げないで(笑)
自然数1、2、3、・・・の中には「素数」という数があります。「素数」とは、その数が1とその数自身でしか割り切れない数です。たとえば、2や3、5、7、11、13、17、19、・・・などが素数です。この素数は無限に存在することが2000年以上前に証明されています。
では、問題です。素数17と19の積は何でしょうか?答えは323です。電卓を使えば1秒もかからない計算です。
では、1333はある2つの素数の積です。その2つの素数を答えてください。
中々答えが出ないですよね。答えは「31」と「43」です。
今体験して分かったように、2つの素数をかける計算はすぐできるのですが、かけられた2つの素数を探すことは簡単ではないのです。なぜかというと、素数には規則性がないからなんです。

この「素数の不規則性」を利用しているのが、RSA暗号です。素数はアルファベットのように26種類しかないわけではなく、無数にあるためコンピュータでも膨大な時間がかかるような素数を選ぶことができるため、突破されない暗号になっています。
また、公開鍵というのは、上の例でいうと「1333」という数字が公開されていて誰でも暗文が作れるようになっているからです。しかし復号鍵(「31」と「43」)は特定の人しか知らないため、復号化できないため安全と言われています。キャッシュレス決済にも使われています。

5 結論:数学の力で暗号を楽しもう!!
英語や日本語など、言語は必ず数字に置き換えられます。それに数学的アプローチをすると、暗号ができます。先人たちは、これまで様々な数学的アプローチを考えてきました。そしてこれからもいろんな人たちが考えていくでしょう。
もっと知りたいという方には、以下の書籍がおすすめです。
・中学数学からはじめる暗号入門
数学が苦手な方でも、暗号の歴史からゆっくり解説してくれます。
・工科系のための初等整数論入門 公開鍵暗号を目指して
結構数学の知識が必要です。分からないところは他の本も参考にしながら、ゆっくり読み進めていきましょう。
では、みなさん、Lezi e rmig hic!!
※シーザー式暗号です。
