Python密碼學(xué)編程(加密算法初學(xué)指南)_第1頁
Python密碼學(xué)編程(加密算法初學(xué)指南)_第2頁
Python密碼學(xué)編程(加密算法初學(xué)指南)_第3頁
Python密碼學(xué)編程(加密算法初學(xué)指南)_第4頁
Python密碼學(xué)編程(加密算法初學(xué)指南)_第5頁
已閱讀5頁,還剩352頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

Python密碼學(xué)編程加密算法初學(xué)指南目錄\h第1章制作紙質(zhì)加密工具\h1.1密碼學(xué)是什么\h1.2代碼與加密法\h1.3制作紙質(zhì)加密輪盤\h1.4虛擬加密輪盤\h1.5如何使用加密輪盤加密\h1.6如何使用加密輪盤解密\h1.7另一個加密法工具:St.Cyr滑條\h1.8A組練習\h1.9不用紙質(zhì)工具做加密\h1.10B組練習\h1.11雙重強度加密\h1.12通過計算機編程進行加密\h第2章Pygame基礎(chǔ)知識\h2.1下載和安裝Python\h2.1.1Windows安裝步驟\h2.1.2OSX安裝步驟\h2.1.3Ubuntu和Linux安裝步驟\h2.2下載pyperclip.py\h2.3啟動IDLE\h2.4特色程序\h2.5行號和空格\h2.6本書的文本換行\(zhòng)h2.7在線跟蹤程序\h2.8使用在線比較工具檢查輸入的代碼\h2.9復(fù)制粘貼文本\h2.10更多信息鏈接\h2.11編程和密碼學(xué)\h第3章交互式Shell\h3.1一些簡單的數(shù)學(xué)知識\h3.2整數(shù)和浮點數(shù)\h3.3表達式\h3.4運算符順序\h3.5計算表達式\h3.6錯誤是可以接受的\h3.7A組練習\h3.8每個值都有一個數(shù)據(jù)類型\h3.9通過賦值語句把值存到變量里\h3.10重寫變量\h3.11使用多個變量\h3.12變量名\h3.13駝峰式大小寫\h3.14B組練習\h3.15小結(jié)\h第4章字符串和寫程序\h4.1字符串\h4.2使用+運算符的字符串連接\h4.3使用*運算符的字符串復(fù)制\h4.4使用print()函數(shù)輸出值\h4.5轉(zhuǎn)義字符\h4.6引號和雙引號\h4.7A組練習\h4.8索引操作\h4.9負索引\h4.10分片操作\h4.11空分片索引\h4.12B組練習\h4.13在IDLE的文件編輯器里寫程序\h4.14HelloWorld!\h4.15HelloWorld的源代碼\h4.16保存你的程序\h4.17運行你的程序\h4.18打開你保存的程序\h4.19“HelloWorld”程序如何工作\h4.20注釋\h4.21函數(shù)\h4.22print()函數(shù)\h4.23input()函數(shù)\h4.24結(jié)束程序\h4.25C組練習\h4.26小結(jié)\h第5章反轉(zhuǎn)加密法\h5.1反轉(zhuǎn)加密法\h5.2反轉(zhuǎn)加密法程序的源代碼\h5.3運行反轉(zhuǎn)加密法程序\h5.4用在線比較工具檢查你的源代碼\h5.5這個程序如何工作\h5.6len()函數(shù)\h5.7while循環(huán)簡介\h5.8布爾數(shù)據(jù)類型\h5.9比較運算符\h5.10條件\h5.11代碼塊\h5.12while循環(huán)語句\h5.13“增長”一個字符串\h5.14一步一步跟蹤程序\h5.15在我們的程序里使用input()\h5.16A組練習\h5.17小結(jié)\h第6章凱撒加密法\h6.1實現(xiàn)程序\h6.2凱撒加密法程序的源代碼\h6.3運行凱撒加密法程序\h6.4使用在線比較工具檢查你的源代碼\h6.5A組練習\h6.6這個程序如何工作\h6.7使用import語句導(dǎo)入模塊\h6.8常量\h6.9upper()和lower()字符串方法\h6.10for循環(huán)語句\h6.11相當于for循環(huán)的while循環(huán)\h6.12B組練習\h6.13if語句\h6.14else語句\h6.15elif語句\h6.16in和notin運算符\h6.17find()字符串方法\h6.18C組練習\h6.19回到代碼\h6.20顯示和復(fù)制加密/解密之后的字符串\h6.21加密非字母字符\h6.22小結(jié)\h第7章暴力破譯凱撒加密法\h7.1破譯加密\h7.2暴力破譯\h7.3凱撒加密法破譯程序的源代碼\h7.4運行凱撒加密法破譯程序\h7.5這個程序如何工作\h7.6range()函數(shù)\h7.7回到代碼\h7.8字符串格式化\h7.9A組練習\h7.10小結(jié)\h第8章使用換位加密法加密\h8.1換位加密法\h8.2A組練習\h8.3換位加密法加密程序\h8.4換位加密法加密程序的源代碼\h8.5運行換位加密法加密程序\h8.6這個程序如何工作\h8.7使用def語句創(chuàng)建你自己的函數(shù)\h8.8程序的main()函數(shù)\h8.9形參\h8.10對形參的修改只存在于函數(shù)之內(nèi)\h8.11全局作用域和本地作用域里的變量\h8.12global語句\h8.13B組練習\h8.14列表數(shù)據(jù)類型\h8.15使用list()函數(shù)把區(qū)間對象轉(zhuǎn)換成列表\h8.16重新賦值列表里的項\h8.17重新賦值字符串里的字符\h8.18列表的列表\h8.19C組練習\h8.20在列表上使用len()和in運算符\h8.21使用+和*運算符的列表連接和復(fù)制\h8.22D組練習\h8.23換位加密算法\h8.24增強賦值運算符\h8.25回到代碼\h8.26join()字符串方法\h8.27返回值和return語句\h8.28E組練習\h8.29回到代碼\h8.30特殊的name變量\h8.31密鑰的大小和消息的長度\h8.32小結(jié)\h第9章使用換位加密法解密\h9.1在紙上使用換位加密法解密\h9.2練習A組\h9.3換位加密法解密程序\h9.4換位加密法解密程序的源代碼\h9.5這個程序如何工作\h9.6math.ceil()、math.floor()和round()函數(shù)\h9.7and和or布爾運算符\h9.8B組練習\h9.9真值表\h9.10and和or運算符可以簡化代碼\h9.11布爾運算符的運算順序\h9.12回到代碼\h9.13C組練習\h9.14小結(jié)\h第10章寫一個程序測試我們的程序\h10.1換位加密法測試程序的源代碼\h10.2運行換位加密法測試程序\h10.3這個程序如何工作\h10.4偽隨機數(shù)和random.seed()函數(shù)\h10.5random.randint()函數(shù)\h10.6引用\h10.7copy.deepcopy()函數(shù)\h10.8A組練習\h10.9random.shuffle()函數(shù)\h10.10隨機打亂一個字符串\h10.11回到代碼\h10.12sys.exit()函數(shù)\h10.13測試我們的測試程序\h10.14小結(jié)\h第11章加密和解密文件\h11.1純文本文件\h11.2換位加密法文件加密程序的源代碼\h11.3運行換位加密法文件加密程序\h11.4讀取文件\h11.4.1open()函數(shù)和文件對象\h11.4.2read()文件對象方法\h11.4.3close()文件對象方法\h11.5寫入文件\hwrite()文件對象方法\h11.6這個程序如何工作\h11.7os.path.exists()函數(shù)\h11.8startswith()和endswith()字符串方法\h11.9title()字符串方法\h11.10time模塊和time.time()函數(shù)\h11.11回到代碼\h11.12A組練習\h11.13小結(jié)\h第12章通過編程檢測英文\h12.1計算機如何理解英文\h12.2A組練習\h12.3檢測英文模塊\h12.4檢測英文模塊的源代碼\h12.5這個程序如何工作\h12.6字典和字典數(shù)據(jù)類型\h12.7添加或修改字典里的項\h12.8B組練習\h12.9在字典上使用len()函數(shù)\h12.10在字典上使用in運算符\h12.11在字典上使用for循環(huán)\h12.12C組練習\h12.13字典與列表之間的區(qū)別\h12.14在字典上查找項比在列表上更快\h12.15split()方法\h12.16None值\h12.17回到代碼\h12.18“除以零”錯誤\h12.19float()、int()和str()函數(shù)以及整數(shù)除法\h12.20D組練習\h12.21回到代碼\h12.22append()列表方法\h12.23默認參數(shù)值\h12.24計算比例\h12.25E組練習\h12.26小結(jié)\h第13章破譯換位加密法\h13.1換位加密法破譯程序的源代碼\h13.2運行換位加密法破譯程序\h13.3這個程序如何工作\h13.4使用三引號的多行字符串\h13.5回到代碼\h13.6strip()字符串方法\h13.7A組練習\h13.8小結(jié)\h第14章取模運算與乘數(shù)加密法和仿射加密法\h14.1噢,不,數(shù)學(xué)!\h14.2數(shù)學(xué),噢耶!\h14.3取模運算(又名時鐘運算)\h14.4取模運算符%\h14.5A組練習\h14.6GCD:最大公約數(shù)(又名最大公因數(shù))\h14.7使用古氏積木(Cuisenairerods)可視化因數(shù)和GCD\h14.8B組練習\h14.9多重賦值\h14.10通過多重賦值交換值\h14.11找出兩個數(shù)字的GCD的歐幾里得算法\h14.12“互質(zhì)”\h14.13C組練習\h14.14乘數(shù)加密法\h14.15D組練習\h14.16乘數(shù)加密法+凱撒加密法=仿射加密法\h14.17仿射密鑰的第一個問題\h14.18使用仿射加密法解密\h14.19找出模逆\h14.20//整數(shù)除法運算符\h14.21cryptomath模塊的源代碼\h14.22E組練習\h14.23小結(jié)\h第15章仿射加密法\h15.1仿射加密法程序的源代碼\h15.2運行仿射加密法程序\h15.3A組練習\h15.4這個程序如何工作\h15.5把一個密鑰分成兩個密鑰\h15.6元組數(shù)據(jù)類型\h15.7密鑰的輸入驗證\h15.8仿射加密法加密函數(shù)\h15.9仿射加密法解密函數(shù)\h15.10生成隨機密鑰\h15.11仿射密鑰的第二個問題:仿射加密法可以有多少個密鑰\h15.12小結(jié)\h第16章破譯仿射加密法\h16.1仿射加密法破譯程序的源代碼\h16.2運行仿射加密法破譯程序\h16.3這個程序如何工作\h16.4仿射加密法破譯函數(shù)\h16.5**指數(shù)運算符\h16.6continue語句\h16.7A組練習\h16.8小結(jié)\h第17章簡單替代加密法\h17.1使用紙筆實現(xiàn)簡單替代加密法\h17.2A組練習\h17.3簡單替代加密法的源代碼\h17.4運行簡單替代加密法程序\h17.5這個程序如何工作\h17.6程序的main()函數(shù)\h17.7sort()列表方法\h17.8包裝器函數(shù)\h17.9程序的translateMessage()函數(shù)\h17.10isupper()和islower()字符串方法\h17.11B組練習\h17.12生成隨機密鑰\h17.13加密空格和標點符號\h17.14C組練習\h17.15小結(jié)\h第18章破譯簡單替代加密法\h18.1計算單詞模式\h18.2獲取密詞的候選單詞列表\h18.3A組練習\h18.4單詞模式模塊的源代碼\h18.5運行單詞模式模塊\h18.6這個程序如何工作\h18.7pprint.pprint()和pprint.pformat()函數(shù)\h18.8在Python里使用列表創(chuàng)建字符串\h18.9計算單詞模式\h18.10單詞模式程序的main()函數(shù)\h18.11破譯簡單替代加密法\h18.12簡單替代破譯程序的源代碼\h18.13破譯簡單替代加密法(理論)\h18.14使用交互式Shell探索破譯函數(shù)\h18.15這個程序如何工作\h18.16導(dǎo)入所有東西\h18.17正則表達式和sub()正則方法簡介\h18.18破譯程序的main()函數(shù)\h18.19部分破譯加密法\h18.20空密字映射\h18.21把字母添加到密字映射\h18.22計算兩個密字映射的交集\h18.23從密字映射移除已經(jīng)破譯的字母\h18.24破譯簡單替代加密法\h18.25從密字映射創(chuàng)建密鑰\h18.26我們不能把空格也加密嗎\h18.27總結(jié)\h第19章維吉尼亞加密法\h19.1不可破譯的加密法\h19.2維吉尼亞密鑰里的多個“密鑰”\h19.3維吉尼亞加密法程序的源代碼\h19.4運行維吉尼亞加密法程序\h19.5這個程序如何工作\h19.6小結(jié)\h第20章頻率分析\h20.1字母頻率和ETAOIN\h20.1.1匹配字母頻率\h20.1.2計算頻率匹配分值的例子\h20.1.3另一個計算頻率匹配分值的例子\h20.1.4破譯每個子密鑰\h20.2匹配字母頻率的代碼\h20.3這個程序如何工作\h20.4最常見的字母“ETAOIN”\h20.5這個程序的getLettersCount()函數(shù)\h20.6這個程序的getItemAtIndexZero()函數(shù)\h20.7這個程序的getFrequencyOrder()函數(shù)\h20.8sort()方法的key和reverse關(guān)鍵字參數(shù)\h20.9把函數(shù)作為值傳遞\h20.10通過keys()、values()和items()字典方法把字典轉(zhuǎn)換成列表\h20.11對字典的項進行排序\h20.12這個程序的englishFreqMatchScore()函數(shù)\h20.13小結(jié)\h第21章破譯維吉尼亞加密法\h21.1字典攻擊\h21.2維吉尼亞字典攻擊程序的源代碼\h21.3運行維吉尼亞字典破譯程序\h21.4readlines()文件對象方法\h21.5巴貝奇攻擊和卡西斯基試驗\h21.6卡西斯基試驗的第1步——找出重復(fù)序列的間距\h21.7卡西斯基試驗的第2步——獲取間距的因數(shù)\h21.8從字符串獲取每隔N個字母\h21.9頻率分析\h21.10暴力破譯可能密鑰\h21.11維吉尼亞破譯程序的源代碼\h21.12運行維吉尼亞破譯程序\h21.13這個程序如何工作\h21.14找出重復(fù)序列\(zhòng)h21.15計算因數(shù)\h21.16通過set()函數(shù)來移除重復(fù)值\h21.17卡西斯基測試算法\h21.18extend()列表方法\h21.19print()的end關(guān)鍵字參數(shù)\h21.20duct()函數(shù)\h21.21break語句\h21.22A組練習\h21.23修改破譯程序的常量\h21.24小結(jié)\h第22章一次一密加密法\h22.1牢不可破的一次一密加密法\h22.2為什么一次一密加密法是牢不可破的\h22.3小心偽隨機\h22.4小心二次密碼本加密法\h22.5二次密碼本加密法就是維吉尼亞加密法\h22.6A組練習\h22.7小結(jié)\h第23章尋找質(zhì)數(shù)\h23.1質(zhì)數(shù)\h23.2合數(shù)\h23.3質(zhì)數(shù)篩選模塊的源代碼\h23.4這個程序如何工作\h23.5如何判斷一個數(shù)字是不是質(zhì)數(shù)\h23.6埃拉托色尼篩選法\h23.7primeSieve()函數(shù)\h23.8檢測質(zhì)數(shù)\h23.9拉賓米勒模塊的源代碼\h23.10運行拉賓米勒模塊\h23.11這個程序如何工作\h23.12拉賓米勒算法\h23.13新的經(jīng)過改進的isPrime()函數(shù)\h23.14小結(jié)\h第24章公鑰密碼學(xué)和RSA加密法\h24.1公鑰密碼學(xué)\h24.2“教材”RSA的危險\h24.3身份驗證的問題\h24.4中間人攻擊\h24.5生成公鑰和私鑰\h24.6RSA密鑰生成程序的源代碼\h24.7運行RSA密鑰生成程序\h24.8這個密鑰生成程序如何工作\h24.9這個程序的generateKey()函數(shù)\h24.10RSA密鑰文件格式\h24.11混合加密機制\h24.12RSA加密法程序的源代碼\h24.13運行RSA加密法程序\h24.14A組練習\h24.15數(shù)字簽名\h24.16RSA加密法程序如何工作\h24.17ASCII:使用數(shù)字來表示字符\h24.18chr()和ord()函數(shù)\h24.19B組練習\h24.20區(qū)塊\h24.21使用getBlocksFromText()把字符串轉(zhuǎn)成區(qū)塊\h24.22encode()字符串方法和bytes數(shù)據(jù)類型\h24.23bytes()函數(shù)和bytes的decode()方法\h24.24C組練習\h24.25回到代碼\h24.26min()和max()函數(shù)\h24.27insert()列表方法\h24.28RSA加密和解密的數(shù)學(xué)運算\h24.29pow()函數(shù)\h24.30從密鑰文件讀取公鑰和私鑰\h24.31完整的RSA加密流程\h24.32完整的RSA解密流程\h24.33D組練習\h24.34我們?yōu)槭裁床荒芷谱gRSA加密法\h24.35小結(jié)注:原文檔電子版(非掃描),需要的請下載本文檔后留言謝謝。第1章制作紙質(zhì)加密工具本章主要內(nèi)容:密碼學(xué)是什么;代碼和加密法;凱撒加密法;加密輪盤;St.Cyr滑條;用紙筆做加密;“雙重強度”加密。我忍不住偷聽,可能因為我在竊聽?!?.1密碼學(xué)是什么看看以下兩段文字:左邊的文字是秘密消息。這段消息已被加密,或者說被變成了秘密代碼。任何不知道如何解密(也就是把它變回普通英語消息)的人都無法閱讀。本書將會教你如何加密和解密消息。右邊的消息只是隨機亂碼,沒有包含任何有意義的內(nèi)容。加密你寫下來的消息是對其他人保密的一種方式,即使他們得到了加密之后的消息。這看起來和隨機亂碼完全一樣。密碼學(xué)是使用秘密代碼的科學(xué)。密碼編譯者是使用和研究秘密代碼的人。本書會告訴你成為一名密碼編譯者需要知道什么。當然,這些秘密消息并不總是保持秘密狀態(tài)。密碼破譯者是能破譯秘密代碼并讀取其他人的加密消息的人。密碼破譯者又稱為代碼破譯者(codebreaker)或代碼黑客(hacker)。本書也會告訴你成為一名密碼破譯者需要知道什么。遺憾的是,你在本書里學(xué)到的破譯方式不會給你帶來麻煩(我的意思是,幸虧如此)。間諜、士兵、黑客、海盜、貴族、商人、暴君、政治激進分子、網(wǎng)購者以及任何要與可信好友分享秘密的人都依賴密碼學(xué),以確保他們的秘密還是秘密。1.2代碼與加密法19世紀初發(fā)明的電報允許通過跨越大陸的電線進行即時通信,這比帶著一袋信件騎馬派送要快很多。然而,電報不能直接發(fā)送寫在紙上的字母,它只能發(fā)送電子脈沖。短脈沖叫“點”,長脈沖叫“線”。圖1-1SamuelMorse1791年4月27日—1872年4月2日圖1-2AlfredVail1807年9月25日—1859年1月18日為了把這些點和線轉(zhuǎn)成英文字母,需要一個編碼(或代碼)系統(tǒng)把英語翻譯成電子脈沖代碼(編碼),另一邊把電子脈沖翻譯成英語(解碼)。用于電報(后來也用于無線電)的代碼叫摩斯代碼(MorseCode),由SamuelMorse(見圖1-1)和AlfredVail(見圖1-2)發(fā)明。通過一個電報按鈕敲打出點和線,電報員可以把英語消息發(fā)給世界另一端的某個人,幾乎是實時的?。ㄈ绻阆雽W(xué)習圖1-3所示的摩斯代碼,請到\h/morse。)圖1-3國際摩斯代碼,通過點和線表示字符代碼是可以理解的,而且是公開發(fā)布的。任何人都應(yīng)該可以通過查找代碼符號的含義解密已被加密的消息。1.3制作紙質(zhì)加密輪盤在學(xué)習通過計算機編程進行加密和解密之前,我們先來了解一下如何使用簡單的紙質(zhì)工具手工完成這項任務(wù)。把可理解的英語文字(明文)變成隱藏秘密代碼的亂碼文字(密文)是很容易的。加密法(cipher)是一組轉(zhuǎn)換明文和密文的規(guī)則。這些規(guī)則通常使用一個密鑰。我們會在本書里學(xué)到多種不同的加密法。我們來學(xué)一下凱撒加密法。這種加密法曾在兩千年前被凱撒大帝用過。好消息是,它學(xué)起來很簡單很容易。壞消息是,正因為它簡單,密碼破譯者也很容易破譯它。但我們可以把它看做一個簡單的練習。Wikipedia上有更多關(guān)于凱撒加密法的信息:[http://en.wikipedia.org/wiki/Caesar_cipher](http://en.wikipedia.org/wiki/Caesar_cipher)。要用凱撒加密法把明文轉(zhuǎn)成密文,需要制作一個加密輪盤(又名加密圓盤)。你可以復(fù)印本書給出的加密輪盤(見圖1-4和圖1-5),也可以打印\h/cipherwheel上的那個加密輪盤。把這兩個圓圈剪下來,然后把它們疊在一起,參考圖1-6至圖1-8所示的步驟。圖1-4加密輪盤內(nèi)圈圖1-5加密輪盤外圈不要從本書\h/cipherwheel上打印上剪!復(fù)印本頁或從圖1-6剪下加密輪盤圖1-7剪下來的圓圈圖1-8完成后的加密輪盤剪下兩個圓圈之后,把小的放在大的中間。在兩個圓圈中間插一根大頭針或曲頭釘,這樣你就可以在上面旋轉(zhuǎn)了?,F(xiàn)在,你擁有使用凱撒加密法加密信息所需的工具了。1.4虛擬加密輪盤如果你手頭沒有剪刀和復(fù)印機,你也可以使用在線虛擬加密輪盤(見圖1-9)。用瀏覽器打開\h/cipherwheel,使用軟件版的加密輪盤。圖1-9在線加密輪盤要旋轉(zhuǎn)輪盤,用鼠標在上面點擊一下,然后移動鼠標,直到你想要的密鑰在適當?shù)奈恢蒙?。再次點擊鼠標,就可以停止輪盤的旋轉(zhuǎn)。1.5如何使用加密輪盤加密首先,在紙上用英語寫下你的消息。在這個例子里,我們將會加密這條消息:“ThesecretpasswordisRosebud.”。接著,旋轉(zhuǎn)內(nèi)圈,直到它的字母匹配外圈的字母。值得注意的是,外圈的字母A下面有一個點。再看看外圈里的這個點對應(yīng)的內(nèi)圈里的數(shù)字,這個數(shù)字就是密鑰。這個密鑰就是加密或解密消息的秘密所在。任何讀過這本書的人都知道凱撒加密法,就像任何讀過關(guān)于鎖的書的人都知道門鎖的工作原理。但是,就像平常的鎖和鑰匙,除非他們有密鑰,否則他們不能解鎖(也就是解密)已被加密的消息。在圖1-9中,外圈的A在內(nèi)圈的數(shù)字8上,這意味著我們將會使用8這個密鑰來加密我們的消息。凱撒加密法使用的密鑰范圍是0~25。我們的例子將會使用8這個密鑰。保管好這個密鑰,任何知道這條消息使用8這個密鑰加密的人都能讀懂密文。對于我們的消息里的每個字母,我們將會找到它在外圈的位置,然后把它替換成內(nèi)圈對應(yīng)的字母。我們的消息的第一個字母是T(“Thesecret…”里的第一個“T”),于是我們在外圈找到字母T,然后找到內(nèi)圈對應(yīng)的字母。這個字母是B,因此,我們總會把我們的秘密消息里的T替換成B(如果我們使用8以外的其他密鑰,那么明文里的T將被替換成別的字母)。我們的消息里的下一個字母是H,它會變成P。字母E會變成M。當我們加密完整條消息時,這條消息會從“ThesecretpasswordisRosebud.”變成“BpmamkzmbxiaaewzlqaZwamjcl.”(見圖1-10)?,F(xiàn)在你可以把這條消息發(fā)給某人(或者給自己寫下來),沒人可以讀懂它,除非你把密鑰(數(shù)字8)告訴他們。圖1-10用加密輪盤加密的消息外圈上的每個字母總是加密成內(nèi)圈上相同的字母。為了節(jié)約時間,在你查找“Thesecret…”里的第一個T,并看到它會加密成B之后,你可以把這條消息里的每個T都替換成B。這樣,一個字母你只需要查找一次。1.6如何使用加密輪盤解密要解密一條密文,從內(nèi)圈向外圈走。假設(shè)你從一個朋友那里收到這條密文:“IwtctlephhldgsxhHldgsuxhw.”。你和其他人都不能解密它,除非你知道密鑰(或者除非你是個很聰明的黑客)。但你的朋友決定使用15這個密鑰加密自己發(fā)給你的每條消息。把外圈上的字母A(下面有個點的那個)對準內(nèi)圈上帶有數(shù)字15的字母(即字母P)。密文里的第一個字母是I,因此,我們在內(nèi)圈上找I,看看旁邊外圈上的字母,是T。密文里的W會解密成字母H。一個接一個地,我們把密文里的每個字母解密成明文:“ThenewpasswordisSwordfish.”。如果你使用不正確的密鑰,比如16,而不是正確的密鑰15,解密的消息是:“SgdmdvozrrvnqchrRvnqcehrg.”。這個明文根本看不懂。除非使用正確的密鑰,否則被解密的消息永遠不會是可理解的英語。1.7另一個加密法工具:St.Cyr滑條還有一個紙質(zhì)工具可以用來做加密和解密,這個紙質(zhì)工具叫做St.Cyr滑條。它很像密鑰索引輪盤,但它是直的。復(fù)印本頁的St.Cyr滑條圖片(或者從\h/stcyrslide打?。?,剪下三條紙帶,如圖1-11所示。圖1-11復(fù)印這些紙帶制作St.Cyr滑條連接兩條字母表紙帶,把黑框A粘在另一條紙帶上的白框Z旁邊。割開主滑框兩邊的裂縫,使連接起來的紙條可以穿過它。最后看起來應(yīng)該是如圖1-12所示。圖1-12完成后的St.Cyr滑條當黑框A在字母H(數(shù)字7)下面時,如果要加密,就在長紙帶上找出明文字母的位置,然后把它替換成在它上面的字母。如果要解密,就在上面那行字母里找出密文字母,然后把它替換成下面的長紙帶上的字母。大框兩邊的裂縫會隱藏其他的字母,這樣,對于任何密鑰,滑條上的每個字母你只會看到一個。St.Cyr滑條的好處是更容易找到你要找的字母,因為它們都在同一條直線上,不像加密輪盤那樣有時候會倒轉(zhuǎn)過來。虛擬的可打印的St.Cyr滑條可以在\h/stcyrslide找到。1.8A組練習你可以在\h/hackingpractice1A找到練習。不要忽略練習!本書沒有足夠的篇幅列出所有練習,但它們?nèi)匀恢匾?。僅僅閱讀關(guān)于黑客技術(shù)和編程的資料不會讓你成為一名黑客。你需要實踐!1.9不用紙質(zhì)工具做加密在使用凱撒加密法做加密和解密時,加密輪盤和St.Cyr滑條都是很好的工具。但我們只用鉛筆和紙也可以實現(xiàn)凱撒加密法。把字母表的字母從A到Z寫下來,在每個字母下面寫下數(shù)字0到25。在A下面寫0,B下面寫1,如此類推,直到在Z下面寫25(字母表里有26個字母,但我們的數(shù)字最多只到25,因為我們從0而不是1開始的)。最終看起來像這樣:有了上面這個從字母到數(shù)字的代碼,我們就可以用數(shù)字來表示字母了。這是一個非常強大的概念,因為數(shù)學(xué)使用數(shù)字?,F(xiàn)在我們可以在字母上做運算了?,F(xiàn)在,如果要加密,我們找到希望加密的字母下面的數(shù)字,然后把密鑰數(shù)字加上去。這個和就是加密的字母下面的數(shù)字。如,我們使用密鑰13加密“Hello.Howareyou?”。首先,我們找到H下面的數(shù)字,是7。接著,我們把密鑰加上這個數(shù)字,7+13=20。數(shù)字20在字母U下面,這意味著字母H加密成字母U。如果要加密字母E,我們把E下面的4加上13,得到17。17上面的字母是R,因此E加密成R。如此類推。直到我們遇上字母O時這個方法才會出問題。O下面的數(shù)字是14,當把14加上13時,我們得到27。但我們的數(shù)字列表最多只到25。如果字母的數(shù)字和密鑰之和超過26,我們應(yīng)該減去26,27–26得到1。數(shù)字1上面的字母是B。于是,當使用密鑰13時,字母O加密成字母B。一個接一個地,我們可以把“HELLO.HOWAREYOU?”里的字母加密成“URYYB.UBJNERLBH?”。因此,加密一個字母的步驟是:1.從1到25選一個密鑰。保管好這個密鑰!2.找出明文字母的數(shù)字。3.把密鑰加到這個明文字母的數(shù)字。4.如果這個數(shù)字大于26,則減去26。5.找出你計算的數(shù)字的字母。這就是密文字母。6.對明文消息里的每個字母重復(fù)步驟2~5。表1-1演示了如何使用密鑰13加密“HELLO.HOWAREYOU?”里的每個字母。每列演示了把左邊的明文字母變成右邊的密文字母的步驟。表1-1用紙和鉛筆加密“Hello.Howareyou?”的步驟

