在学习过程中我们不时会看到有一些题目,明明自己的思路正确,却算不出结果,或者有的时候选择硬磕,得到一个奇形怪状的答案。这是一个比较有意思的事情,明明思路清晰却总是抓不到问题的解法,也许我们可以尝试从问题本身出发,找找问题的漏洞。
接下来便是我和我的python作业之间的故事了。
最近在求解一份python作业的主要问题时困惑了很久,题目要求设计一个窗口,利用升级的凯撒密码去解密一段密文,并得出密钥。这里要解释的地方有两个,其一是“升级的凯撒密码”,首先需要理解凯撒密码是什么,这里引用百度百科的解释:
“恺撒密码(英语:Caesar cipher),或称恺撒加密、恺撒变换、变换加密,是一种最简单且最广为人知的加密技术。它是一种替换加密的技术,明文中的所有字母都在字母表上向后(或向前)按照一个固定数目进行偏移后被替换成密文。例如,当偏移量是3的时候,所有的字母A将被替换成D,B变成E,以此类推。
可以看到,凯撒密码通过特定的偏移量将字符依次改变,由于每个字符都是偏移相同的量(A->D, B->E),在加密方式上略显简单,而“升级的凯撒密码”升级的地方便在此,它没有一个固定的偏移量,而是先将明码中某几个字符加密,然后去除掉这几个使用过的字符,将剩余的字符依次对应,至此就得到一个凯撒密码的字符引射表,比如说明码是ABCDEF,密码是dabcef,它就是将先将A->d,接着把abcdef这一串字符去除掉d,然后依次对应到BCDEF中去。
第二个需要解释的就是“密钥”,密钥是指字母映射表中对应字符不连续的一段字符串,这里划重点,它是找出题目漏洞的起始点。
通过作业中题目的示例,可以更好地理解上文说的概念:
假设已知密文和密钥,
ciphertext(密文): d ZJ DK NZKBGP!
The key sentence(密钥句子): zhangs
通过凯撒解密推出明文的原理如下:
先构造映射表,大小写分别对应,应该有两个表,但是两个表之间存在可以转化方法,使用只需要推出一个表就能够得到另一个表,而构造表的方法为
在第一行明码字母中按顺序书写26个字母
在第二行密码字母顺序构建规则:先将密钥(zhangs)中的字母写入映射表的第二行,然后在26个字母中除掉密钥的字母,将剩余字母按顺序写入表中
按以上步骤就可以构建出其中一个表,将这个表的明码字母从小写转化为大写,密码字母从大写转化为小写,就可以得到另一个表,即如果a对应Z,则A对应z

再根据以上表格,得出密文 d ZJ DK NZKBGP的明文就是 i am in danger
来到设计环节,首先用wxpython设计出如下的窗口,

