シーザー暗号の実装(2)
昨日の続き。メインの処理は書いたので、次にGUI部分を作成した。
- アプリケーションの説明
- 平文を入力し暗号化キーを指定すると、シーザー暗号化された暗号文を出力する。
- 使い方(暗号化)
- ソースファイルCaesar.pyをダブルクリックしてGUIを起動(起動画面を図1に示す)。
- 平文をアルファベット小文字で入力(図2は入力例)。
- アルファベットと空白以外の記号は認識しないので注意。
- 暗号化のキー(どれだけずらすかを表す数字)を指定する(図2では5とした)。
- 「暗号化する」ボタンを押すと、暗号文が出力される(図3参照)。
- 使い方(平文化)
- 平文入力欄に暗号文を小文字で入力してキーを-5とすると、「暗号化する」キーを
押したとき元の文字列が再生されている(図4参照)。
図1:アプリケーション起動画面
図2:平文を小文字で入力して暗号キーを指定する
図3:暗号化する
図4:暗号文を平文に戻せる
ソースコードCaesar.py
# coding: utf-8 # ------------------------------------------------------------ import wx Before = "abcdefghijklmnopqrstuvwxyz" After = "ABCDEFGHIJKLMNOPQRSTUVWXYZ" class MainFrame(wx.Frame): def __init__(self, id, title): width, height = 200, 100 wx.Frame.__init__(self, id, title="Caesar Cipher", size=wx.Size(width, height)) Pan = wx.Panel(self, -1) Hsizer1 = wx.BoxSizer(wx.HORIZONTAL) Hsizer2 = wx.BoxSizer(wx.HORIZONTAL) Vsizer1 = wx.BoxSizer(wx.VERTICAL) StTxt1 = wx.StaticText(Pan, -1, u"元の文:") StTxt2 = wx.StaticText(Pan, -1, u"暗号文:") self.TxtCtl1 = wx.TextCtrl(Pan, -1, "", size=(300,-1)) self.TxtCtl2 = wx.TextCtrl(Pan, -1, "", size=(300,-1)) self.RBtn = wx.Button(Pan, -1, u"暗号化する") self.RBtn.Bind(wx.EVT_BUTTON, self.Cipher) self.SpnCtr = wx.SpinCtrl(Pan, -1, "0", min=-25, max=25,size=(80,-1)) Hsizer1.Add(StTxt1, 0, wx.ALL, 2) Hsizer1.Add(self.TxtCtl1, 0, wx.ALL, 2) Hsizer1.Add(self.SpnCtr, 0, wx.ALL, 2) Hsizer1.Add(self.RBtn, 0, wx.ALL, 2) Hsizer2.Add(StTxt2, 0, wx.ALL, 2) Hsizer2.Add(self.TxtCtl2, 0, wx.ALL, 2) Vsizer1.Add(Hsizer1, 0, wx.ALL, 2) Vsizer1.Add(Hsizer2, 0, wx.ALL, 2) Pan.SetSizer(Vsizer1) Vsizer1.Fit(self) def Cipher(self, event): ckey = self.SpnCtr.GetValue() sentence = self.TxtCtl1.GetValue() encode_sentence = "" for i in xrange(len(sentence)): a = Before.find(sentence[i]) if (a == -1): encode_sentence += ' ' else: num = (a+ckey) % 26 encode_sentence += After[num] self.TxtCtl2.SetValue(encode_sentence) class Application(wx.App): def OnInit(self): frame = MainFrame(None, -1) frame.Show(True) self.SetTopWindow(frame) return True def main(): import time app = Application(0) app.MainLoop() if __name__ == '__main__': main()