明文字母明文數(shù)字+密鑰結(jié)果減去26?結(jié)果密文字母H7+13=20=2020=UE4+13=17=1717=RL11+13=24=2424=YL11+13=24=2424=YO14+13=27?26=11=BH7+13=20=2020=UO14+13=27?26=11=BW22+13=35?26=99=JA0+13=13=1313=NR17+13=30?26=44=EE4+13=17=1717=RY24+13=37?26=1111=LO14+13=27?26=11=BU20+13=33?26=77=H如果要解密,你需要理解負數(shù)是什么。如果你不知道如何加和減負數(shù),可以參考教程\h/neg。如果要解密,減去這個密鑰,而不是加上它。對于密文字母B,這個數(shù)字是1。1減去13得到?12。就像加密的“減去26”規(guī)則,當解密并且結(jié)果小于0時,我們有一條“加上26”的規(guī)則。?12+26是14,因此,如表1-2所示,密文字母B解密回字母O。表1-2用紙和鉛筆解密密文的步驟

密文字母密文數(shù)字?密鑰結(jié)果加上26?結(jié)果明文字母U20?13=7=77=HR17?13=4=44=EY24?13=11=1111=LY24?13=11=1111=LB1?13=?12+26=1414=OU20?13=7=77=HB1?13=?12+26=1414=OJ9?13=?4+26=2222=WN13?13=0=00=AE4?13=?9+26=1717=RR17?13=4=44=EL11?13=?2+26=2424=YB1?13=?12+26=1414=OH7?13=?6+26=2020=U如你所見,使用凱撒加密法加密是并不真的需要加密輪盤。如果你記住數(shù)字和字母,你甚至不必寫下字母表以及它們下面的數(shù)字。你只需心算就可以寫出秘密消息了。1.10B組練習你可以在\h/hackingpractice1B找到練習。1.11雙重強度加密你可能在想,使用兩個不同密鑰加密同一條消息兩次會加倍加密的強度。但這對于凱撒加密法(以及大多數(shù)其他加密法)來說不是那么一回事。讓我們雙重加密一條消息看個究竟。如果我們用密鑰3加密“KITTEN”這個詞,得到的密文將是“NLWWHQ”。如果我們用密鑰4加密“NLWWHQ”這個詞,得到的密文將是“RPAALU”。這和用密鑰7加密“KITTEN”這個詞完全一樣?!半p重”加密和普通加密是一樣的,沒有任何強化。其中的原因是,當我們用密鑰3加密時,我們把3加到明文字母的數(shù)字。接著,當我們用密鑰4加密時,我們把4加到明文字母的數(shù)字。但加上3再加上4和直接加上7完全一樣。用密鑰3和4加密兩次和用密鑰7加密一次是一樣的。對于大多數(shù)加密法而言,多次加密不會增加密文的強度。事實上,如果你用兩個加起來等于26的密鑰來加密某些明文,你最終得到的密文和原來的明文是一樣的!1.12通過計算機編程進行加密幾個世紀以來,凱撒加密法或者類似的加密法曾被用于加密信息。圖1-13是AlbertMyer設(shè)計的加密圓盤,這個加密圓盤曾在1863年的美國南北戰(zhàn)爭中使用。圖1-13在美國國家密碼博物館展覽的美國南北戰(zhàn)爭同盟使用的加密圓盤如果你有一段很長的消息希望加密(如加密一整本書),手工加密需要耗費數(shù)日或數(shù)周的時間。這正是編程派上用場的地方。計算機可以在一秒之內(nèi)完成大量文字工作。但是,我們需要學(xué)習如何指示(也就是編程)計算機執(zhí)行我們所做的步驟。我們要會說一門計算機能懂的語言。幸運的是,學(xué)習編程語言不像學(xué)習日語或西班牙語等外語那么難。你甚至不需要懂太多數(shù)學(xué),除了加、減和乘。你只需下載一個叫Python的免費軟件,這個軟件我們將在下一章里講解。

