Published Date : 2021年1月1日10:00

Pythonでシーザー暗号 Part 1
Try the Caesar cipher in Python Part 1


This blog has an English translation


ニコニコ動画にアップした動画のまとめ記事です。

This is a summary blog post about a video I uploaded to NicoNico.

細かい部分は動画を参考にしてください。

Please refer to the video for details.


目次

Table of Contents




① 動画の説明
① Video Description



シーザー暗号は単純な仕組みです。

The Caesar cipher is simple.

例えば、アルファベット26文字があるとします。

For example, suppose you have 26 alphabetic characters.

Aの文字から右の二つ目はCになります。

The second letter to the right of the letter A is C.

Zの右隣はAだとすると、Bになり、全ての文字に対応する文字が決まります。

If the next character to the right of Z is A, it becomes B to determine the character corresponding to all characters.

平文を暗号化する時は文字を右に2つにスライドして、対応する文字に変換します。

To encrypt the plaintext, slide text in two to the right and convert it to the corresponding character.

そして、復号化する時は暗号文の文字を左に2つスライドすれば元の平文に戻る仕組みです。

When decrypting, you slide the ciphertext in two to the left to return to the plaintext.

この時、左右にどれだけスライドするかの数字が暗号を解読する秘密鍵となります。

In this case, the number of slides left and right becomes the secret key to decrypt the cipher.

この秘密鍵をお互いが共有することによって暗号文でのやり取りが可能になります。

By sharing this secret key with each other, it is possible to communicate in encrypted text.

ではPythonを使ってシーザー暗号を用いた暗号文と復号文の作成を行ってみましょう。

Let's use Python to create ciphertext and decryption text using the Caesar cipher.

このordメソッドに文字を渡してやると、asciiコードが得られます。

If you pass a character to the ord method, you get the ascii code.

>>> ord('a')
97

例えばアルファベットの小文字aならば、対応する文字コードは97です。

For example, for the lowercase letter a, the corresponding character code is 97.

>>> ord('a')
97

小文字zの文字コードはaを抜かした残りのアルファベットの文字数の25を足して122となります。

The lowercase z character code is 122. This can be found by adding 25 of the total number of characters of the rest of the alphabet except for the lowercase letter a.

>>> ord('z')
122
>>> ord('a')+25
122

この起点となる97をオフセットととして使用すれば、剰余演算を用いて26文字の範囲内で文字をスライドさせることができます。

Using this starting number of 97 as the offset, the remainder operation can be used to slide characters within 26 characters.

>>> (ord('a') - 97) % 26
0
>>> (ord('z') - 97) % 26
25

            

ではアルファベットの文字のリストを作成してみましょう。

Let's create a list of alphabetic characters.

>>> english_alphabet = [chr(a) for a in range(97, 123)]
>>> english_alphabet
['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z']

文字コードの数字を文字に変換させるにはchrメソッドを使用します。

Use the chr method to convert a number from a character code to a character.

>>> chr(97)
'a'

秘密鍵を3に設定して、計算方法が正しいかどうか確かめてみましょう。

Let's set the private key to 3 and see if the calculation is correct.

全てのセルを消して、シーザー暗号を生成するスクリプトを作成してみましょう。

Let's write a script that erases all cells and generates the Caesar cipher.

平文をユーザーに入力させます。

Asks the user to enter plaintext.

アルファベットの大文字と小文字は文字コードが異なるので、それぞれのオフセット値を用意します。

Because uppercase and lowercase letters of the alphabet have different character codes, you must provide offset values for each.

>>> ord('A')
65
>>> ord('Z')
90

平文を一文字ずつ取り出し、アルファベット以外の記号か大文字か小文字かを判定して、シーザー暗号を使って暗号文を作成していきます。

It takes the plaintext one character at a time, determines whether it is a non-alphabetic symbol, upper or lower case, and creates the ciphertext using the Caesar cipher.

では一旦このスクリプトを試してみましょう。

Let's try this script for now.

暗号文の生成過程をアニメーションで確認してみましょう。

Let's see the process of generating ciphertext in an animation.

上手くいったら、次は復号化するスクリプトを書いていきましょう。

Once you have confirmed that it works, let's write a decryption script.

暗号化する時は平文の文字を左に3つずらしたので、逆に復号化する時は、暗号化された文の文字を右に3つずらせば平文が判明します。

When encrypting, the plaintext characters are shifted three times to the left, so when decrypting, the plaintext will be revealed if the encrypted text characters are shifted three times to the right.

お次はこのスクリプトを汎用的に使えるように、クラスファイルにまとめてみましょう。

Now let's put this script together in a class file for general use.



以上です。お疲れ様です。

That's all. Thank you for your hard work.