シーザー暗号の作成と解読

 暗号の概念は紀元前からあり、簡単なものとしては、ユリウス・カエサル(ジュリアス・シーザー)が普及させたシーザー暗号が挙げられる。

 シーザー暗号は元の文(平文)、例えば「Et tu, Brute?(ブルータス、お前もか)」の各文字「E」を「H」。「R」を「W」のように3文字後ろにずらすと暗号文ができあがる。


 平文 ET TU BRUTE

 暗号文 HW WX EUXWH


 13文字ずらした暗号はROT13、一般にn文字(nは自然数)ずらして生成された暗号はシフト暗号と呼ばれる。


「文字がない場合はどうするの? シーザー暗号だとx、y、zに3つ後ろはないよね」

「そのときは先頭に戻って、それぞれa、b、cに置き換える」

「時間と一緒だね」と成宮。


 例えば、午前11時の3時間後は午後2時。数学的に表現すると法を12として、


 11+3≡2(mod 12)


「アルファベットなら法は26になるな」


 Tなら先頭から数えて20番目、暗号のシフト(ずらす)数を10とすると、


 20+10≡4(mod 26)


 よって、「T」は「D」に置き換えられる。


「だから、シフト数10でさっきの平文を暗号化すると、暗号文は『OD DE LBEDO』になる」

「変換するの早っ」

「Pythonでやったからな」

「パイソン? 何それ」

「プログラミング言語のひとつだよ。というか、安藤プログラミングできるんだ」

「いいや? 俺はプログラミングの知識なんてほとんどない。コードはAIに作ってもらった。見てみるか?」


 俺はそう言ってパソコンの画面を愛華と成宮に見せた。


def caesar_cipher(text, shift):

result = ""

for char in text:

# 大文字の場合

if char.isupper():

result += chr((ord(char) + shift - 65) % 26 + 65)

# 小文字の場合

elif char.islower():

result += chr((ord(char) + shift - 97) % 26 + 97)

# 文字以外の場合はそのまま追加

else:

result += char

return result


# テキストとシフト数を指定

text = "Hello, World!"

shift = 3


# テキストを暗号化

encrypted_text = caesar_cipher(text, shift)

print("暗号化されたテキスト:", encrypted_text)


# 暗号化されたテキストを復号化

decrypted_text = caesar_cipher(encrypted_text, -shift)

print("復号化されたテキスト:", decrypted_text)


「……全然わかんない」と愛華。

「俺はChatGPTのプロンプトに『Pythonでシーザー暗号を実行したい』と打ち込んだだけだ。そうしたら10秒も経たないうちにこのコードが表示された」


 そして実行結果は以下の通り。


 暗号化されたテキスト: OD DE LBEDO

 復号化されたテキスト: ET TU BRUTE


「なるほど。textの『Hello, World!』を『ET TU BRUTE』にして、shiftを3から10に変更したわけか」

「そういうこと」

「AIってこんなこともできるんだ」


 むしろ、プログラミングはAIの得意分野だろう。環境さえ整えばシーザー暗号のようなシンプルな操作なら、プロンプトを入力するだけで充分対応してくれる。


「話を戻すと、シフト暗号のような単純な暗号は、シフト数がわからなくても総当たりで容易に解読できてしまう」


 アルファベットの場合はずらさない、つまりシフト数が0のときも含めると26通り。根気さえあれば手作業でも解読できる。


「でもさ、解読する側が英語できなかったら意味ないよね」

「あはは! 確かにそうだね。いっそのことギリシャ文字でもいいんじゃないか?」


 成宮が愉快そうに笑って言う。翻訳サイトを使えばどうにかなるだろうが面倒だな。いや、AIに翻訳してもらうのもありか。


「だったら実際にやってみるか? ギリシャ文字じゃなくて英語だけど」


 暗号文 AOLYLPZUVYVFHSYVHKAVSLHYUPUN


「長っ、これ何文字あるの?」

「28文字。平文はある偉人の言葉だ」

「そんなこと言われてもねぇ……。安藤、シフト数は教えてくれないのかい?」