第2章Pygame基礎(chǔ)知識本章主要內(nèi)容:下載和安裝Python;下載Pyperclip模塊;如何啟動IDLE;本書采用的格式;復(fù)制粘貼文本。開放社會的隱私需要密碼學(xué)。如果我說了什么,我希望聽到的人都是我想讓他們聽到的。如果我講話的內(nèi)容全世界都能知道,那我就沒隱私了?!狤ricHughes,《ACypherpunk’sManifesto》,1993(\h/cypherpunk)本章內(nèi)容很像InventYourOwnComputerGameswithPython的第1章。如果你已經(jīng)讀過那本書或者已經(jīng)安裝Python,你只需閱讀本章2.2節(jié)。2.1下載和安裝Python在開始編程之前,你需要安裝Python解析器軟件(這里你可能需要找人幫忙)。解析器是一個可以理解你用Python語言寫的指令的程序。如果沒有解析器,你的計算機不會理解這些指令(從現(xiàn)在起,我們會把“Python解析器”稱為“Python”)。因為我們將會使用Python語言寫程序,所以我們需要從Python編程語言的官方網(wǎng)站(\h)下載Python。安裝過程可能會有所不同,這取決于你的計算機的操作系統(tǒng)是Windows、OSX還是Linux發(fā)行版(如Ubuntu)。你可以在\h/installing找到安裝Python軟件的視頻。注意:請確保你安裝的是Python3,而不是Python2。本書的程序使用Python3,使用Python2運行它們將會出錯。因為這很重要,所以我畫了一個卡通企鵝來提醒你安裝Python3(見圖2-1),不要搞錯。圖2-1“請確保你安裝的是Python3,而不是Python2!”緊張的企鵝說道2.1.1Windows安裝步驟\h網(wǎng)頁左邊有一組鏈接。點擊Download鏈接進入下載頁面,找到Python3.3.0WindowsInstaller(“Windowsbinary–doesnotincludesource”)文件,單擊這個鏈接下載PythonforWindows(如果有比Python3.3.0更新的版本,請下載新版本)。雙擊你下載的python-3.3.0.msi文件啟動Python安裝程序(如果沒有啟動,嘗試單擊這個文件并選擇安裝)。一旦安裝程序啟動,單擊“下一步”按鈕,接受安裝程序里的選項,沒有什么需要修改。安裝結(jié)束時單擊“完成”。2.1.2OSX安裝步驟OSX的安裝過程與Windows的安裝過程類似。你要從Python網(wǎng)站下載的是.dmg(MacInstallerDiskImage)文件,而不是.msi文件。“DownloadPythonSoftware”頁面上包含“Python3.3.0MacOSX”字眼的就是這個文件的鏈接了。2.1.3Ubuntu和Linux安裝步驟如果你的操作系統(tǒng)是Ubuntu,打開終端窗口(單擊Application\Accessories\Terminal),輸入sudoapt-getinstallpython3.3,然后按下Enter鍵,就可以安裝Python了。你需要輸入根密碼才能安裝Python,請讓這臺計算機的所有者輸入這個密碼。你也需要安裝IDLE軟件。在終端窗口里輸入sudoapt-getinstallidle3。你也需要根密碼才能安裝IDLE。2.2下載pyperclip.py這本書里幾乎每個程序都會用到我寫的pyperclip.py自定義模塊。這個模塊提供的函數(shù)可以讓你的程序把文本復(fù)制到剪貼板。Python沒有附帶這個模塊,你可以從\h/pyperclip.py下載它。這個文件和你寫的Python程序文件必須放在相同的文件夾里(文件夾也叫目錄)。否則當你嘗試運行程序時將會看到如下錯誤消息:ImportError:Nomodulenamedpyperclip2.3啟動IDLE我們將會使用IDLE軟件輸入并運行程序。IDLE全稱是InteractiveDeveLopmentEnvironment。Python是解析和運行Python程序的軟件,IDLE則是用來輸入程序的軟件。如果你的操作系統(tǒng)是WindowsXP(見圖2-2),你應(yīng)該單擊“開始”按鈕,選擇Programs\Python3.3\IDLE(PythonGUI)來運行Python。對于WindowsVista或Windows7,單擊左下角的Windows按鈕,輸入“IDLE”,然后選擇“IDLE(PythonGUI)”。如果你的操作系統(tǒng)是MacOSX(見圖2-2),打開Finder窗口,單擊Applications,單擊Python3.3,然后單擊IDLE圖標就可以打開IDLE了。如果你的操作系統(tǒng)是Ubuntu或其他的Linux(見圖2-2),單擊Application\Accessories\Terminal,然后輸入idle3就可以打開IDLE了。你也可以單擊屏幕頂部的Applications,選擇Programming,然后選擇IDLE3。圖2-2在Windows(上)、OSX(中)和UbuntuLinux(下)上運行的IDLE顯示的窗口基本上都是空白的,除了下面這種文字:Python3.3.0(v3.3.0:bd8afb90ebf2,Sep292012,10:57:17)[MSCv.160064bit

(AMD64)]onwin32

