TechCraft – エンジニアのためのスキルアップメモ

エンジニアのスキルアップを少しでも加速する技術ブログ

pythonで学ぶシーザー暗号 原始的な暗号入門!

Pythonで実践!シーザー暗号と総当たり解析まで学ぶ原始的暗号入門

1. はじめに

暗号技術と聞くと、AESやRSAのような高度で複雑なアルゴリズムを思い浮かべるかもしれません。
しかし、すべての始まりはもっとシンプルでした。今回紹介する「シーザー暗号(Caesar Cipher)」は、その最も原始的で、なおかつ教育的価値の高い暗号方式です。

この暗号方式は古代ローマ時代、ユリウス・シーザーが実際に軍事通信で使用していたとされており、
文字を一定数ずらすだけという非常に直感的な仕組みを持っています。

この記事では、Pythonで実装・実行しながら、暗号化→復号→総当たり解析までの一連の流れを体験していきます。


2. シーザー暗号とは?

2.1 基本原理

シーザー暗号は、アルファベットの文字を「一定のシフト数」でずらして変換する方式です。
たとえば、3文字シフトさせる場合:

A → D  
B → E  
C → F  
...  
X → A  
Y → B  
Z → C

2.2 実例

元の文:HELLO
シフト:3
暗号文:KHOOR


3. Pythonでのシーザー暗号実装

この章では、実際に動作するPythonコードを作成・実行して、暗号化、復号、総当たり解析を行っていきます。


4. ファイル作成とコード(caesar.py)

以下のコードを caesar.py という名前で保存してください:

# caesar.py

def caesar_encrypt(text: str, shift: int) -> str:
    result = ''
    for char in text:
        if char.isalpha():
            base = ord('A') if char.isupper() else ord('a')
            shifted = (ord(char) - base + shift) % 26 + base
            result += chr(shifted)
        else:
            result += char
    return result

def caesar_decrypt(cipher: str, shift: int) -> str:
    return caesar_encrypt(cipher, -shift)

def brute_force_caesar(cipher: str):
    print("=== 総当たり ===")
    for s in range(1, 26):
        guess = caesar_decrypt(cipher, s)
        print(f"{s:2}: {guess}")

if __name__ == '__main__':
    message = "Hello, World!"
    shift = 3

    encrypted = caesar_encrypt(message, shift)
    decrypted = caesar_decrypt(encrypted, shift)

    print("[暗号化]")
    print(f"入力: {message}")
    print(f"シフト: {shift}")
    print(f"出力: {encrypted}")

    print("\n[復号化]")
    print(f"復号: {decrypted}")

    print("\n[総当たり復号]")
    brute_force_caesar(encrypted)

5. 実行コマンドと出力

実行:

python caesar.py

出力結果:

[暗号化]
入力: Hello, World!
シフト: 3
出力: Khoor, Zruog!

[復号化]
復号: Hello, World!

[総当たり復号]
=== 総当たり ===
 1: Jgnnq, Yqtnf!
 2: Ifmmp, Xpsme!
 3: Hello, World!
 4: Gdkkn, Vnqkc!
 5: Fcjjm, Umpjb!
 6: Ebiil, Tloia!
 7: Dahhk, Sknhz!
 8: Czggj, Rjmgy!
 9: Byffi, Qilex!
10: Axeeh, Phkdw!
11: Zwddg, Ogjcv!
12: Yvccf, Nfibu!
13: Xubbe, Mehbt!
14: Wtaad, Ldgas!
15: Vszzc, Kcfzr!
16: Uryyb, Jbeyq!
17: Tqxxa, Iadxp!
18: Spwwz, Hzcwo!
19: Rovvy, Gybvn!
20: Qnuux, Fxaum!
21: Pmttw, Ewztl!
22: Olssv, Dvysk!
23: Nkrru, Cuxrj!
24: Mjqqt, Btwqi!
25: Lipps, Asvph!

6. 各関数の解説

6.1 caesar_encrypt(text, shift)

  • 各文字を shift 分だけ右にずらす
  • アルファベットのみ対象(大文字・小文字に対応)
  • ord() / chr()文字コード変換

6.2 caesar_decrypt(cipher, shift)

  • 単に shift を逆転して caesar_encrypt に渡すだけ

6.3 brute_force_caesar(cipher)

  • シフト値を1~25まで全て試して復号結果を出力
  • 実際に手作業での解読を模倣した処理

7. 限界と応用

限界

  • たった26通りしかないため、総当たりですぐ解けてしまう
  • 現代の暗号技術にはまったく通用しない
  • 頻度分析や機械学習で簡単に解読される

応用のヒント

  • ROT13:13文字固定シフトのバリエーション(再度かけると元に戻る)
  • Vigenère暗号:シーザー暗号を文字列キーで拡張した多重シフト方式
  • 単語ごとのランダムシフトや、文脈に基づく動的シフトもあり

8. まとめ

機能 内容
暗号化 caesar_encrypt(文字列, シフト値)
復号化 caesar_decrypt(暗号文, シフト値)
総当たり brute_force_caesar(暗号文)

シーザー暗号は、暗号の基本原理とその脆弱性を実感できる格好の素材です。
Pythonを使えば、手軽にその仕組みを体験できます。
初心者向けの教材や、アルゴリズム理解のための一歩として、ぜひ使い倒してみてください!


参考リンク

参考書籍