「悪いが今回はノーヒントだ。なんならAIを使ってもいい」


 俺の言葉に成宮は苦笑を浮かべる。愛華はさっそくスマホを取り出した。ChatGPTを使うつもりか。

 愛華は熟考してプロンプトに文字を入力していく。


 暗号文「AOLYLPZUVYVFHSYVHKAVSLHYUPUN」はシフト暗号です。平文の候補をすべて挙げてください。


 具体的でシンプルなプロンプトだったが、ChatGPTが候補としてあげた25個(シフト数0は除く)の候補はなんとすべて誤っていた。過信するのは良くないな。ほかのAIでも試してみたが、暗号文が長いせいか候補に誤りが出た。

 結局、愛華は成宮と協力して手作業で候補を書いていく。解読する場合は各文字をすべて前にずらす必要がある。


 Shift 1: ZNKXKOYTUXUEGRXUGJZURKGXTOTM

 Shift 2: YMJWJNXSTWTDFQWTFIYTQJFWSNSL

 Shift 3: XLIVIMWRSVSCEPVSEHXSPIEVRMRK

 Shift 4: WKHUHLVQRURBDOURDGWROHDUQLQJ

 Shift 5: VJGTGKUPQTQACNTQCFVQNGCTPKPI

 Shift 6: UIFSFJTOPSPZBMSPBEUPMFBSOJOH

 Shift 7: THEREISNOROYALROADTOLEARNING

 Shift 8: SGDQDHRMNQNXZKQNZCSNKDZQMHMF

 Shift 9: RFCPCGQLMPMWYJPMYBRMJCYPLGLE

 Shift 10: QEBOBFPKLOLVXIOLXAQLIBXOKFKD

 Shift 11: PDANAEOJKNKUWHNKWZPKHAWNJEJC

 Shift 12: OCZMZDNIJMJTVGMJVYOJGZVMIDIB

 Shift 13: NBYLYCMHILISUFLIUXNIFYULHCHA

 Shift 14: MAXKXBLGHKHRTEKHTWMHEXTKGBGZ

 Shift 15: LZWJWAKFGJGQSDJGSVLGDWSJFAFY

 Shift 16: KYVIVZJEFIFPRCIFRUKFCVRIEZEX

 Shift 17: JXUHUYIDEHEOQBHEQTJEBUQHDYDW

 Shift 18: IWTGTXHCDGDNPAGDPSIDATPGCXCV

 Shift 19: HVSFSWGBCFCMOZFCORHCZSOFBWBU

 Shift 20: GURERVFABEBLNYEBNQGBYRNEAVAT

 Shift 21: FTQDQUEZADAKMXDAMPFAXQMDZUZS

 Shift 22: ESPCPTDYZCZJLWCZLOEZWPLCYTYR

 Shift 23: DROBOSCXYBYIKVBYKNDYVOKBXSXQ

 Shift 24: CQNANRBWXAXHJUAXJMCXUNJAWRWP

 Shift 25: BPMZMQAVWZWGITZWILBWTMIZVQVO


「シフト数は7で間違いないね。区切りは『THERE』と『IS』……」

「THERE IS NO ROYAL ROAD TO LEARNING……学問に王道なし!」

 

 愛華は流暢な発音で正しい平文を読み上げた。ユークリッドが残したとされる名言だ。

  • Xで共有
  • Facebookで共有
  • はてなブックマークでブックマーク

作者を応援しよう!

ハートをクリックで、簡単に応援の気持ちを伝えられます。(ログインが必要です)

応援したユーザー

応援すると応援コメントも書けます

新規登録で充実の読書を

マイページ
読書の状況から作品を自動で分類して簡単に管理できる
小説の未読話数がひと目でわかり前回の続きから読める
フォローしたユーザーの活動を追える
通知
小説の更新や作者の新作の情報を受け取れる
閲覧履歴
以前読んだ小説が一覧で見つけやすい
新規ユーザー登録無料

アカウントをお持ちの方はログイン

カクヨムで可能な読書体験をくわしく知る