Type"copyright","credits"or"license()"formoreinformation.

>>>首次啟動IDLE時顯示的窗口叫做交互式Shell。Shell是一個讓你向計算機輸入指令的程序。PythonShell讓你輸入Python指令,然后把這些指令發(fā)送給Python解析器軟件運行。我們向這個Shell輸入Python指令。由于這個Shell是交互式的,計算機會即時讀取并執(zhí)行我們的指令。2.4特色程序本書不同于其他編程書籍,它專注于完整程序的源代碼。這本書不是教你編程概念,讓你自己搞清楚如何創(chuàng)建你自己的程序,而是向你展示完整程序,并解釋它們是如何工作的。在閱讀本書時,你可以自己把本書的代碼輸入IDLE。你也可以從本書的網(wǎng)站下載源代碼文件。打開\h/hackingsource,按照指示下載源代碼文件。一般而言,你應(yīng)該從頭到尾閱讀。這些編程概念都是建立在前面章節(jié)基礎(chǔ)之上的。但是,Python是一門可讀性很強的語言,讀了開頭幾章之后,你就可以搞清楚這些代碼是做什么的了。如果你跳著讀,讀著讀著感到糊涂了,不妨回到前面的章節(jié)看看,或者把你的編程問題通過郵件地址al@發(fā)給我。2.5行號和空格當你自己輸入源代碼時,不要輸入每行開頭顯示的行號。例如,如果你在本書里看到這段代碼:1.number=random.randint(1,20)

