今回はシーザー暗号を作成・解読するツールを
functionをより深く学んで作る。
シーザー暗号とは?
例えば、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点を修正してまとめてみると。。。