顶部放置两行文本框,用来表示符号映射表(软件界面上只需要写第一个映射表,但是编程时候要2个映射表都要同时用到才能解密),下面放置的是明文文本框和密文文本框,在窗口底部是功能按钮(解密,清除密文,加载密文文档),这里可以对设计进行一点点补充,如下(代码已分享在文档的最后)
作业的文档里提供给了一篇密文,要求根据这篇密文解题,内容如下
eKUB
tGB 1ST ARY
uSHMF GBQ EKRMJBT RMA DNVBQHMF GBQSBKC THFGTKY ,SGB AHAM’T FBT UO .iBQ ANQL LRTBS WBQB RCQRHA TN FN HM RMA DNLCNQT GBQ .sGB AHAM’T BRT RMYTGHMF TGB WGNKB ARY ,AHAM’T WRSG GBQ CRDB NQ EQUSG GBQ TBBTG .dT MHFGT ,j DNUKA GBRQ GBQ DQYHMF EBMBRTG TGB EKRMJBQ.
tGB 2MA ARY
sGB RTB TNARY, CNQDBA ANWM EY GBQ QNNLLRTBS .iBQ BYBS WBQB QBA j RKWRYS DRKKBA GBQ “fQY EREY” .sGB RKWRYS SPUHQLBA GBQ LNUTG RMA QBTNQTBA :“oN ,j’L MNT.”
tGB 3QA ARY
tNARY, SGB AQBSSBA VBQY SBXY ,WRKJBA HMTN R ERQ RMA AQRMJ R KNT NC RKDNGNK .uSHMF TBLOTHMF LNVBS, SGB SUQVBYBA TGB QNNL .nRMY LBM DRLB UO TN GBQ RMA CKHQTBA WHTG GBQ TBKKHMF GNW EBRUTHCUK SGB WRS .sGB AQRMJ R KNT LNQB .wGBM R LUDG NKABQ LRM .NKA BMNUFG TN GBQ CRTGBQ ,WRKJBA UO RMA SRHA :"nHSS ,KBT LB TRJB YNU GNLB ,"SGB SOKRSGBA GBQ AQHMJ NMTN GHS CRDB .dS TGB NKABQ LRM FNT QBRAY TN SKRO GBQ .nU SGNWBA UO RMA SRVBA eKUB .j JMNW RKK TGHS EBDRUSB j WRS WRTDGHMF CQNL R DNQMBQ HM TGB ERQ.
tGB 4TG ARY
tNARY, SGB FNT UO QBRKKY BRQKY .dCTBQ EUSYHMF RQNUMA RKK LNQMHMF ,SGB KNDJBA GBQSBKC HMSHAB TGB ERTGQNNL .wGBM GBQ QNNLLRTBS NOBMBA TGB ANNQ ,TGBY WBQB RLRZBA :“sN DKBRM.”
tGB 5TG ARY
sGB EBFRM STUAYHMF. sGB GRA ANMB VBQY WBKK HM SDGNNK EBCNQB. iNWBVBQ, WGBM WB FNT TNFBTGBQ, GBQ FQRABS ABTBQHNQRTBA. jT HS FNNA TN CNDUS NM SNLBTGHMF BKSB RS HT WHKK HLOQNVB QBDNVBQY.
tGQBB LNMTGS KRTBQ
sGB EBDRLB OQBSHABMT NC TGB sTUABMT uMHNM. sGB HS EBDNLHMF LNQB RMA LNQB REKB. sGB RKSN EBDNLBS LNQB NOBM. sNNM, SGB WHKK MBBA TN OQBORQB CNQ FQRAURTB SDGNNK.
pMB YBRQ KRTBQ
tGBQB RQB LRMY LBM EBSHAB, LRMY WGN RQB EBTTBQ TGRM LB. sGB MBVBQ TRJBS MNTHDB NC TGBL, EUT SGB FBTS RKNMF WHTG mHMF VBQY WBKK. tGBQB RQB QULNQS RENUT TGBL HM SDGNNK. sGB TQBRTS GHL KHJB RM BKABQ EQNTGBQ, EUT QULNQ DRMMNT EB EKNDJBA.
tGQBB YBRQS KRTBQ
sGB HS FBTTHMF LRQQHBA. tGB FQNNL HS mHMF, SGB HS WQHTHMF WBAAHMF HMVHTRTHNMS. wGHKB SGB HS WQHTHMF, SGB EBMT NVBQ TGB ABSJ RMA TBRQS CBKK ANWM UMDNMTQNKKREKB. j STBOOBA CNQWRQA RMA SRW SGRT NM RKK TGB HMVHTRTHNMS, TGB FQNNL’S MRLB WRS LHMB.
j WRMT TN DQY TNN, EUT FGNST DRMMNT DQY. j AN MNT GRVB RMY TBRQS.
tGQBB YBRQS RFN, WGBM j WRS DRQQYHMF GBQ EHQTGARY DRJB DQNSSHMF R STQBBT, R DRQ DQRSGBA HMTN LB.
通过文章给出的信息半猜半推得到了能够切切实实找到对应关系的字符映射表(第一行是密码,第二行是明码)