2.spam=42

3.print('Helloworld!')你不需要輸入左邊的“1.”以及緊跟其后的空格。只要這樣輸入就行了:number=random.randint(1,20)

spam=42

print('Helloworld!')那些編號只是用來引用本書代碼的特定行。它們不是實際程序的一部分。除了這些行號,請確保輸入的代碼和看到的完全一致,包括字母大小寫。在Python里,HELLO、hello和Hello是三個不同的東西。注意,某些行不是從最左邊開始的,而是會縮進4個或8個空格。請確保在每行開始輸入正確數(shù)量的空格。因為IDLE里的每個字符都是等寬的,數(shù)一下上一行或者下一行的字符數(shù)就可以知道這行的空格數(shù)了。例如,你可以看到第二行縮進了4個空格,因為上一行對應(yīng)縮進空格的地方有4個字符(“whil”);第三行再縮進了4個空格(第三行的縮進空格上有“ifn”4個字符):whilespam<10:

ifnumber==42:

print('Hello')2.6本書的文本換行某些代碼太長,一行放不下,代碼的文字就會換行。當你在文件編輯器里輸入這種代碼時,把它們?nèi)糠旁谝恍?,中間沒有換行。你可以通過代碼左邊的行號來判斷是不是新的一行。下面的例子只有兩行代碼,但是第一行內(nèi)容太多,所以有自動換行:1.print('Thisisthefirstline!xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

xxxxxxxxxxxxxx’)

