シーザー暗号の作成と解読
暗号の概念は紀元前からあり、簡単なものとしては、ユリウス・カエサル(ジュリアス・シーザー)が普及させたシーザー暗号が挙げられる。
シーザー暗号は元の文(平文)、例えば「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……学問に王道なし!」
愛華は流暢な発音で正しい平文を読み上げた。ユークリッドが残したとされる名言だ。
新規登録で充実の読書を
- マイページ
- 読書の状況から作品を自動で分類して簡単に管理できる
- 小説の未読話数がひと目でわかり前回の続きから読める
- フォローしたユーザーの活動を追える
- 通知
- 小説の更新や作者の新作の情報を受け取れる
- 閲覧履歴
- 以前読んだ小説が一覧で見つけやすい
アカウントをお持ちの方はログイン
ビューワー設定
文字サイズ
背景色
フォント
組み方向
機能をオンにすると、画面の下部をタップする度に自動的にスクロールして読み進められます。
応援すると応援コメントも書けます