翻译效果如下

然后转化为中文,发现是一篇关于人鬼恋的故事——《蓝色生死恋》,故事看完有点瘆人


【前方烧脑提示】翻译完之后本以为作业已经完成了,但其实故事才刚开始。作业要求解密钥,根据前文能提取到的信息是
(1)将已经找出对应关系的字母先写好,再将26个字母中剩下的字母依次填入。这里其实犯了一个错误,就是表格的第一行写的并不是明码,映射表第一行是密码,第二行是明码,和题目的意思正好相反,错误的映射表位置也就造成了后续的错误推理:

根据上面的图片,将第一行的字母排好序,第二行再一一对应,初步推出的两张映射表如下


再根据字母补齐的原则可以得到上面第一张映射表的完整表格

(2)密钥是去除连续字母的字符串
从上面的表中可以看到,第二行的排序是比较混乱的,并没有原题目中那样把密钥句子放在第二行的开头(毕竟明文和密文位置颠倒了),于是用了一个比较奇怪的方法去推测密钥(图片中把密钥称为关键字)

当然,这种做法是错误的,我在翻译密文的时候用了一两个小时,而密钥的推测却花了一个下午,因为出发点就已经错了,导致最后用了一个比较奇怪的方法结束了推理。后来去问了指导老师,她解释密钥一定是在第二行的前几个字符,而且是一个单词,于是第二轮的探索开始了。
还是根据之前给出来的字母对应关系,但是这次将明码放在映射表的上方,密码放在下方,即

由此得到如下的映射表:


将第一个表格补齐可以得到

这个时候仔细观察表格的对应关系,可以看出表格与原题中给出的规律不一致。我们重新回顾一下原题中表格的规律
将一个表的明码字母从小写转化为大写,密码字母从大写转化为小写,就可以得到另一个表,即如果a对应Z,则A对应z

反观已经推出的映射表,a对应的是R,那么A应该对应的是r,可是映射表中A对应的却是d,这违背了题目中给出的推理规律,接着往下看,b对应E,按规律来讲B应该对应e,映射表中B却对应了a,像这样不对称的关系几乎涵盖了整个表,两个表之间字符的关系与题目中给出的规律截然不同,存在着许多的偏差,如果说按照题目给出的规律进行推测,先只看第一个映射表,然后按照第一个表推出第二个映射表如下:

然后再根据第一个表和上面的表去翻译文章,结果如下

可以看到翻译出来的文章出现了问题,如第一段的Jer,第二段的K等等,文章的偏差也就证实了题目给出的规律跟实际上两个映射表对应的关系是相违背的。
当再去观察题目给出的规律,可以注意到题目中明确指出:
在第一行明码字母中按顺序书写26个字母,可是现在已经推出来的两个映射表之间不存在题目中那种互化关系,必须要将包括大小写的54个字母全部书写进去。而可以让这条只输入26个字母的规则成立,它就必须存在着某种规律,让两个映射表之间可以进行互化
那么那种规律究竟为何?答案是——明码对应密码,密码对应明码。这种做法一开始也只是做一个尝试,却意外地得到了正确的结果

这就非常的amazing了,为什么这样一种和题目给出规律不一样的解密方式可以得到正确的明文呢,原因就是密文中的大写字母并没有全部出现,再来观察之前推出的对应关系

所有的小写明码都推测出了密码,但是大写明码推出其密码的却只有ACHIMNOSTUW这11个字母。将“小写密码对应大写密码”作为第一个映射表(表1),再颠倒大小写的位置(即明码对应密码,密码对应明码),得到另一个表(表2)。表1自不用多说,因为已经推出了所有小写字母对应的大写字母,所以表1的对应关系一定是正确的,重点是,明明只推测了11个大写字母对应的密码,但为什么表2(用表1转化出了所有1的大写字母)也正确呢?其实,它对了,但又没完全对。抛开表1和表2,先看11个大写字母对应小写字母的映射表(表3),如下