2.print('Thisisthesecondline!')2.7在線跟蹤程序跟蹤程序就是單步調(diào)試代碼,每次一行,就像計算機執(zhí)行它那樣。你可以訪問\hhttp://invpy.com/hackingtraces,查看本書每個程序的跟蹤結(jié)果。這個跟蹤Web頁面對每步跟蹤提供注解和有幫助的提醒,解釋這個程序在做什么,幫助你更好地理解這些程序為什么可以這樣工作。2.8使用在線比較工具檢查輸入的代碼雖然通過輸入這些程序的源代碼來學(xué)習Python很有幫助,但你可能不小心輸入錯誤導(dǎo)致程序崩潰。輸入錯誤的位置可能無法一眼看出。你可以復(fù)制粘貼你輸入的源代碼的文本到本書網(wǎng)站的在線比較工具。這個比較工具會顯示本書代碼和你輸入的代碼之間的差別。這是找出你的程序的輸入錯誤的一個簡單方法。這個在線比較工具在\h/hackingdiff。有一段關(guān)于如何使用這個比較工具的視頻也可以在本書的網(wǎng)站\h/hackingvideos上找到。2.9復(fù)制粘貼文本復(fù)制粘貼文本是一項有用的計算機技能,尤其對于本書而言,因為很多將要加密或解密的文本很長。你可以在本書的網(wǎng)站上找到文本的電子版,然后從你的瀏覽器復(fù)制文本粘貼到IDLE里,而不必手動輸入。要復(fù)制粘貼文本,你先在希望復(fù)制的文本上拖動鼠標,這會選中文本。接著,你點擊編輯\復(fù)制菜單項,或者在Windows上按下Ctrl-C(按住Ctrl鍵,然后按一次C,接著松開Ctrl鍵)。在Mac上,鍵盤快捷方式是Command-C(即?鍵)。這會把選中的文本復(fù)制到計算機內(nèi)存,或者說剪貼板。要粘貼剪貼板上的文本時,把鼠標指針移到你希望插入文本的地方,然后點擊編輯\粘貼菜單項,或者Ctrl-V或Command-V。粘貼和手動輸入復(fù)制到剪貼板的所有字符具有相同的效果。復(fù)制粘貼可以為你節(jié)約大量輸入時間,與輸入不同的是,它在產(chǎn)生文本的過程中不會出錯。值得注意的是,每次復(fù)制文本到剪貼板,之前在剪貼板上的文本就會消失。本書網(wǎng)站\h/copypaste上有一個關(guān)于復(fù)制粘貼的教程。2.10更多信息鏈接關(guān)于編程和密碼學(xué)還有很多可以學(xué)習的,但你不需要現(xiàn)在就把所有的都學(xué)了。有時候,你可能了解這些額外的細節(jié)和解釋,但如果我把它們都放到這本書里,就會增加很大篇幅。出版這么大的一本書會把大量容易著火的紙聚在一起,使之會變成一個火災(zāi)隱患。我在本書里包含了“更多信息”鏈接,你可以通過它們訪問本書的網(wǎng)站。你不需要閱讀這些額外的信息來理解本書的任何東西,但這些信息可以幫助你學(xué)習。這些鏈接以\h開頭(這是“InventwithPython”書籍網(wǎng)站的短網(wǎng)址)。即使本書不是危險的火災(zāi)隱患,也請無論如何不要點燃它。2.11編程和密碼學(xué)編程和密碼學(xué)是兩個獨立的技能,但一起學(xué)是很有用的,因為計算機做加密比人更快。比如說,以下是用簡單替換密碼的方式加密莎士比亞的《羅密歐與朱麗葉》之后的全部文本:如果你嘗試手工加密,每天工作12小時,周末休息,需要大約三周時間才能完成加密。或許你還會犯些錯誤。然后需要另外的三周時間才能解密這段加密的文本。你的計算機只需不到兩秒就能完全加密或解密整部戲劇。但你需要知道如何進行計算機編程才能加密。這就是本書的目的了。如果你會計算機編程,你也可以破譯別人加密并試圖保密的密文。學(xué)習計算機編程,學(xué)習成為一名黑客。讓我們開始吧!

