シーザー暗号の実装(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()