然后再将其按照明码对应密码,密码对应明码的规律,推出它对应的另一个表,如下

再将这个表和表1进行比较,结果也同样非常的阿妹惊,这个表中所有出现了的字母对应关系和表1一模一样,如下

也就是说,当使用表1去推出表2的时候,表2的部分字母是正确的,而这部分字母,就包括题目中已经推测出的11个字母,那么表1表2一起使用,文中出现的所有字母都能得到正确对应关系,翻译出来的明文自然也就正确了,但如果将表3补齐,然后按照明码对应密码,密码对应明码的规律退出另一个表,将这个表和表1对比,如下

可以发现,两个表中存在不少不一致的地方,而这些不一致的地方,就是在表2中错误的部分。由此可以得出结论,正因为文章中出现的大写字母只有11个,而表2中这11个字母又是正确的,所以当用表1推测出不完全正确的表2的时候,文章可以正确翻译出来。
接下来再回到密钥这条主线
密钥是指字母映射表中对应字符不连续的一段字符串,是只会出现在开头的一个单词,那么用上述错误的规律得到的映射表,能否得到密钥,答案是肯定的,密钥就是RED,至此整道题就解答完毕

综上,当用题目中给出的正确规律去求解时得到的只有错误的翻译和毫无头绪的密钥,而用另一种错误的方式去做题,便能正确翻译文章并得到密钥
而既然已经知道这种错误方式才能解题,那么题目中的规律到底为什么行不通呢?错误的根源到底在哪呢?答案就是作业文档中给出的密文出了问题,应该是老师在加密时不小心输错了密码
用题目给出的规律,对上述翻译出来的明文进行加密,得到的密文应该是
eMUB
tIB 1ST CDY
uSJOH IBA EMDOLBT DOC FPVBAJOH IBASBMG TJHITMY ,SIB CJCO’T HBT UQ .iBA CPAN NDTBS WBAB DGADJC TP HP JO DOC FPNGPAT IBA .sIB CJCO’T BDT DOYTIJOH TIB WIPMB CDY ,CJCO’T WDSI IBA GDFB PA EAUSI IBA TBBTI .dT OJHIT ,j FPUMC IBDA IBA FAYJOH EBOBDTI TIB EMDOLBA.
tIB 2OC CDY
sIB DTB TPCDY, GPAFBC CPWO EY IBA APPNNDTBS .iBA BYBS WBAB ABC j DMWDYS FDMMBC IBA “fAY EDEY” .sIB DMWDYS SRUJANBC IBA NPUTI DOC ABTPATBC :“oP ,j’N OPT.”
tIB 3AC CDY
tPCDY, SIB CABSSBC VBAY SBXY ,WDMLBC JOTP D EDA DOC CADOL D MPT PG DMFPIPM .uSJOH TBNQTJOH NPVBS, SIB SUAVBYBC TIB APPN .nDOY NBO FDNB UQ TP IBA DOC GMJATBC WJTI IBA TBMMJOH IPW EBDUTJGUM SIB WDS .sIB CADOL D MPT NPAB .wIBO D NUFI PMCBA NDO .PMC BOPUHI TP IBA GDTIBA ,WDMLBC UQ DOC SDJC :"nJSS ,MBT NB TDLB YPU IPNB ,"SIB SQMDSIBC IBA CAJOL POTP IJS GDFB .dS TIB PMCBA NDO HPT ABDCY TP SMDQ IBA .nU SIPWBC UQ DOC SDVBC eMUB .j LOPW DMM TIJS EBFDUSB j WDS WDTFIJOH GAPN D FPAOBA JO TIB EDA.
tIB 4TI CDY
tPCDY, SIB HPT UQ ABDMMY BDAMY .dGTBA EUSYJOH DAPUOC DMM NPAOJOH ,SIB MPFLBC IBASBMG JOSJCB TIB EDTIAPPN .wIBO IBA APPNNDTBS PQBOBC TIB CPPA ,TIBY WBAB DNDZBC :“sP FMBDO.”
tIB 5TI CDY
sIB EBHDO STUCYJOH. sIB IDC CPOB VBAY WBMM JO SFIPPM EBGPAB. iPWBVBA, WIBO WB HPT TPHBTIBA, IBA HADCBS CBTBAJPADTBC. jT JS HPPC TP GPFUS PO SPNBTIJOH BMSB DS JT WJMM JNQAPVB ABFPVBAY.
tIABB NPOTIS MDTBA
sIB EBFDNB QABSJCBOT PG TIB sTUCBOT uOJPO. sIB JS EBFPNJOH NPAB DOC NPAB DEMB. sIB DMSP EBFPNBS NPAB PQBO. sPPO, SIB WJMM OBBC TP QABQDAB GPA HADCUDTB SFIPPM.
pOB YBDA MDTBA
tIBAB DAB NDOY NBO EBSJCB, NDOY WIP DAB EBTTBA TIDO NB. sIB OBVBA TDLBS OPTJFB PG TIBN, EUT SIB HBTS DMPOH WJTI mJOH VBAY WBMM. tIBAB DAB AUNPAS DEPUT TIBN JO SFIPPM. sIB TABDTS IJN MJLB DO BMCBA EAPTIBA, EUT AUNPA FDOOPT EB EMPFLBC.
tIABB YBDAS MDTBA
sIB JS HBTTJOH NDAAJBC. tIB HAPPN JS mJOH, SIB JS WAJTJOH WBCCJOH JOVJTDTJPOS. wIJMB SIB JS WAJTJOH, SIB EBOT PVBA TIB CBSL DOC TBDAS GBMM CPWO UOFPOTAPMMDEMB. j STBQQBC GPAWDAC DOC SDW SIDT PO DMM TIB JOVJTDTJPOS, TIB HAPPN’S ODNB WDS NJOB.
j WDOT TP FAY TPP, EUT HIPST FDOOPT FAY. j CP OPT IDVB DOY TBDAS.
tIABB YBDAS DHP, WIBO j WDS FDAAYJOH IBA EJATICDY FDLB FAPSSJOH D STABBT, D FDA FADSIBC JOTP NB.
当我们以一种辩证的眼光,探索的态度去学习内容的时候,也许能发现一些意外的收获,枯燥的学习也能够变得有趣。
非常感谢你愿意耐心看完 ! 我是incredibleimpact,希望我的分享能给你带来一些收获
# Import the required libraries
import wx
import tkinter.filedialog
from tkinter import Variable
import os
class A(wx.Frame):
def __init__(self, superion):
wx.Frame.__init__(self, parent=superion, title='decryption software of Caesars upgraded version',
pos=(300,50),size=(900,750))
self.panel = wx.Panel(self)
# Add label control
self.label_L = wx.StaticText(parent=self.panel, label='Letter mapping table : ', pos=(15,20))
self.label_P = wx.StaticText(parent=self.panel, label='*Please modify the second line of the mapping table', pos=(550,55))
# Show text in red
self.label_P.SetForegroundColour((255, 0, 0))
self.label_p = wx.StaticText(parent=self.panel, label='plaintext : ', pos=(86, 100))
self.label_c = wx.StaticText(parent=self.panel, label='ciphertxt : ', pos=(85, 375))
# Modify font color
self.label_L.SetForegroundColour((30, 50, 100))
self.label_c.SetForegroundColour((30, 50, 100))
self.label_p.SetForegroundColour((30, 50, 100))
# Add text control
self.former = wx.TextCtrl(self.panel,pos=(155, 17),size=(385,-1))
self.trans = wx.TextCtrl(self.panel,pos=(155, 50), size=(385,-1))
self.plaintextBox = wx.TextCtrl(parent=self.panel, pos=(155, 100),size=(500, 250),
style=wx.TE_MULTILINE | wx.HSCROLL | wx.TE_DONTWRAP)
self.ciphertextBox = wx.TextCtrl(parent=self.panel, pos=(155, 375), size=(500, 250),
style=wx.TE_MULTILINE | wx.HSCROLL | wx.TE_DONTWRAP)
# Add button control
self.buttonLoad = wx.Button(parent=self.panel, label='load ciphertext file', pos=(680,580),size=(150,-1))
self.buttonLoad.SetForegroundColour((30, 50, 100))
self.Bind(wx.EVT_BUTTON, self.OnButtonLoad, self.buttonLoad)
self.buttonChoose = wx.Button(parent=self.panel, label='Select the file', pos=(680, 540), size=(150, -1))
self.buttonChoose.SetForegroundColour((30, 50, 100))
self.Bind(wx.EVT_BUTTON, self.OnButtonChoose, self.buttonChoose)
self.buttonDecrypt = wx.Button(parent=self.panel, label='Decrypt', pos=(125,660))
self.buttonDecrypt.SetForegroundColour((30, 50, 100))
self.Bind(wx.EVT_BUTTON, self.OnButtonDecrypt, self.buttonDecrypt)
self.buttonClear = wx.Button(parent=self.panel, label='Clear ciphertext', pos=(335,660))
self.buttonClear.SetForegroundColour((30, 50, 100))
self.Bind(wx.EVT_BUTTON, self.OnButtonClear, self.buttonClear)
self.buttonClear_ = wx.Button(parent=self.panel, label='Clear plaintext', pos=(480,660))
self.buttonClear_.SetForegroundColour((30, 50, 100))
self.Bind(wx.EVT_BUTTON, self.OnButtonClear_, self.buttonClear_)
self.buttonQuit = wx.Button(parent=self.panel, label='Quit', pos=(610, 660))
self.buttonQuit.SetForegroundColour((30, 50, 100))
self.Bind(wx.EVT_BUTTON, self.OnButtonQuit, self.buttonQuit)
self.buttonSet=wx.Button(parent=self.panel, label='a key Set', pos=(710, 200),size=(100,40))
self.buttonSet.SetForegroundColour((30, 50, 100))
self.Bind(wx.EVT_BUTTON, self.OnButtonSet, self.buttonSet)
self.buttonEncrypt = wx.Button(parent=self.panel, label='Encrypt', pos=(230, 660))
self.buttonEncrypt.SetForegroundColour((30, 50, 100))
self.Bind(wx.EVT_BUTTON, self.OnButtonEncrypt, self.buttonEncrypt)
def OnButtonChoose(self, event):
# A pop-up window prompts that only English text files can be selected
a = wx.MessageDialog(None, "you can only open English text documents!", "tips",
wx.YES_DEFAULT | wx.ICON_QUESTION)
if a.ShowModal() == wx.ID_YES:
a.Destroy()
try: # Error when opening non-English text file
default_dir = r"文件路径"
loading_txt = tkinter.filedialog.askopenfilename(title=u'选择文件',
initialdir=(os.path.expanduser((default_dir))))
with open(loading_txt,'r')as rfile:
lines=rfile.readlines()
self.ciphertextBox.SetValue(''.join(lines))
except Exception:
a = wx.MessageDialog(None, "Open failed!Possibly to open non-English text documents!", "Error!",
wx.YES_DEFAULT | wx.ICON_QUESTION)
if a.ShowModal() == wx.ID_YES:
a.Destroy()
def OnButtonLoad(self, event):
# Open the file and load the text box
with open('zxwcipher.txt','r')as file:
lines=file.readlines()
self.ciphertextBox.SetValue(''.join(lines))
def OnButtonDecrypt(self, event):
# Decrypt text
if len(self.former.GetValue())!=len(self.trans.GetValue()):
a = wx.MessageDialog(None, "The data of Letter mapping table is not matched,please check again!", "warning", wx.YES_DEFAULT | wx.ICON_QUESTION)
if a.ShowModal() == wx.ID_YES:
a.Destroy()
return
if (self.ciphertextBox.GetValue() == ""):
toastone = wx.MessageDialog(None, "The ciphertext cannot be empty", "warning", wx.YES_DEFAULT | wx.ICON_QUESTION)
if toastone.ShowModal() == wx.ID_YES:
toastone.Destroy()
return
l1=list(self.former.GetValue())
l2=list(self.trans.GetValue())
d = dict(zip(l1, l2)) # Use a dictionary to match the upper and lower letters one by one
d.update(dict(zip(l2, l1)))
'''Change the uppercase of the mapping table to uppercase, lowercase the lowercase, and then invert it,
use the dictionary to correspond one by one, and add to the existing dictionary '''
'''
若要用题目中给出规律进行解密,以上四段代码应改为
l1=list(self.former.GetValue())
l2=list(self.trans.GetValue())
l3=str.upper(self.former.GetValue())
l4=str.lower(list(self.trans.GetValue()))
d = dict(zip(l1, l2))
d.update(dict(zip(l3, l4)))
'''
trans=list(self.ciphertextBox.GetValue())
for i, j in enumerate(trans):
if j in d.keys():
trans[i] = d[j]
self.plaintextBox.SetValue(''.join(trans))
def OnButtonEncrypt(self,event):
# Encrypted text, invert the corresponding relationship between the context and the table
if len(self.former.GetValue())!=len(self.trans.GetValue()):
a = wx.MessageDialog(None, "The data of Letter mapping table is not matched,please check again!", "warning", wx.YES_DEFAULT | wx.ICON_QUESTION)
if a.ShowModal() == wx.ID_YES:
a.Destroy()
return
if (self.plaintextBox.GetValue() == ""):
toastone = wx.MessageDialog(None, "The plaintext cannot be empty", "warning", wx.YES_DEFAULT | wx.ICON_QUESTION)
if toastone.ShowModal() == wx.ID_YES:
toastone.Destroy()
return
l1=list(self.former.GetValue())
l2=list(self.trans.GetValue())
d = dict(zip(l2, l1))
d.update(dict(zip(l1, l2)))
'''
若要用题目中给出规律进行加密,以上四段代码应改为
l1=list(self.former.GetValue())
l2=list(self.trans.GetValue())
l3=str.upper(self.former.GetValue())
l4=str.lower(list(self.trans.GetValue()))
d = dict(zip(l2, l1))
d.update(dict(zip(l4, l3)))
'''
trans=list(self.plaintextBox.GetValue())
for i, j in enumerate(trans):
if j in d.keys():
trans[i] = d[j]
self.ciphertextBox.SetValue(''.join(trans))
def OnButtonClear_(self, event):
self.plaintextBox.SetValue('')
def OnButtonClear(self, event):
self.ciphertextBox.SetValue('')
def OnButtonQuit(self, event):
# A prompt window pops up when exiting
dlg=wx.MessageDialog(self,'Really Quit?','Caution',wx.CANCEL|wx.OK|wx.ICON_QUESTION)
if dlg.ShowModal() == wx.ID_OK:
self.Destroy()
def OnButtonSet(self,event):
self.former.SetValue('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')
self.trans.SetValue('R E D A B C F G H I J K L M N O P Q S T U V W X Y Z')
if __name__ == '__main__':
app = wx.App()
frame = A(None)
frame.Show()
app.MainLoop()
作者分享了解决Python作业中升级凯撒密码问题的心得,从错误的映射表出发,发现正确解密关键在于密钥的特殊性与密文中的大写字母数量。
1495

被折叠的 条评论
为什么被折叠?