第3章交互式Shell本章主要內(nèi)容:整數(shù)和浮點數(shù);表達式;值;運算符;計算表達式;把值存到變量里;重寫變量。在開始編寫加密程序之前,我們應(yīng)該先學(xué)一點基本編程概念,這些概念包括值、運算符、表達式和變量。如果你讀過InventYourOwnComputerGameswithPython或者已經(jīng)了解Python,你可以直接跳到第5章。我們先來學(xué)習如何使用Python的交互式Shell。你應(yīng)該在計算機旁邊讀這本書,這樣你就可以輸入代碼示例,親自看看它們做什么。3.1一些簡單的數(shù)學(xué)知識打開IDLE,你會看到交互式Shell以及>>>(我們稱之為提示符)旁邊閃爍的光標。這個交互式Shell可以當做計算器來用。在這個Shell里輸入2+2,然后按下鍵盤上的Enter鍵(在某些鍵盤上是Return鍵)。如圖3-1所示,計算機應(yīng)該返回數(shù)字4。圖3-1在Shell里輸入2+22+2本身并不是程序,而只是一條指令(我們現(xiàn)在只是在學(xué)基礎(chǔ)知識)。+號告訴計算機把數(shù)字2加上2。要做減法用?號,要做乘法用星號(*),要做除法用/(見表3-1)。表3-1Python里的各種數(shù)學(xué)運算符

運算符運算+加法-減法*乘法/除法以這種方式使用的話,+、-、*和/叫做運算符,因為它們告訴計算機對包圍它們的數(shù)字執(zhí)行某種運算。兩個2(或者其他數(shù)字)叫做值。3.2整數(shù)和浮點數(shù)在編程里,完整的數(shù)字(如4、0和99)叫做整數(shù)。帶有小數(shù)或小數(shù)點的數(shù)字(如3.5、42.1和5.0)是浮點數(shù)。在Python里,數(shù)字5是一個整數(shù),但如果我們把它寫成5.0,那它就是一個浮點數(shù)了。3.3表達式試著把這些數(shù)學(xué)問題輸入Shell,在每行后面按Enter鍵:2+2+2+2+2

8*6

10-5+6

2+2圖3-2展示了在你輸入上面那些指令之后交互式Shell的樣子。這些數(shù)學(xué)問題叫做表達式(見圖3-3)。計算機可以在數(shù)秒之內(nèi)求解數(shù)百萬個這樣的問題。表達式由值(數(shù)字)和連接它們的運算符(數(shù)學(xué)符號)組成。整數(shù)和這些運算符之間可以有任意空格。但請確??偸菑男惺组_始,前面沒有空格。圖3-2輸入指令后IDLE窗口的樣子圖3-3表達式由值(如2)運算符(如+)組成和3.4運算符順序你可能記得數(shù)學(xué)課上的“運算符順序”。如乘法的優(yōu)先級比加法高。Python的*和+運算符也是這樣。如果一個表達式同時包含*和+運算符,*運算符會先計算。在交互式Shell里輸入以下表達式:>>>2+4*3+1

15

>>>因為*運算符會先計算,所以2+4*3+1會得到2+12+1,然后得到15。而不是先得到6*3+1,再得到18+1,最后得到19。不過,你可以使用圓括號來改變運算符的優(yōu)先級。在交互式Shell里輸入以下表達式:>>>(2+4)*(3+1)

24

>>>3.5計算表達式當計算機處理表達式10+5并得到15這個值時,我們說它計算了這個表達式。計算一個表達式會把這個表達式約簡成單個值,就像求解一個數(shù)學(xué)問題會把這個問題約簡成單個數(shù)字:答案。計算一個表達式(換句話說,把它約簡)總會得到單個值。10+5和10+3+2這兩個表達式的值一樣,因為計算它們都得到15。即使單個值也被看做表達式:計算15這個表達式得到15這個值。然而,如果你只在交互式Shell里輸入5+,你會得到一個錯誤消息:>>>5+

SyntaxError:invalidsyntax出現(xiàn)這個錯誤是因為5+不是一個表達式。表達式包含的值由運算符連接,在Python語言里,+運算符期望連接兩個值。我們在“5+”里只給它一個值,這就是為什么會出現(xiàn)錯誤信息。語法錯誤意味著計算機不懂你給它的指令,因為你輸入有誤。這看起來似乎不重要,但很多時候,計算機編程不只是告訴計算機做什么,還要確切地知道如何告訴計算機去做。3.6錯誤是可以接受的犯錯是完全可以接受的!你輸入有問題的代碼會導(dǎo)致錯誤,但不會弄壞你的計算機。如果你輸入的代碼導(dǎo)致了錯誤,Python只會提示有錯誤,然后再次顯示>>>提示符。你可以在交互式Shell里繼續(xù)輸入新代碼。直到你積累了更多編程經(jīng)驗,這些錯誤消息才會對你有很大幫助。你總是可以通過Google搜索某個錯誤消息的文字,找到解釋這個錯誤的網(wǎng)頁。你也可以到\h/errors查看常見的Python錯誤消息列表以及它們的含義。3.7A組練習你可以在\h/hackingpractice3A找到練習。3.8每個值都有一個數(shù)據(jù)類型“整數(shù)”和“浮點數(shù)”被稱為數(shù)據(jù)類型。每個值都有一個數(shù)據(jù)類型。42這個值是一個整數(shù)數(shù)據(jù)類型的值,我們會說42是一個int。7.5這個值是一個浮點數(shù)數(shù)據(jù)類型的值,我們會說7.5是一個float。我們還會學(xué)到其他數(shù)據(jù)類型(如下一章的字符串),但現(xiàn)在只需記住,任何時候我們提到“值”,那個值都會是某種數(shù)據(jù)類型。指出這個數(shù)據(jù)類型通常也很容易,只需看看這個值是怎么打出來就可以了。整數(shù)是不帶小數(shù)點的數(shù)字,浮點數(shù)是帶有小數(shù)點的數(shù)字。因此,42是一個整數(shù),但42.0是一個浮點數(shù)。3.9通過賦值語句把值存到變量里程序會經(jīng)常需要保存計算表達式得到的值,以便后面可以使用。我們可以把值存到變量里。變量可以看做裝有值的盒子。你可以通過=符號(稱作賦值運算符)把值存到變量里。比如說,要把15這個值存到一個名為“spam”的變量里,在Shell里輸入spam=15:>>>spam=15

>>>你可以把這個變量想象成一個盒子,里面裝有15這個值(如圖3-4所示)。變量名“spam”是盒子上的標簽(這樣我們就可以把一個變量和另一個變量區(qū)分開來),存到里面的值就像這個盒子里面的一張小便簽。圖3-4變量就像帶有名字的盒子,里面裝著值當你按下Enter鍵時,你不會看到任何東西,除了一個空行。除非你看到一個錯誤消息,否則你可以假設(shè)這條指令已經(jīng)成功執(zhí)行了。下一個>>>提示符會顯示,以便你輸入下一條指令。帶有=賦值運算符的指令(稱作賦值語句)創(chuàng)建spam這個變量,并把15這個值存到里面。和表達式不同,語句是不會算得任何值的指令,它們只執(zhí)行某個操作。這正是為什么Shell里的下一行上沒有顯示值的原因?;蛟S你很難搞清楚哪些是表達式,哪些是語句。你只需記住,如果計算一條Python指令得到單個值,這就是表達式。否則,這是語句。賦值語句由變量、=運算符和表達式組成(見圖3-5)。計算這個表達式得到的值會存到這個變量里(15這個值本身就是一個表達式,計算它會得到15)。圖3-5賦值語句的各個部分記住,變量保存單個值,而不是表達式。如果我們有spam=10+5這個語句,那么10+5這個表達式會先算得15,接著,15這個值會存到spam這個變量里。變量會在你首次通過賦值語句把一個值存到里面時創(chuàng)建出來。>>>spam=15

>>>spam

15

>>>有趣的事情來了?,F(xiàn)在,如果我們在Shell里輸入spam+5,我們會得到整數(shù)20:>>>spam=15

>>>spam+5

20

>>>這看起來可能有點奇怪,但當我們記起曾把spam的值設(shè)為15,就會發(fā)現(xiàn)它是有意義的了。因為我們已把spam這個變量的值設(shè)為15,計算spam+5這個表達式會得到15+5這個表達式,然后得到20。計算表達式里的變量名會得到存到那個變量里的值。3.10重寫變量我們可以通過輸入另一個賦值語句改變存到變量里的值。你可以試一下這樣做:>>>spam=15

>>>spam+5

20

>>>spam=3

>>>spam+5

8

>>>我們第一次輸入spam+5時,計算這個表達式會得到20,因為我們在spam這個變量里保存了15這個值。但當我們輸入spam=3時,15這個值被3這個值重寫了(也就是替換了)?,F(xiàn)在,當我們輸入spam+5時,計算這個表達式會得到8,因為計算spam+5現(xiàn)在會得到3+5。spam里的舊值已經(jīng)沒有了。要知道一個變量的當前值是什么,在Shell里輸入這個變量名就可以了。>>>spam=15

>>>spam

15之所以可以這樣,是因為變量本身也是一個表達式,計算之后會得到存到這個變量里的值。這就像一個值本身也是一個表達式,計算之后得到它本身:>>>15

15我們甚至可以用spam這個變量的值來給spam賦一個新值:>>>spam=15

>>>spam=spam+5

20

>>>spam=spam+5這個賦值語句就像是在說:“spam這個變量的新值將是spam的現(xiàn)值加上5?!庇涀?,=符號左邊的變量會被賦予右邊表達式計算之后得到的值。我們可以多次把spam的值加5:>>>spam=15

>>>spam=spam+5

>>>spam=spam+5

>>>spam=spam+5

>>>spam

30

>>>3.11使用多個變量根據(jù)你的需要,你的程序可以有很多個變量。比如說,我們可以給eggs和fizz兩個變量賦予不同的值:>>>fizz=10

>>>eggs=15現(xiàn)在,如圖3-6所示,fizz這個變量里有10,eggs這個變量里有15。圖3-6fizz和eggs兩個變量里都存有值我們嘗試給spam這個變量賦一個新值。在Shell里輸入spam=fizz+eggs,然后在Shell里輸入spam查看spam的新值。在交互式Shell里輸入以下代碼:>>>fizz=10

>>>eggs=15

>>>spam=fizz+eggs

>>>spam

25

>>>spam的值現(xiàn)在是25,因為當我們把fizz和eggs加起來時,我們加的是fizz和eggs里保存的值。3.12變量名計算機不在乎你怎么命名你的變量,但你應(yīng)該在乎。如果給變量的命名能夠反映它們包含的數(shù)據(jù)的類型,可以讓人更容易理解程序做什么。我們不用name來命名變量,而用abrahamLincoln或monkey,計算機運行程序的結(jié)果是一樣的(只要你始終使用abrahamLincoln或monkey)。變量名(以及Python里的其他東西)是區(qū)分大小寫的。區(qū)分大小寫意味著相同的變量名不同的大小寫會被認為是完全不同的變量。因此,在Python里,spam、SPAM、Spam和sPAM會被認為是4個不同的變量,它們每個都能包含它們自己不同的值。在程序里使用不同大小寫的變量是不好的。如果你把你的名字存到name這個變量里,把你的姓氏存到NAME這個變量里,幾周之后重讀代碼時可能會感到混亂。name表示名字,NAME表示姓氏,還是反過來?如果你不小心交換了name和NAME兩個變量,你的程序仍然會運行(也就是沒有任何“語法”錯誤),但運行結(jié)果是錯誤的。代碼里的這種瑕疵叫做缺陷(bug)。很多時候,編程不只是寫代碼,還要修復(fù)缺陷。3.13駝峰式大小寫如果變量名包含超過一個單詞,使用大寫字母是有幫助的。如果你把“你吃了什么早餐”以字符串的形式存到一個變量里,則whatIHadForBreakfast這個變量名比whatihadforbreakfast更容易讀。這就是駝峰式大小寫(camelcase),因為大小寫的起伏像駱駝的駝峰。這是Python編程慣例(也就是可選的標準做事方式),雖然todaysBreakfast這種簡單的寫法可能更好。讓變量名的第一個單詞后的每個單詞的首字母大寫會使程序更加可讀。3.14B組練習你可以在\h/hackingpractice3B找到練習。3.15小結(jié)很快。但是,為了破譯密碼,我們需要再學(xué)一些基本編程概念。在開始編寫加密程序之前,我們不需要學(xué)很多東西,但還有一章編程內(nèi)容是我們需要講的。你在本章里學(xué)到在交互式Shell里寫Python指令的基礎(chǔ)知識。Python需要你精確地告訴它要做什么,因為計算機沒有常識,只懂很簡單的指令。你了解到Python可以計算表達式(即把表達式約簡成單個值),表達式由值(如2或5)和運算符(如+或-)構(gòu)成。你也了解到可以把值存到變量里,這樣你的程序就能記住它們,以便日后使用。交互式Shell是學(xué)習Python指令的好幫手,因為它讓你每次輸入一條指令然后看結(jié)果。在下一章里,我們會創(chuàng)建包含很多指令的程序,這些指令會按順序執(zhí)行,而不是每次一條。我們將會探討更多基本概念,你也將會編寫你的第一個程序!

第4章字符串和寫程序本章主要內(nèi)容:字符串;字符串連接和復(fù)制;使用IDLE寫源代碼;在IDLE里保存并運行程序;print()函數(shù);input()函數(shù);注釋。整數(shù)和數(shù)學(xué)的內(nèi)容暫時到此為止。Python并非只是一個計算器。在本章里,我們將學(xué)習如何在變量里保存文本,把文本連接起來,以及在屏幕上顯示文本。我們也將創(chuàng)建我們的第一個程序,它會通過“HelloWorld!”這句話向用戶問好,并讓用戶輸入名字。4.1字符串在Python里,我們使用的小塊文本稱為字符串值(或者簡單地稱為字符串)。我們的所有加密法和破譯程序都是通過處理字符串值,把像“Oneifbyland,twoifbyspace”這樣的明文轉(zhuǎn)換成“Tqekgimnpqv,jstkgimoapxe.”這樣的密文。明文和密文在我們的程序里是用字符串值來表示的,Python代碼可以通過多種方式操作這些值。我們可以把字符串值保存在變量里,就像整數(shù)和浮點數(shù)值那樣。當我們輸入字符串時,我們把它們放在兩個單引號(')之間,表示字符串的起止。在交互式Shell里輸入這行代碼:>>>spam='hello'

>>>單引號并非字符串值的一部分。Python知道'hello'是一個字符串,spam是一個變量,因為字符串是由單引號包圍的,而變量名不是。如果你在Shell里輸入spam,你應(yīng)該看到spam變量的內(nèi)容('hello'字符串)。這是因為Python會計算變量,并得到保存在它里面的值:在這里是'hello'這個字符串。>>>spam='hello'

>>>spam

'hello'

>>>字符串里可以放置任何鍵盤字符(稍后我們將會討論特殊的“轉(zhuǎn)義字符”)。這些都是字符串的示例:>>>'hello'

'hello'

>>>'Hithere!'

'Hithere!’

>>>'KITTENS'

'KITTENS'

>>>''

''

>>>'7apples,14oranges,3lemons'

'7apples,14oranges,3lemons'

>>>'Anythingnotpertainingtoelephantsisirrelephant.''Anythingnotpertainingtoelephantsisirrelephant.'

>>>'O*&#wY%*&OcfsdYO*&gfC%YO*&%3yc8r2''O*&#wY%*&OcfsdYO*&gfC%YO*&%3yc8r2'值得注意的是

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論