UdemyでPythonを勉強した結果を残すブログ。

40歳でプログラミング始めて転職までいけるのかを実録してみます。

DAY 8: シーザー暗号を作成・解読するツールをつくる!

今回はシーザー暗号を作成・解読するツールを

functionをより深く学んで作る。

 

シーザー暗号とは?

 

ja.wikipedia.org

 

例えば、hello という文字をシーザー暗号で4つシフトして暗号化すると、

lippsとなる。 hを4つずらすとlになるから。 0→h  1→i 2→j 3→k 4→l

 

わかったところで、シーザー暗号ツールを作成してみよう。

 

どんな流れになるか。

 

1・暗号を作るか、解読するかどちらの機能を使うかを選ぶ。

2・暗号を作る場合

 2-1・どんなメッセージを入れるか(アルファベットのみ)

 2-3・そのメッセージをいくつずらすかを聞く

 2-3・メッセージを希望分だけずらしたメッセージを作成し、反映する。

3・暗号を解読する場合

 3-1・どんなメッセージか

    3-2・どれだけずらすかを聞く

 3-3・メッセージを希望分だけずらしたメッセージを作成し、反映する。

 

 

こんな感じだと思う。

 

まずは素材を用意。

 

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', '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']

全てのアルファベットを2週分いれたリスト。(zを5つシフトした時に2周目を使うから)

cipher_func = input("encode? decode?") 暗号作成か解読かを選ぶ

message = input("アルファベットで暗号化したい文字を入力 : ").lower()

shift = int(input("いくつ文字をずらしたいかを数字で入力 : "))

数字なのでint()で囲うのを忘れずに。

 

 

ここからfunctionを使う。

 

今までなら、

def go3step():

   go()

   go()

   go()

 

という感じで複数やることを中にいれて1つの機能として扱う感じだったけど、

今回は

def gosteps(number):

   for i in range(0, number):

        go()

という感じで()の中に入れたいデータを入れることによって動く機能を使う。

 

これが難しかった。。。

 

 

まず暗号作成の機能を作る。

 

ーー

2・暗号を作る場合

 2-1・どんなメッセージを入れるか(アルファベットのみ)

 2-3・そのメッセージをいくつずらすかを聞く

 2-3・メッセージを希望分だけずらしたメッセージを作成し、反映する。

ーー

 

def encode(angou_mae,shift_num):

この機能用にangou_maeとshift_numという入力する箱を用意する。

    cipher = ""

暗号化したデータを出力する箱をcipherとして用意する。

    for letter in angou_mae:

angou_maeに入力された文字を1文字ずつ分けて作業する。

        position = alphabet.index(letter)

angou_maeの文字は素材のalphabetの順序なら何番目かを抽出する。

        new_position = position + shift_num

今のアルファベットのある位置から、入力したシフト数をたす。

  new_letter = alphabet[new_position]

暗号化された文字が1文字完成!

        cipher += new_letter

暗号化した文字を1文字ずつ繋げていく

    print(cipher)

 

これで暗号作成機能はできあがり。

次は暗号解読機能。

これは作成機能を逆にすればいいので簡単にできる。

angou_maeをcipherに、cipherをangou_maeに。
+ shift_numを - shift_num に。

 

 

def decode(cipher,shift_num):

    angou_mae = ""

    for letter in cipher:

       position = alphabet.index(letter)

       new_position = position - shift_num

       new_letter = alphabet[new_position]

       angou_mae += new_letter

   print(angou_mae)

 

 

これで2つの機能が完成。

 

これを1つのツールとして機能するための条件

1・暗号を作るか、解読するかどちらの機能を使うかを選ぶ。

 

を作成する。

 

 

if cipher_func == "encode":

    encode(message,shift)

else:

    decode(message,shift)

 

で一旦は機能を網羅したプログラムができたんだけど、
encodeもdecodeも入力も同じで+か-の違いだけでほぼ同じコード。

 

これはまとめることができるのではないか。

 

 

となると、

作成か解読かの答えもファンクションの入力する部分に追加する

decodeの場合はnew_positionを-にすればいい

 

の2点を修正してまとめてみると。。。

 

 
direction = input("Type 'encode' to encrypt, type 'decode' to decrypt:\n")
message = input("アルファベットで暗号化したい文字を入力 : ").lower()
shift = int(input("いくつ文字をずらしたいかを数字で入力 : "))

def crypt_tool(crypt_select,origin_text,shift_num):
after_text = ""
if crypt_select == "decode":
shift_num = shift_num * -1
for letter in origin_text:
position = alphabet.index(letter)
new_position = position + shift_num
new_letter = alphabet[new_position]
after_text += new_letter
print(f"The text is {after_text}.")
 

is_finished = False

def crypt_tool(crypt_select,origin_text,shift_num):
after_text = ""
if crypt_select == "decode":
shift_num *= -1
for letter in origin_text:
position = alphabet.index(letter)
new_position = position + shift_num
new_letter = alphabet[new_position]
after_text += new_letter
print(f"テキストは {after_text} です。")

is_finished = False

while not is_finished:
direction = input("作成ならencode 解読ならdecodeを入力 : \n")
message = input("アルファベットで暗号化したい文字を入力 : \n").lower()
shift = int(input("いくつ文字をずらしたいかを数字で入力 : \n"))
crypt_tool(direction,message,shift)
repeat_tool = input("もう一回しますか? Y/N").lower()
if repeat_tool == "n":
is_finished = True
 
 
ブログで復習・アウトプットするとより身に付く感じがする。