成在人线AV无码免费看_18禁网站有哪些_欧美黑人大尺度又粗又长_久久夜色撩人精品国产小说_无码高潮少妇毛多水多水免费

Python微實踐 - 布萊切利莊園的秘密
時間:2023-07-10 21:37:16    來源:嗶哩嗶哩

二戰(zhàn)時期,英國數(shù)學家、計算機科學之父Alan Turing在布萊切利莊園成功破譯了德軍密碼,為贏得世界反法西斯戰(zhàn)爭的勝利做出了重大貢獻。為了表達對前輩先賢的敬意,本微實踐取名為“布萊切利莊園的秘密”。

本文引用自作者編寫的下述圖書; 本文允許以個人學習、教學等目的引用、講授或轉載,但需要注明原作者"海洋餅干叔叔";本文不允許以紙質及電子出版為目的進行抄摘或改編。


(資料圖片)

1.《Python編程基礎及應用》,陳波,劉慧君,高等教育出版社。免費授課視頻

2.《Python編程基礎及應用實驗教程》, 陳波,熊心志,張全和,劉慧君,趙恒軍, 高等教育出版社

3. 《簡明C及C++語言教程》,陳波,待出版書稿。免費授課視頻

在人類尚未獲得足夠的算力之前,加密和解密都是手工進行的。受限于有限的人工算力,加解密只能采取一些簡單的方法,比如下面這種:

信息的發(fā)送方和接收方同時持有如上表所示的明密文字母對照表,該對照表對任何第三方保密。加密時,按照該對照表,將明文中的a映射為f,b映射為v,…,z映射為t,即得密文。解密時,同樣按照該對照表,將密文中的f映射為a,v映射為b,…,t映射為z,即得明文。

在隨書代碼的CH6子目錄下,文件包含了示例中的“明文”,其內容引自一本著名的英文小說:

通過執(zhí)行CH6子目錄下的,可以將明文按前述加密方法加密成密文,文件名為:

看起來,即便密文被第三方截獲,也難以解讀,實則不然。在正常的英文表達中,每個字母出現(xiàn)的頻率是有差異的,比如e的出現(xiàn)頻次通常最高的,而z、x、q則相較較低。這提供了一種解密思路:對密文中的字母出現(xiàn)頻率進行統(tǒng)計,其中出現(xiàn)次數(shù)最高者極可能是e,次高者可能是t,最低者則可能是z、x或者q。

應用上述解密思路,我們設計了下述解密程序:

第2 ~ 4行:打開當前工作路徑下的密文文件,將其中的內容按字符串形式讀出,保存在變量s中。使用Python進行文件讀寫的詳細方法,我們在第8章中討論。 請讀者留意第3行中l(wèi)ower()函數(shù)的存在,在整個解密過程中,我們統(tǒng)一使用小寫字母。

第6 ~ 9行:借助于字典stats對密文中各字母的出現(xiàn)次數(shù)進行統(tǒng)計。統(tǒng)計完成后,stats中將得到形如{“a”:112, “x”:7, … “z”:3}的結果數(shù)據(jù)。統(tǒng)計過程中,我們使用for循環(huán)對密文s中的字符c逐一進行處理,如果字符c是英文字母(使用成員函數(shù)isalpha()進行判斷),則將其在字典中的出現(xiàn)次數(shù)加1。請讀者留意get()函數(shù)的運用,當某個字母是首次發(fā)現(xiàn)時,其在字典中尚不存在,此時,get()函數(shù)將返回默認值0。

第11 ~ 14行:通過列表按統(tǒng)計的頻次對字母進行降序排序。在字典中,鍵值對之間沒有前后之分,因此排序只能通過列表進行。第11行將字典的鍵值對轉換為列表,其內容形式為:[(“a”,112),( “q”,3),…,(“x”,7)]。第12行使用sort()函數(shù)對該列表進行排序,排序時通過匿名函數(shù)獲取每個元組的下標1值,即頻次做為排序依據(jù)。第13行使用列表推導語法將有序列表中的字母單獨提取出來,并使用空字符串””將所有字母串接在一起。如執(zhí)行結果的第1行所示,stats字符串的值為zufaolsjyedhpqrcvgiwnbmtkx,這表明在密文中,出現(xiàn)頻次最高的是z,然后是u,f,出現(xiàn)頻次最低是x。

第16行:字符串codes給出了從正常語料庫中統(tǒng)計的字母出現(xiàn)頻次的降序排列。

第19 ~ 24行:按照字母頻次的統(tǒng)計結果,進行解密。字符串stats給出了密文統(tǒng)計的字母頻次降序排列,字符串codes則給出了正常語料統(tǒng)計的字母頻次降序排列。粗略地,我們認為,密文字母stats[i]對應的明文字母即為codes[i]。在下述統(tǒng)計結果中,z在密文中出現(xiàn)頻次最高,我們認為它對應明文字母e;u在密文中出現(xiàn)頻次為第二高,我們認為它對應明文字母t。

解密過程中,我們使用for循環(huán)逐一處理密文s中的字符c。如果字符c是字母(isalpha()),首先通過(c)找到它在密文中的頻次排位,然后再以該頻次排位作為下標,從codes中獲得對應的明文字母,并將明文字母附加至明文字符串r。舉例,假設c為字母”f”,(c)的結果為下標2,對照codes[2],明文字母即為”a”。如代碼的第23 ~ 24行所示,對于那些不是字母的密文字符,直接將其附加至明文字符串r。

第26 ~ 28行:將解密所得的明文字符串r寫入文件。

使用Visual Studio Code打開解密文件,可見解密結果是正確的:

需要說明的是,由于密文較短,其字母頻次統(tǒng)計結果不一定能與正常語料統(tǒng)計的字母頻次完美對應。此時,按上述方法得到解密結果可能并不十分準確,比如z被錯誤解讀成了q。在多數(shù)字母被正確解密的情況下,少數(shù)字母的錯誤對應關系容易通過人工進行校正。

源程序、數(shù)據(jù)文件下載:?請在瀏覽器中復制并錄入下述地址

/2023/07/secretgarden/secretgarden/

為了幫助更多的年輕朋友們學好編程,作者在B站上開了兩門免費的網(wǎng)課,一門零基礎講Python,一門零基礎C和C++一起學,拿走不謝!

簡潔的C及C++

Python編程基礎及應用

如果你覺得紙質書看起來更順手,目前Python有兩本,C和C++在出版過程中。

《Python編程基礎及應用》?

《Python編程基礎及應用實驗教程》

標簽: