版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
chap.1概述網(wǎng)絡(luò)信息安全全套可編輯PPT課件網(wǎng)絡(luò)信息安全概述Python語言簡(jiǎn)介
Python安全編程本章內(nèi)容要點(diǎn)1.1網(wǎng)絡(luò)信息安全概述
1.信息安全定義信息安全是指計(jì)算機(jī)信息系統(tǒng)的硬件、軟件、網(wǎng)絡(luò)及其系統(tǒng)中的數(shù)據(jù)受到保護(hù),不受偶然的或者惡意的原因而遭到破壞、更改、泄露,系統(tǒng)連續(xù)可靠正常地運(yùn)行,確保信息服務(wù)不中斷。所謂網(wǎng)絡(luò)信息安全就是信息安全的一個(gè)子集或是專門話題,泛指圍繞著與通信/計(jì)算機(jī)網(wǎng)絡(luò)相關(guān)的信息安全問題展開的防護(hù)行為。網(wǎng)絡(luò)信息安全絕非一個(gè)單純、簡(jiǎn)單的問題,遍布于網(wǎng)絡(luò)空間的各個(gè)部位,各個(gè)層面?zhèn)戎夭煌?。通常,將網(wǎng)絡(luò)空間領(lǐng)域可劃分為物理域、信息域、認(rèn)知域和社會(huì)域,從網(wǎng)絡(luò)空間安全的角度來看,物理域和信息域主要關(guān)注以信息技術(shù)為核心的網(wǎng)絡(luò)基礎(chǔ)設(shè)施安全及網(wǎng)絡(luò)信息通信安全,而認(rèn)知域和社會(huì)域則更關(guān)注以人為核心的認(rèn)知文化等精神層面以及個(gè)人與集體相互作用的社會(huì)層面。因此,要確保網(wǎng)絡(luò)信息安全,就必須顧及到以上所有層面的安全,這顯然是一個(gè)復(fù)雜的系統(tǒng)工程。2.信息安全特征要理解網(wǎng)絡(luò)信息安全,必須了解信息的基本安全特征。信息安全一般應(yīng)具備五個(gè)特征(機(jī)密性、完整性、可用性、可控性、不可否認(rèn)性(可審查性)),具體如圖1-1所示。當(dāng)信息及網(wǎng)絡(luò)信息系統(tǒng)同時(shí)滿足以上五個(gè)特征的安全要求,就可以認(rèn)為是它們是安全的。信息安全特征的狀態(tài)并不是一成不變的,而是隨著安全對(duì)抗雙方的此消彼長(zhǎng)不斷發(fā)生轉(zhuǎn)化3.安全理論技術(shù)
網(wǎng)絡(luò)信息安全理論所涉及的領(lǐng)域知識(shí)非常寬泛。宏觀上講,只要是與信息安全相關(guān)的技術(shù)都屬于這個(gè)范疇,除了數(shù)學(xué)、通信、計(jì)算機(jī)等自然科學(xué)外,還涉及法律、心理學(xué)等社會(huì)科學(xué)。這些科學(xué)指導(dǎo)下的技術(shù)是達(dá)成網(wǎng)絡(luò)安全的主要手段,具體來講,在常見的信息系統(tǒng)中,可以采用的信息安全技術(shù)主要包括:密碼技術(shù)、身份驗(yàn)證、訪問控制、審計(jì)追蹤、安全協(xié)議等。所謂信息安全程序設(shè)計(jì)技術(shù)就是基于計(jì)算機(jī)語言實(shí)現(xiàn)特定安全功能的編程活動(dòng)。目前,幾乎絕大多數(shù)編程語言均可以不同程度實(shí)現(xiàn)面向安全目的的開發(fā),實(shí)現(xiàn)效果也不盡相同,1.3.2節(jié)將結(jié)合Python語言的特點(diǎn)介紹其安全編程實(shí)現(xiàn)的思路。由于網(wǎng)絡(luò)信息安全技術(shù)是一個(gè)開放的話題,隨著科學(xué)技術(shù)的不斷發(fā)展,還有更多、更豐富的技術(shù)加入進(jìn)來,不斷形成“物理”(技術(shù)組合)和“化學(xué)”(交叉產(chǎn)生新質(zhì)技術(shù))變化,衍生出更新的技術(shù)。1.2Python語言簡(jiǎn)介1.2.1Python發(fā)展回顧
Python語言誕生于20世紀(jì)90年代初,目前已被廣泛應(yīng)用計(jì)算機(jī)程序設(shè)計(jì)的各個(gè)領(lǐng)域之中。Python的創(chuàng)始人是荷蘭人吉多·范羅蘇姆(GuidovanRossum)。早在1989年,Guido在阿姆斯特丹,為了打發(fā)圣誕節(jié)的無趣,決心開發(fā)一個(gè)新的腳本解釋程序,并作為ABC語言的一種繼承。這種編程語言之所以選中Python(大蟒蛇的意思)作為名字,主要是取自于Guido所喜愛的英國(guó)20世紀(jì)70年代首播的電視喜劇《蒙提.派森的飛行馬戲團(tuán)》(MontyPython'sFlyingCircus)的劇名。
Python在發(fā)展初期并未引起人們的注意,甚至到了Python2于2000年10月16日發(fā)布時(shí),也沒有引起人們的熱捧。但是,自從2004年以后這一情況開始發(fā)生逆轉(zhuǎn)。當(dāng)Python3于2008年12月3日發(fā)布時(shí),Python迅速得到普及,并于2011年1月正式被TIOBE編程語言排行榜評(píng)為2010年度語言。正如本書開篇所述,到了2020年10月,經(jīng)過29年的發(fā)展,Python首次超過了Java,成為全球第二受歡迎的編程語言,距離首位的C語言也僅僅只相差4個(gè)百分點(diǎn)。這也是Tiobe指數(shù)近20年的歷史上,首次出現(xiàn)Java和C語言不是兩大頂級(jí)語言的情況。顯而易見,現(xiàn)在Python已經(jīng)步入最受歡迎的程序設(shè)計(jì)語言的行列。Python語言的成功源于其簡(jiǎn)潔性、易讀性以及可擴(kuò)展性。尤其是,在國(guó)外用Python做科學(xué)計(jì)算的研究機(jī)構(gòu)日益增多,一些知名大學(xué)已經(jīng)采用Python來教授程序設(shè)計(jì)課程,使其得以快速普及開來。此外,越來越多的開源科學(xué)計(jì)算軟件包,都提供了Python的調(diào)用接口,例如:著名的計(jì)算機(jī)視覺庫(kù)OpenCV、三維可視化庫(kù)VTK、醫(yī)學(xué)圖像處理庫(kù)ITK等等,這也加速了Python的普及。目前基于Python專用的科學(xué)計(jì)算擴(kuò)展庫(kù)則更是不勝枚舉,其中包括十分經(jīng)典的科學(xué)計(jì)算擴(kuò)展庫(kù):NumPy、SciPy和matplotlib等,均可為Python提供了快速數(shù)組處理、數(shù)值運(yùn)算以及繪圖功能。
Python編程的前景也被認(rèn)為是十分廣闊的,Python語言及其眾多的擴(kuò)展庫(kù)所構(gòu)成的開發(fā)生態(tài),十分適合工程技術(shù)、科研人員處理實(shí)驗(yàn)數(shù)據(jù)、制作圖表,甚至開發(fā)科學(xué)計(jì)算應(yīng)用程序。1.2.2Python工作原理
1.Python工作過程
Python是一種解釋型語言,依賴解釋器工作。解釋器工作于程序代碼與計(jì)算機(jī)硬件之間的軟件邏輯層。Python解釋器的工作模式如圖1-2所示。由圖1-2可知,當(dāng)寫好Python代碼后,將其導(dǎo)入Python解釋器后,將會(huì)執(zhí)行兩個(gè)步驟:第一步:把源代碼編譯成字節(jié)碼編譯后的字節(jié)碼是特定于Python的一種表現(xiàn)形式,它不是二進(jìn)制的機(jī)器碼,需要進(jìn)一步編譯才能被機(jī)器執(zhí)行,這也是Python代碼無法運(yùn)行的像C/C++一樣快的原因。如果Python進(jìn)程在機(jī)器上擁有寫入權(quán)限,那么它將把程序的字節(jié)碼保存為一個(gè)以.pyc為擴(kuò)展名的文件,如果Python無法在機(jī)器上寫入字節(jié)碼,那么字節(jié)碼將會(huì)在內(nèi)存中生成并在程序結(jié)束時(shí)自動(dòng)丟棄。在構(gòu)建程序的時(shí)候,若給Python賦予計(jì)算機(jī)的寫權(quán)限,這樣只要源代碼沒有改變,生成的.pyc文件就可以重復(fù)利用,從而提高執(zhí)行效率。第二步:把編譯好的字節(jié)碼轉(zhuǎn)發(fā)到PVM中置于運(yùn)行時(shí)狀態(tài)
PVM是PythonVirtualMachine的簡(jiǎn)稱,它是Python的運(yùn)行引擎,因此是Python系統(tǒng)的一部分,它迭代運(yùn)行上步編譯形成的字節(jié)碼指令,是一個(gè)大循環(huán)、一個(gè)接一個(gè)地完成字節(jié)碼操作。在Python中PVM的概念與解釋器通常不做區(qū)分,并有多種備選項(xiàng)。基于上述這種工作機(jī)制,就不難理解Python之所以能夠體現(xiàn)出的簡(jiǎn)單、便捷特性。2.Python解釋器實(shí)現(xiàn)方式
Python解釋器實(shí)現(xiàn)不止一種,常用的有:CPython、AnacondaPython、Jython、IronPython和PyPy等。
(1)CPythonCPython是一種標(biāo)準(zhǔn)實(shí)現(xiàn),是由C語言編寫的,它是大多數(shù)Linux和MacOS機(jī)器預(yù)裝的Python解釋器,也是所有Python解釋器中運(yùn)行較快、最完整、最健全的。
(2)AnacondaPythonAnaconda源自Anaconda公司設(shè)計(jì)(原名為ContinuumAnalytics),其設(shè)計(jì)目標(biāo)在于服務(wù)那些需要由商業(yè)供應(yīng)商提供支持且具備企業(yè)支持服務(wù)的Python開發(fā)者。AnacondaPython的主要用例包括:數(shù)學(xué)、統(tǒng)計(jì)學(xué)、工程、數(shù)據(jù)分析、機(jī)器學(xué)習(xí)以及其他相關(guān)應(yīng)用。
(3)JythonJython是一種Python語言的替代實(shí)現(xiàn)方式,其目的是為了與Java編程語言集成,Jython包含了Java類,這些類編譯Python源代碼、形成Java字節(jié)碼,并將得到的字節(jié)碼映射到Java虛擬機(jī)(JVM)上。因?yàn)镴ython要比CPython慢而且也不夠健壯,它往往看作是一個(gè)主要面向?qū)ふ襃ava代碼前端腳本語言的Java開發(fā)者的工具。(4)IronPythonIronPython設(shè)計(jì)的目的是讓Python程序可以與Windows平臺(tái)上的.NET框架以及與之對(duì)應(yīng)的Linux的上開源的Mono編寫成的應(yīng)用集成。
(5)PyPyPyPy屬于CPython解釋器的替代品,其利用即時(shí)(JIT)編譯以加速Python程序的執(zhí)行。根據(jù)實(shí)際執(zhí)行的任務(wù)情況,其性能提升可能非常顯著。PyPyJIT將Python代碼編譯為機(jī)器語言,從而帶來平均7.7倍于CPython的運(yùn)行速度。在某些特定任務(wù)中,其提速效果能夠達(dá)到50倍。PyPy一般更適用于處理“純”Python應(yīng)用程序。由于PyPy會(huì)模擬CPython的原生二進(jìn)制接口,因此在處理包含C庫(kù)接口的Python軟件包時(shí),其表現(xiàn)并不理想。本書主要采用的是Cpython和AnacondaPython解釋器(安裝詳見2.1.2節(jié))1.2.3Python特點(diǎn)分析
Python作為工程實(shí)踐的語言,選擇使用之前需要了解其優(yōu)缺點(diǎn)。1.Python的優(yōu)點(diǎn)Python的優(yōu)點(diǎn)包括以下幾個(gè)方面。
(1)簡(jiǎn)單:Python遵循“簡(jiǎn)單、優(yōu)雅、明確”的設(shè)計(jì)哲學(xué),并且各個(gè)版本能夠始終如一的秉承這一傳統(tǒng)。
(2)高級(jí):Python是一種高級(jí)語言,相對(duì)于C語言犧牲了性能而提升了編程人員的效率。它使得程序員可以不用關(guān)注底層細(xì)節(jié),把精力全部放在編程上。
(3)面向?qū)ο螅篜ython既支持面向過程,也支持面向?qū)ο蟆?/p>
(4)可擴(kuò)展:Python可以通過C、C++語言為python編寫擴(kuò)充模塊。(5)免費(fèi)和開源:Python是FLOSS(自由/開放源碼軟件)之一,允許自由的發(fā)布軟件的備份、閱讀和修改其源代碼、將其一部分自由地用于新的自由軟件中。
(6)邊編譯邊執(zhí)行:Python是解釋型語言,支持邊編譯邊執(zhí)行。
(7)可移植:Python能運(yùn)行在不同的平臺(tái)上。
(8)豐富的庫(kù):Python擁有許多功能豐富的庫(kù),尤其是眾多的第三方庫(kù)。
(9)可嵌入性:Python可以嵌入到C、C++等多種其它語言中,為其提供腳本功能。2.Python的缺點(diǎn)
Python的缺點(diǎn)是必須正視的問題,要充分考慮設(shè)計(jì)的需求趨利避害,具體包括如下方面。
(1)速度慢:Python程序比Java、C、C++等程序的運(yùn)行效率都要慢。
(2)源代碼加密困難:不像編譯型語言的源程序會(huì)被編譯成目標(biāo)程序,Python直接運(yùn)行源程序,因此對(duì)源代碼加密比較困難。
(3)不支持底層操作:進(jìn)行計(jì)算機(jī)底層操作的支持能力有限,需要借助于其它語言或第三方庫(kù)(Ctypes等)。
Python的缺點(diǎn)也是其設(shè)計(jì)者力求改進(jìn)的重要方向,相信在未來會(huì)有很大程度的改進(jìn)。3.Python安全編程優(yōu)勢(shì)
綜合評(píng)判Python,不難發(fā)現(xiàn)這種語言的優(yōu)缺點(diǎn)都很明顯,但是其在安全編程的優(yōu)勢(shì)還是被廣泛接受的,究其原因可以概括為以下幾個(gè)方面:
(1)綜合能力良好網(wǎng)絡(luò)安全本身就是一項(xiàng)綜合、復(fù)雜體系性工作,涉及到幾乎信息可達(dá)的所有位置,因此想要對(duì)信息安全進(jìn)行全面實(shí)現(xiàn),就需要一種綜合性強(qiáng)的語言,而Python因其能夠整合不同的工具而被喻為“膠水語言”,且包裝能力、可組合性、可嵌入性都很好,可以把各種復(fù)雜性包裝在Python模塊里,完全匹配這種需求。進(jìn)一步,由于在Python內(nèi)部采用虛擬環(huán)境技術(shù),對(duì)開發(fā)項(xiàng)目進(jìn)行了沙箱隔離,也排除了相同軟件不同版本沖突的困擾,工具綜合的考慮也更加全面。
(2)數(shù)據(jù)分析優(yōu)勢(shì)顯著
Python對(duì)于密集型的信息安全數(shù)據(jù)處理大有裨益。Python在數(shù)據(jù)分析和交互、探索性計(jì)算以及數(shù)據(jù)可視化等方面都顯得比較活躍,這就是Python作為數(shù)據(jù)分析的原因之一,Python擁有numpy、matplotlib、scikit-learn、pandas、ipython等工具在科學(xué)計(jì)算方面十分有優(yōu)勢(shì),尤其是pandas,在處理中型數(shù)據(jù)方面可以說是無與倫比的,已經(jīng)成為數(shù)據(jù)分析中流砥柱的分析工具。(3)智能計(jì)算能力突出面對(duì)未來信息安全涌現(xiàn)的新問題,諸如:認(rèn)證識(shí)別的模式匹配、入侵檢測(cè)的特征分析、自動(dòng)化漏洞挖掘的規(guī)則推理、圖像文本數(shù)據(jù)的語義理解等核心問題,已經(jīng)不是單純依靠一門語言就可以解決的問題了,都需要智能技術(shù)的支持。展望智能技術(shù)的發(fā)展未來,根據(jù)李開復(fù)博士提出的“AI紅利三段論”,認(rèn)為未來的智能必將是“大眾智能”,并預(yù)測(cè)95%甚至更多的AI技術(shù)人員,都將是不具有非常專業(yè)編程能力的AI工程師、應(yīng)用工程師和AI工具用戶。正因?yàn)槿绱耍琍ython所秉承的“做到簡(jiǎn)單而嚴(yán)謹(jǐn)、易用而專業(yè)”宗旨,完全迎合了這種發(fā)展趨勢(shì)。目前,人們已經(jīng)可以清晰地看出Python作為智能技術(shù)天選之子的未來。因此,信息安全選擇Python語言,倒不如說是信息安全對(duì)未來智能時(shí)代的擁抱。其實(shí),Python在很早以前就已經(jīng)被黑客所青睞。很多知名的黑客工具、入侵系統(tǒng)框架都是由Python開發(fā)的,比如:Metasploit、Fuzzing框架Sulley、交互式數(shù)據(jù)包處理程序Scapy等,基于這些框架黑客還可以很容易地?cái)U(kuò)展出自己的工具。之所以安全人員開始選擇Python,就好像戰(zhàn)場(chǎng)上的戰(zhàn)士丟掉自己手中尚好的武器,而撿起敵人丟棄的武器,就是對(duì)敵人“武器”最好的肯定。1.3Python安全編程1.3.1安全應(yīng)用程序分類
在進(jìn)行安全編程之前,需要明確安全應(yīng)用的分類。按照信息安全特征,目前常見的安全應(yīng)用程序可以5劃分五類。(1)機(jī)密性應(yīng)用,包括:密碼應(yīng)用(加密)、數(shù)字水?。ㄩ撓峦ㄐ艖?yīng)用),這種應(yīng)用有時(shí)處于安全體系的最內(nèi)核,因此需要較高的操作權(quán)限。
(2)完整性應(yīng)用,包括:密碼應(yīng)用(數(shù)字簽名、哈希)、數(shù)字水?。ㄒ姿樾停?,由于這種應(yīng)用會(huì)將數(shù)據(jù)暴露于開放環(huán)境,因此并不需要內(nèi)核級(jí)權(quán)限。
(3)可用性應(yīng)用,包括:網(wǎng)絡(luò)掃描、滲透測(cè)試、防病毒、主機(jī)安全管理,對(duì)于確保系統(tǒng)核心可用性的應(yīng)用,需要內(nèi)核權(quán)限。
(4)不可抵賴性應(yīng)用,包括:密碼應(yīng)用(數(shù)字簽名)、網(wǎng)絡(luò)實(shí)體識(shí)別與認(rèn)證、網(wǎng)絡(luò)安全取證、區(qū)塊鏈,除了對(duì)核心數(shù)據(jù)的保護(hù)外,不必需內(nèi)核權(quán)限。
(5)可控性應(yīng)用,包括:入侵檢測(cè)、防火墻、網(wǎng)閘、漏洞挖掘、內(nèi)容安全,對(duì)于底層的保護(hù)需要內(nèi)核權(quán)限。上述分類之間并不嚴(yán)格獨(dú)立,存在交叉、聯(lián)合。1.3.2Python安全編程思路
Python安全編程涉及信息安全的信息域、認(rèn)知域和社會(huì)域,圖1-3是現(xiàn)有安全技術(shù)在計(jì)算機(jī)網(wǎng)絡(luò)系統(tǒng)分布的示意圖,包括了:密碼技術(shù)、認(rèn)證與識(shí)別、VPN、數(shù)字水印、區(qū)塊鏈、網(wǎng)絡(luò)掃描與流量分析、防火墻、入侵檢測(cè)、漏洞挖掘、主機(jī)安全、安全審計(jì)與取證、內(nèi)容安全、滲透測(cè)試等多項(xiàng),Python可以直接或間接地實(shí)現(xiàn)其中的絕大部分。在Windows平臺(tái)上,這些安全應(yīng)用的Python開發(fā)可以分別采用如下方法。1.密碼技術(shù)密碼是信息安全系統(tǒng)最內(nèi)核的保護(hù)。由于Python在數(shù)據(jù)操作方面簡(jiǎn)潔明快,且并不失強(qiáng)大,所以幾乎所有的密碼算法都可以在Python中的以實(shí)現(xiàn)。無論是古典密碼算法,還是基于現(xiàn)代數(shù)學(xué)難題的公鑰密碼,都有Python實(shí)現(xiàn)方案,常見的DES、RSA、哈希方法實(shí)現(xiàn)如下。
(1)利用pyDes模塊可以提供DES加密等。
(2)利用Crypto.PublicKey.RSA和RSA模塊提供生成公鑰、私鑰和RSA加密的功能。
(3)利用Hashlib模塊可以提供常用的摘要算法如MD5、SHA1等。密碼應(yīng)用開發(fā)本書將在第三章進(jìn)行介紹。由于Python是一種解釋型語言,因此運(yùn)行效率較差,雖然可以實(shí)現(xiàn)密碼應(yīng)用,但是必須對(duì)工程工作的實(shí)時(shí)性要求進(jìn)行評(píng)估(如流密碼)。并且,如果實(shí)現(xiàn)內(nèi)核層加密,還需要借助于擴(kuò)展和嵌入方法。2.區(qū)塊鏈
區(qū)塊鏈?zhǔn)墙┠陙砼d起的新的信息模型和網(wǎng)絡(luò)交易系統(tǒng)技術(shù),具有可以改變?nèi)祟惿鐣?huì)結(jié)構(gòu)的巨大潛力。Python可以實(shí)現(xiàn)從區(qū)塊、挖礦、錢包、通信到網(wǎng)站等所有區(qū)塊鏈需求,開發(fā)方法如下。
(1)利用hashlib模塊的SHA256實(shí)現(xiàn)工作量證明和挖礦。
(2)利用json和hashlib模塊實(shí)現(xiàn)交易與區(qū)塊的記錄。
(3)利用rpc模塊實(shí)現(xiàn)網(wǎng)絡(luò)通信和節(jié)點(diǎn)功能。本書將在第四章進(jìn)行介紹。3.數(shù)字水印版權(quán)保護(hù)是信息隱藏技術(shù)中的水印技術(shù)所試圖解決的一個(gè)重要問題,這與密碼學(xué)是一個(gè)完全不同的范疇。水印總體可以分為空間域和變換域的算法,Python通過第三方的工具庫(kù)可以實(shí)現(xiàn)LSB、DCT、DWT等圖像變換處理,漸次實(shí)現(xiàn)水印保護(hù),典型應(yīng)用開發(fā)如下。
(1)利用CV2模塊進(jìn)行LSB位平面數(shù)據(jù)替換。
(2)利用CV2、numpy模塊實(shí)現(xiàn)DCT算法嵌入水印。
(3)利用CV2、Pywt、numpy模塊實(shí)現(xiàn)DWT算法嵌入水印。本書將在第五章進(jìn)行介紹。4.識(shí)別與認(rèn)證
Python可以實(shí)現(xiàn)密碼學(xué)的許多功能,包括公鑰密碼的實(shí)現(xiàn),因此也兼具繼承了密碼認(rèn)證的能力。此外,隨著就Python生物特征識(shí)別的工具庫(kù)的興起,Python人臉識(shí)別和聲紋識(shí)別(或說話人識(shí)別)類的技術(shù)也經(jīng)常得到應(yīng)用,典型應(yīng)用開發(fā)如下。
(1)利用Hashlib、random模塊實(shí)現(xiàn)挑戰(zhàn)響應(yīng)口令認(rèn)證。
(2)利用Dlib的FaceRecognition模塊實(shí)現(xiàn)基于人臉的識(shí)別認(rèn)證。
(3)利用Librosa、sidekit等語音特征分析模塊實(shí)現(xiàn)說話人識(shí)別認(rèn)證。本書將在第六章進(jìn)行介紹。5.主機(jī)安全主機(jī)系統(tǒng)是網(wǎng)絡(luò)中信息和信息處理最為集中的部分,也是黑客攻擊的重點(diǎn)之一。Python可以實(shí)現(xiàn)主機(jī)運(yùn)維、惡意軟件分析、漏洞發(fā)現(xiàn)與挖掘。
(1)主機(jī)運(yùn)維可以采用Psutil庫(kù)、Popen、PIPE、pywin32、paramiko、fabric與pexpect庫(kù),等對(duì)主機(jī)運(yùn)行狀態(tài)進(jìn)行監(jiān)控,然后通過分析發(fā)現(xiàn)異常,進(jìn)而執(zhí)行主機(jī)的安全隔離、告警、處置等。
(2)Python支持采用靜態(tài)分析、動(dòng)態(tài)分析兩種手段對(duì)惡意軟件進(jìn)行分析,靜態(tài)分析利用PEfile、IDA、clamAV等工具在軟件未運(yùn)行的狀態(tài)下,分析程序是否存在惡意特征,動(dòng)態(tài)分析利用Volatility開源內(nèi)存取證框架、Windbg工具、Olldbg工具、以及沙箱對(duì)得到運(yùn)行的軟件進(jìn)行惡意行為分析。
(3)漏洞挖掘發(fā)現(xiàn)系統(tǒng)或協(xié)議的漏洞,確保保護(hù)對(duì)象的可用性。Windows平臺(tái)上很多工具都提供對(duì)軟件的動(dòng)靜態(tài)調(diào)試,進(jìn)而實(shí)現(xiàn)漏洞挖掘的Fuzzing和代碼逆向跟蹤,典型挖掘包括:采用PyEmu對(duì)惡意軟件進(jìn)行分析、采用ImmuityDebugger的Python腳本輔助PoC編寫和二進(jìn)制文件逆向、采用IDAPython插件的Python腳本進(jìn)行自定義軟件分析、采用PyDbg的x86指令仿真器Python腳本實(shí)現(xiàn)Fuzzing測(cè)試器等。本書將在第七章進(jìn)行介紹。6.網(wǎng)絡(luò)安全網(wǎng)絡(luò)連接主機(jī),也是黑客攻擊的重點(diǎn)。為了實(shí)現(xiàn)網(wǎng)絡(luò)的安全防護(hù),可以采用網(wǎng)絡(luò)嗅探、網(wǎng)絡(luò)掃描、防火墻、入侵檢測(cè)手段。Python本身自帶socket模塊,可以實(shí)現(xiàn)TCP和UDP網(wǎng)絡(luò)交互,并且在第三方庫(kù)的支持下也可以實(shí)現(xiàn)網(wǎng)絡(luò)數(shù)據(jù)包的構(gòu)造,因此支持主機(jī)活動(dòng)性、端口和漏洞的掃描,典型應(yīng)用開發(fā)思路如下。
(1)利用pylibpcap、pycapy、pypcap、impacket、scapy等庫(kù)對(duì)網(wǎng)絡(luò)中的數(shù)據(jù)實(shí)施嗅探。
(2)采用socket原始套接字模式或scapy構(gòu)造ICMP數(shù)據(jù)包可以實(shí)現(xiàn)ICMP掃射主機(jī)掃描;采用socket流套接字或數(shù)據(jù)報(bào)套接字實(shí)現(xiàn)TCP全連接以及UDP的端口掃描,socket原始套接字模式或scapy實(shí)現(xiàn)半連接端口掃描;基于已知漏洞模板,采用json和requests模塊實(shí)現(xiàn)目標(biāo)主機(jī)的網(wǎng)絡(luò)漏洞掃描。
(3)Python由于工作的權(quán)限級(jí)別太低,無法直接完成涉及防火墻的內(nèi)核操作,但可以通過修改已有的防7火墻的配置表實(shí)現(xiàn)防火墻的功能,如:修改iptables實(shí)現(xiàn)Linux防火墻操作。
(4)與防火墻類似,可以通過修改已有的入侵檢測(cè)系統(tǒng)(snort、pytbull等)的配置表實(shí)現(xiàn)入侵檢測(cè)的功能,由于入侵檢測(cè)系統(tǒng)更加側(cè)重于數(shù)據(jù)分析,因此機(jī)器學(xué)習(xí)的方法非常適合于對(duì)入侵行為的分析,可以采用sklearn、Tensorflow等工具實(shí)施深度入侵分析。上述防病毒、防火墻、主機(jī)管控、網(wǎng)閘等方面的網(wǎng)絡(luò)安全軟件,需要內(nèi)核級(jí)操作權(quán)限,因此對(duì)于擴(kuò)展對(duì)象要求很高,目前這類成熟的Python開發(fā)平臺(tái)還不多見?,F(xiàn)有少量的Python在這些應(yīng)用方面,更多發(fā)揮的是提高操作效率的作用。本書將在第八章進(jìn)行介紹。7.內(nèi)容安全內(nèi)容安全能夠屏蔽違規(guī)文本、圖片、音頻、視頻等傳播色情、低俗內(nèi)容等不良信息(亦可用于輿情監(jiān)控)。內(nèi)容安全一般可以分為:文本、語音、圖像的內(nèi)容安全。由于Python可以實(shí)現(xiàn)良好的自然語言處理功能,因此可以對(duì)基于自然語言的文本數(shù)據(jù)進(jìn)行過濾,實(shí)現(xiàn)內(nèi)容安全(如果經(jīng)過語音文本轉(zhuǎn)換,這種技術(shù)也可以對(duì)語音數(shù)據(jù)內(nèi)容實(shí)施過濾),開發(fā)方法如下。
(1)基于NLTK工具包,進(jìn)行自然語言分析。
(2)基于Gensim工具包從文檔中自勵(lì)提取語義。
(3)基于Jieba實(shí)現(xiàn)中文分詞工具和詞性標(biāo)注。
(4)聯(lián)合keras、librosa、scipy、sklearn、sounddevice、tensorflow實(shí)現(xiàn)語音文字的轉(zhuǎn)換。圖像語義理解方面,Python內(nèi)容安全也取得了很多進(jìn)展,但目前還不十分成熟,本書將在第九章進(jìn)行介紹。8.其它
Python是黑客所推崇的編程語言,在網(wǎng)絡(luò)攻擊方面具有極好的先天基因。當(dāng)前日漸興起的滲透測(cè)試技術(shù),在技術(shù)本質(zhì)上與黑客攻擊完全一致,因此基于Python的滲透測(cè)試也是其應(yīng)用的一個(gè)重要方向。當(dāng)前大多數(shù)滲透測(cè)試工具都提供Python腳本功能,尤其是,形成多種工具鉸鏈的全滲透系統(tǒng),典型應(yīng)用開發(fā)如下。
(1)利用Requests、urlib2模塊實(shí)施Web滲透測(cè)試。
(2)采用Python腳本操作Metasploit滲透測(cè)試自動(dòng)框架,生成EXP和shellcode。
(3)采用Pywin32+WMI方式實(shí)施Windows提權(quán)。這部分內(nèi)容,讀者可以參考其他參考書。
Python安全應(yīng)用的開發(fā)不能限制于上述基本思路,可以根據(jù)手頭工具功能,進(jìn)行靈活模仿實(shí)現(xiàn)。1.3.3Python安全開發(fā)趨勢(shì)Python安全開發(fā)極具前景,尤其是Python在大數(shù)據(jù)和深度學(xué)習(xí)方面的優(yōu)勢(shì)是非常顯著的,因此在未來基于Python的安全應(yīng)用開發(fā)發(fā)展方向,其一是對(duì)安全應(yīng)用的數(shù)據(jù)密集型計(jì)算進(jìn)行形式化描述,采用大數(shù)據(jù)和深度學(xué)習(xí)的方法提升防護(hù)能力;此外,還可利用Python的模塊整合和跨平臺(tái)的特性,形成集成、綜合的安全解決方案。
Python語言及開發(fā)工具,總體而言表現(xiàn)出數(shù)據(jù)邏輯處理能力強(qiáng)、底層操作弱的特點(diǎn)。即使如此,目前基于Python的安全應(yīng)用開發(fā)熱潮依然興起,這與當(dāng)前設(shè)備自動(dòng)化、智能化程度越來越高不無關(guān)系。作為一種先天就具備智能基因的語言,Python的安全潛力尚待全面挖掘。由于Python工作層面過高,因此對(duì)于計(jì)算機(jī)內(nèi)核或底層的對(duì)象不能直接操作(如:防火墻、病毒查殺、主機(jī)管控),需要借助于其它的工具或渠道。在這些工具沒有成熟之前,利用Python實(shí)現(xiàn)是不現(xiàn)實(shí)的??傊?,Python在安全編程方面的潛力是十分巨大的。本書后續(xù)章節(jié),將圍繞上述安全的典型案例編程展開介紹。信息安全是信息系統(tǒng)無法回避的問題。人們總是期望花費(fèi)盡量少的代價(jià)去完成更可靠的安全功能。Python為這種想法提供了有力的支持。然而,Python不是萬能的,但也基本涉及到絕大多數(shù)安全應(yīng)用領(lǐng)域,尤其是在數(shù)字計(jì)算、智能處理、第三方庫(kù)方面優(yōu)勢(shì)明顯。思考題1.信息安全的定義和特征是什么?2.簡(jiǎn)述Python的工作過程。3.Python在信息安全編程中具有那些優(yōu)勢(shì)?4.簡(jiǎn)述Python安全應(yīng)用設(shè)計(jì)的主要思路。chap.2Python語言基礎(chǔ)知識(shí)網(wǎng)絡(luò)信息安全本章內(nèi)容要點(diǎn)Python開發(fā)環(huán)境構(gòu)建數(shù)據(jù)類型與變量控制語句函數(shù)模塊文件操作異常處理面向?qū)ο缶幊陶齽t表達(dá)式張量計(jì)算1.Python的下載和安裝在Python的官方網(wǎng)站/downloads/下載Python安裝包2.1Python開發(fā)環(huán)境構(gòu)建2.Python開發(fā)環(huán)境的配置假設(shè)Python系統(tǒng)安裝在“C:\Python\”目錄下。在Window操作系統(tǒng)下,右擊桌面上“計(jì)算機(jī)”圖標(biāo)→選擇“屬性”菜單項(xiàng)→選擇“高級(jí)系統(tǒng)設(shè)置”項(xiàng)→選擇“高級(jí)”選項(xiàng)卡→單擊“環(huán)境變量”按鈕,→選擇“系統(tǒng)變量”的“Path”變量,雙擊該項(xiàng),→在彈出的“編輯系統(tǒng)變量”對(duì)話框中其變量值填寫Python的安裝路徑,本例其變量值為:“C:\Python\”。3.Python在線幫助文檔python幫助文檔在python安裝目錄的doc文件夾下,雙擊即可打開。Python定義了6組標(biāo)準(zhǔn)數(shù)據(jù)類型:Number(數(shù)字)String(字符串)List(列表)Tuple(元組)Sets(集合)Dictionary(字典)2.2數(shù)據(jù)類型與變量1.數(shù)字類型數(shù)字類型包括整數(shù)(int)、浮點(diǎn)數(shù)(float)、復(fù)數(shù)(complex)、布爾值(bool)類型。Python的數(shù)據(jù)類型在使用時(shí),不需要先聲明,可以直接使用。例如:
x=13x為整數(shù)r=3.14r為浮點(diǎn)數(shù)a=3+4ja為復(fù)數(shù)【課堂練習(xí)】編寫實(shí)踐參數(shù)賦值。2.字符串
用單引號(hào)、雙引號(hào)括起來的字符序列稱為字符串。例如:
‘a(chǎn)bc’,‘123’,“Hello”,“你好”都是字符串。字符串的幾個(gè)常用函數(shù)和方法:(1)str()函數(shù)str()函數(shù)可以將數(shù)字、列表、元組等轉(zhuǎn)換成字符串。
例如:輸出用單引號(hào)括起來的字符>>>str(1+2)
‘3’#為什么不是1+2?>>>str([1,2,3,4])‘1,2,3,4’【課堂練習(xí)】
(2)find()方法find()方法可以查找字符子串在原字符串中首次出現(xiàn)的位置,如果沒有找到,則返回-1。例如:
>>>s=“ABCDE12345” >>>s.find(“CD”)
2【課堂練習(xí)】
(3)
lower()方法
lower()方法可以將字符串中的大寫字母轉(zhuǎn)換為小寫字母。例如:
>>>s=“ABCDE12345”
>>>s1=s.lower() >>>s1
abcde12345【課堂練習(xí)】
(4)
split()方法
split()方法按指定的分隔符將字符串拆分成多個(gè)字符子串,返回值為列表。例如:
>>>s=‘AB,CD,123,xyz’
>>>s.split(sep=’,’)
[‘AB’,’CD’,’123’,’xyz’]【課堂練習(xí)】
(5)
strip()方法strip()方法用于刪除字符串頭尾指定的字符(默認(rèn)為空格)。例如:
>>>str="*****thisisstringexample....wow!!!*****"
>>>print(str.strip('*'))thisisstringexample....wow!!!【課堂練習(xí)】3.轉(zhuǎn)義符str=‘Python語言入門很簡(jiǎn)單。\n明白了嗎?’列表定義與列表元素1.列表的定義
列表名=[元素0,元素1,……,元素n]說明:(1) 列表名的命名規(guī)則跟變量名一樣,不能用數(shù)字開頭。(2) 方括號(hào)中的元素之間用逗號(hào)分隔。(3) 當(dāng)列表增加或刪除元素時(shí),內(nèi)存空間自動(dòng)擴(kuò)展或收縮。(4) 列表中元素的類型可以不相同,它支持?jǐn)?shù)字,字符串甚至可以包含列表(稱為列表嵌套)。例如:a1=[]#定義空列表a2=[1,2,3]#定義3個(gè)整數(shù)的列表a3=[‘red’,‘green’,‘blue’]#定義3個(gè)字符串的列表a4=[5,‘blue’,[3,4]]#定義元素類型不相同的嵌套列表2.列表中元素的訪問(1)列表元素用“列表名[下標(biāo)]”表示例如:有列表a=[0,1,2,3,4,5,6,7,8,9]其元素分別為a[0]=0;a[1]=1;...;a[9]=9;(2)用“列表名[起始下標(biāo):結(jié)束下標(biāo)+1]”表示列表的片段(列表的部分元素)例如:設(shè)有列表a=[0,1,2,3,'red','green','blue']用交互方式訪問其列表的部分元素?!菊n堂練習(xí)】
>>>>a=[0,1,2,3,'red','green','blue']列表的操作函數(shù)1.添加元素有3個(gè)函數(shù)可以在列表中添加元素:append()、extend()、insert()。(1)用append()函數(shù)在列表末尾添加元素(2)用extend()函數(shù)將另一個(gè)列表的元素添加到本列表之后(3)用insert()函數(shù)將元素插入到列表中指定的某個(gè)位置使用insert()函數(shù)的格式為:
insert(下標(biāo)位置,插入的元素)2.刪除元素(1)用del命令刪除列表中指定下標(biāo)的元素(2)用pop()函數(shù)刪除列表中指定下標(biāo)的元素(3)用remove(x)函數(shù)刪除列表中所值為‘x’的元素3.查找元素位置用index()函數(shù)可以確定元素在列表中的位置。4.對(duì)列表元素排序用sort()函數(shù)可以對(duì)列表元素進(jìn)行排序。sort()函數(shù)默認(rèn)為按升序(從小到大)排序?!菊n堂練習(xí)】操作列表a=[0,1,2,3,‘red’,‘green’,‘blue’]或其他1、顯示:顯示所有,顯示第3個(gè)之后的元素2、給a添加元素一個(gè)元素:‘hellopython’,第4個(gè)元素插入4。3、刪除元素操作:刪除腳標(biāo)2的元素、刪除‘hellopython’4、查找元素操作:查找‘red’5、排序操作6、清空操作元組
元組是一種元素序列。但元組是不可變的,元組一旦創(chuàng)建,就不能添加或刪除元素,元素的值也不能修改。
1.元組的創(chuàng)建用一對(duì)圓括號(hào)創(chuàng)建元組。2.元組的刪除只能用del命令刪除整個(gè)元組,而不能僅刪除元組中的部分元素,因?yàn)樵M是不可變的。【課堂練習(xí)】
1、創(chuàng)建一個(gè)元組:
名字為:yuanzu
值為:3,4,’hellowpython’ 2、刪除元組yuanzu字典Python的字典是包含多個(gè)元素的一種可變數(shù)據(jù)類型,其元素由“鍵:值”對(duì)組成,即每個(gè)元素包含“鍵”和“值”兩部分。1.字典的定義用大括號(hào)“{}”把元素括起來就構(gòu)成了一個(gè)字典對(duì)象。字典中的元素用“字典名[鍵名]”表示。2.字典元素的修改通過為鍵名重新賦值的方式修改字典元素的值。3.字典元素的添加添加字典元素,也是使用賦值方式。4.字典元素的刪除用del命令可以刪除字典中的元素。【課堂練習(xí)】操作字典c={'name':'Tom','age':21,'hometown':'Tokoy'}1、修改:name改為Bob2、增加字典元素:添加鍵gender,值為:male3、刪除字典元素:刪除age集合集合是一個(gè)無序不可重復(fù)的序列,是一種基本數(shù)據(jù)類型。集合分為可變集合(set)和不可變集合(frozenset)兩種類型。可變集合的元素是可以添加、刪除的,而不可變集合的元素不可添加、不可刪除。1.集合的定義集合用一對(duì)大括號(hào)“{}”把元素括起來,元素之間用逗號(hào)“,”分隔。例如:s1={1,2,3,4,5}s2={‘a(chǎn)’,’b’,’c’,’d’}上述s1和s2都是集合。2.集合的創(chuàng)建使用set()函數(shù)創(chuàng)建一個(gè)集合。3.集合元素的添加
python集合有兩種方法用于添加元素,分別是add()和update()。4.集合元素的刪除用remove()可以刪除集合中的元素。例如:>>>a=set(‘boy’)>>>a.remove(‘y’)>>>a{‘o’,’b’}【課堂練習(xí)】操作集合e={‘a(chǎn)‘,‘b’,‘c‘,‘d‘,’e’}1、創(chuàng)建結(jié)合:分別用兩種方法創(chuàng)建上述集合2、添加元素:添加book到集合,采用add和update分別添加并比較。3、刪除字典元素:刪除元素a5.集合的專用操作符集合有4個(gè)專用操作符:
&(交集)、|(并集)、-(差集,又稱為“相對(duì)補(bǔ)集”)、^(對(duì)稱差分)。設(shè)有兩個(gè)集合a、b,其關(guān)系如下:a&b表示兩個(gè)集合的共同元素;a|b表示兩個(gè)集合的所有元素;a-b表示只屬于集合a,不屬于集合b的元素;a^b表示兩個(gè)集合的非共同元素;【課堂練習(xí)】集合p={'p','y','t','o','n','h'} q={'p','e','g','o','n','i'} 1、求交集2、求并集3、求差集4、求對(duì)稱差分集在Python中使用print()函數(shù)輸出數(shù)據(jù)。(1)直接輸出2.3控制語句(2)格式化輸出print()函數(shù)可以使用%格式化輸出數(shù)據(jù)。常用的格式化輸出符號(hào)如表2-1所示。【例】格式化輸出及控制換行輸出示例。
2.輸入語句在Python中,使用input()函數(shù)輸入數(shù)據(jù)。input()函數(shù)只能輸入字符數(shù)據(jù),當(dāng)需要輸入數(shù)值型數(shù)據(jù)時(shí),可以使用eval()函數(shù)將字符轉(zhuǎn)換為數(shù)值?!纠?-2】從鍵盤上輸入二個(gè)數(shù),計(jì)算這二數(shù)之和。編寫源程序如下:print("輸入一個(gè)整數(shù):")a=eval(input())print("輸入一個(gè)實(shí)數(shù):")b=eval(input())str=input()print(str)c=a+bprint("c=",a,"+",b,"=",c)【例】交換兩個(gè)變量的值。在編寫程序時(shí),有時(shí)需要把兩個(gè)變量的值互換,Python在交換值的運(yùn)算不需要用中間變量。交換兩個(gè)變量的值if選擇語句語法格式為:【例2-4】從鍵盤任意輸入兩個(gè)整數(shù),按從小到大的順序依次輸出這兩個(gè)數(shù)。源程序如下:【例】對(duì)給定的三個(gè)數(shù),求最大數(shù)的平方。2.雙分支選擇結(jié)構(gòu)if條件表達(dá)式:程序段1else:程序段23.多分支選擇結(jié)構(gòu)【例】將百分制轉(zhuǎn)換為五級(jí)記分制。if條件表達(dá)式1:程序段1elif條件表達(dá)式2:程序段2
……elif條件表達(dá)式n:程序段nelse:
程序段n+1循環(huán)語句1.for循環(huán)語句當(dāng)循環(huán)變量的步長(zhǎng)值為1時(shí),可以省略,即可寫成:【例】求從1加到9的和?!纠吭谘h(huán)體內(nèi)發(fā)生循環(huán)變量的值,觀察循環(huán)次數(shù)。For循環(huán)變量的值在循環(huán)體內(nèi)部發(fā)生改變,不會(huì)影響循環(huán)次數(shù)?。?!
在for循環(huán)中,可以使用continue語句來結(jié)束本次循環(huán),也可以使用break語句跳出循環(huán)體,從而結(jié)束整個(gè)循環(huán)?!纠坑?jì)算10以內(nèi)的偶數(shù)和。2.while語句while循環(huán)語句一般形式的語法結(jié)構(gòu)如下:【例】求10!?!舅伎碱}】用for循環(huán)計(jì)算上題(計(jì)算10?。?。n=1p=1forninrange(1,11): p=p*n print('n=',n,'p=',p)
3.循環(huán)嵌套循環(huán)可以嵌套,在一個(gè)循環(huán)體內(nèi)包含另一個(gè)完整的循環(huán),叫做循環(huán)嵌套。循環(huán)嵌套運(yùn)行時(shí),外循環(huán)每執(zhí)行一次,內(nèi)層循環(huán)要執(zhí)行一個(gè)周期?!纠繎?yīng)用循環(huán)嵌套,編寫一個(gè)按9行9列排列輸出的乘法九九表程序?!纠繎?yīng)用循環(huán)嵌套打印出由“*”組成的直角三角形圖形。
內(nèi)循環(huán)控制列外循環(huán)控制行流程圖流程圖(程序框圖)是一種用程序框、流程線及文字說明來表示算法的圖。算法的基本邏輯結(jié)構(gòu)
順序結(jié)構(gòu)由若干個(gè)依次執(zhí)行的步驟組成。條件結(jié)構(gòu)需要經(jīng)過條件判斷后,才能決定執(zhí)行哪個(gè)操作。循環(huán)結(jié)構(gòu)從某處開始,按照一定的條件反復(fù)執(zhí)行某些步驟。
可以證明:任何一個(gè)算法都可以由這三種結(jié)構(gòu)組合而成。算法的基本結(jié)構(gòu)就是構(gòu)成算法的積木,這一點(diǎn)在程序框圖中可以清楚看到。
畫程序框圖的規(guī)則1)框圖一般按從上到下、從左到右的方向畫。2)使用標(biāo)準(zhǔn)的圖形符號(hào)。3)程序框一般只有一個(gè)進(jìn)入點(diǎn)和一個(gè)退出點(diǎn)。4)判斷框有兩個(gè)退出點(diǎn),用“是”與“否”或“Y”與“N”表示判斷的兩種結(jié)果。5)在圖形符號(hào)內(nèi)描述的語言要簡(jiǎn)練清楚。構(gòu)成流程圖的圖形符號(hào)及其作用程序框名稱功能起止框(終端框)表示一個(gè)算法的起始和結(jié)束,是任何流程圖不可少的.輸入、輸出框表示一個(gè)算法輸入和輸出的信息,可用在算法中任何需要輸入、輸出的位置.處理框(執(zhí)行框)賦值、計(jì)算,算法中處理數(shù)據(jù)需要的算式、公式等分別寫在不同的用以處理數(shù)據(jù)的處理框內(nèi).判斷框判斷某一條件是否成立,成立時(shí)在出口處標(biāo)明“是”或“Y”;不成立時(shí)標(biāo)明“否”或“N”.流程線連接程序框連接點(diǎn)連接程序框圖的兩部分順序結(jié)構(gòu)順序結(jié)構(gòu)在程序框圖中的體現(xiàn)就是用流程線將程序框自上而下地連接起來,按順序執(zhí)行算法步驟。如在示意圖中,A框和B框是依次執(zhí)行的,只有在執(zhí)行完A框指定的操作后,才能接著執(zhí)行B框所指定的操作。AB例1:計(jì)算以任意正實(shí)數(shù)為半徑的圓的面積。算法:S1,輸入r.S2,S=π*r*rS3,輸出S.開始結(jié)束輸入r輸出SS=π*r*r條件結(jié)構(gòu)條件結(jié)構(gòu)是指在算法中通過對(duì)條件的判斷,根據(jù)條件是否成立而選擇不同流向的算法結(jié)構(gòu)。滿足條件?語句是否滿足條件?語句語句是否判斷符號(hào):>、<、==、!=、>=、<=。邏輯符號(hào):and、or
例2:設(shè)計(jì)求任意3個(gè)整數(shù)a,b,c的最大值的算法。算法:令max代表三個(gè)數(shù)中的最大值S1,輸入a、b、c三個(gè)數(shù);S2,令max=a;S3,如果b>max,則max=b;S4,如果c>max,則max=c;S5,輸出maxmax=a輸入a,b,c結(jié)束輸出max開始b>max?c>max?max=bmax=c是否否是開始結(jié)束輸入a,b,c輸出max
b>max?是否max=amax=bmax=cc>max?否是不止一種框圖:程序框圖2循環(huán)結(jié)構(gòu)循環(huán)結(jié)構(gòu):從某處開始,按照一定的條件反復(fù)執(zhí)行某些步驟。循環(huán)體:復(fù)執(zhí)行的步驟稱為循環(huán)體。循環(huán)條件:控制反復(fù)執(zhí)行的條件稱為循環(huán)條件。每次執(zhí)行循環(huán)體前,對(duì)條件進(jìn)行判斷;當(dāng)條件滿足時(shí),執(zhí)行循環(huán)體,否則終止循環(huán)。滿足條件?循環(huán)體是否滿足條件?循環(huán)體是否例3:設(shè)計(jì)一個(gè)算法1+2+…+100的值的算法,并畫出程序框圖.算法:
S1:S=0,i=1,S2:若i>100,則輸出S,算法結(jié)束.S3:S=S+i.S4:i=i+1,
S5:轉(zhuǎn)到S2.s=0foriinrange(1,101): s=s+iprint(”答案是:”,s)
開始
結(jié)束i=1輸出Si>100?否是S=0i=i+1S=S+i【例】求50以內(nèi)能被7整除,但不能同時(shí)被5整除的所有整數(shù)。修改:
150以內(nèi)能被8整除,但同時(shí)被5整除的所有整數(shù)?!纠咳绻粋€(gè)3位數(shù)的各位數(shù)字的立方和等于該數(shù)自身,則該數(shù)稱為“水仙花數(shù)”。例如,153=13+53+33,所以153是一個(gè)水仙花數(shù)。求100~1000以內(nèi)所有“水仙花數(shù)”。
修改:求1234~54321以內(nèi)所有“水仙花數(shù)”。除10求余數(shù),相當(dāng)于提取出個(gè)位縮小10倍【例】設(shè)有一份某地連續(xù)10年內(nèi)6月1日的氣溫記錄,其數(shù)據(jù)為(0C):31、30、33、31、28、32、29、33、35、31,試計(jì)算其平均氣溫。修改:求該范圍內(nèi)的最高溫度。a的元素個(gè)數(shù)【例】雞兔同籠問題。雞和兔在一個(gè)籠子里,從上面數(shù),有35個(gè)頭;從下面數(shù),有94只腳。問籠中雞和兔各有多少只?36注意編程解題的思路并不完全與我們?nèi)私忸}的思路一樣?。?!【例】百錢買百雞問題。公雞5文錢一只,母雞3文錢一只,小雞3只一文錢,用100文錢買100只雞,如何買?
設(shè)公雞x只,母雞y只,小雞z只,則:
x+y+z=1005x+3y+z/3=100題目:求100之內(nèi)的素?cái)?shù)。程序分析:素?cái)?shù)只有1和它自己可以被除盡(余數(shù)為0)。fornuminrange(2,100+1):#素?cái)?shù)大于1
foriinrange(2,num): if(num%i)==0: break ifi==num-1: print(num)題目:一個(gè)5位數(shù),判斷它是不是回文數(shù)。即12321是回文數(shù),個(gè)位與萬位相同,十位與千位相同。程序分析:學(xué)會(huì)使用布爾值判斷。a=int(input("請(qǐng)輸入一個(gè)五位數(shù)字:\n"))x=str(a)flag=Trueforiinrange(0,3): ifx[i]!=x[-i-1]: flag=False breakifflag: print("%d是一個(gè)回文數(shù)!"%a)else: print("%d不是一個(gè)回文數(shù)!"%a)1.函數(shù)定義的一般形式【例2-15】創(chuàng)建一個(gè)名為Hello的函數(shù),其作用為輸出“歡迎進(jìn)入Python世界”的字符內(nèi)容。創(chuàng)建該函數(shù)的程序段如下:
defHello():
print("歡迎進(jìn)入Python世界")
在程序中調(diào)用Hello()函數(shù),將顯示“歡迎進(jìn)入Python世界”的字符內(nèi)容。2.4函數(shù)【例】創(chuàng)建一個(gè)名為sum()的函數(shù),其作用為計(jì)算n以內(nèi)的整數(shù)之和(包含n)。
下面為實(shí)現(xiàn)計(jì)算n以內(nèi)的整數(shù)之和的函數(shù)程序段:defsum(n): s=0 foriinrange(1,n+1): s=s+i returns2.函數(shù)的調(diào)用在Python中,直接使用函數(shù)名調(diào)用函數(shù)。如果定義的函數(shù)包含有參數(shù),則調(diào)用函數(shù)時(shí)也必須使用參數(shù)。【例2-17】創(chuàng)建顯示如下排列字符的函數(shù),并編寫程序調(diào)用該函數(shù)。
**********************************
*歡迎進(jìn)入學(xué)生成績(jī)管理系統(tǒng)*
**********************************程序代碼如下:defstar(): str="*****************************"returnstrdefprn():print("*歡迎進(jìn)入學(xué)生成績(jī)管理系統(tǒng)*")print(star())prn()print(star())【例2-18】應(yīng)用函數(shù),計(jì)算1~100的和。程序的運(yùn)行結(jié)果如下:
5050局部變量與全局變量在函數(shù)體內(nèi)部定義的變量或函數(shù)參數(shù)稱為局部變量,該變量只在該函數(shù)內(nèi)部有效。在函數(shù)體外部定義的變量稱為全局變量,在變量定義后的代碼中都有效。當(dāng)全局變量與局部變量同名時(shí),則在定義局部變量的函數(shù)中,全局變量被屏蔽,只有局部變量有效。全局變量在使用前要先用關(guān)鍵字global聲明。【例】全局變量與局部變量同名的示例。常用內(nèi)置函數(shù)Python內(nèi)置函數(shù)是python系統(tǒng)內(nèi)部創(chuàng)建的,在Python的程序中,可以隨時(shí)調(diào)用這些函數(shù),不需要另外定義。例如,最常見的print()是內(nèi)置函數(shù),在程序中直接使用: print("HelloWorld!")而平方根函數(shù)sqrt()不是內(nèi)置函數(shù),使用該函數(shù)時(shí)需要引用math模塊: importmath y=math.sqrt(25)匿名函數(shù)lambda在Python中可以使用匿名函數(shù)。匿名函數(shù)即沒有函數(shù)名的函數(shù)。通常用lambda聲明匿名函數(shù)。例如,計(jì)算二個(gè)數(shù)的和,可以寫成: add=lambdax,y:x+y print(add(1,2))輸出的結(jié)果為3。從上面示例可以看到,lambda表達(dá)式的計(jì)算結(jié)果相當(dāng)于函數(shù)的返回值?!纠坑胠ambda表達(dá)式,求三個(gè)數(shù)的和?!纠烤帉懹?jì)算n!的函數(shù)。
計(jì)算n!,應(yīng)先計(jì)算(n-1)!,而計(jì)算(n-1)!,需要先計(jì)算(n-2)!,......,如此遞推,直到最后變成計(jì)算1!的問題。
根據(jù)公式,1!=1,這是本問題的遞歸終止條件。由終止條件得到1!的結(jié)果后,再反來依次計(jì)算出2!,3!,......,直到最后計(jì)算出n!。
設(shè)計(jì)算n!的函數(shù)為fun(n),當(dāng)n>1時(shí),fun(n)=n*fun(n-1)。即在fun(n)函數(shù)體內(nèi)將遞歸調(diào)用fun()自身?!纠烤帉懞瘮?shù),從鍵盤輸入?yún)?shù)n,計(jì)算斐波那契數(shù)列中第一個(gè)大于n的項(xiàng)。
斐波那契數(shù)列為:1,1,2,3,5,8,13,......。即從第3項(xiàng)開始,每一項(xiàng)是前二項(xiàng)之和。
模塊的導(dǎo)入
在Python中用關(guān)鍵字import來導(dǎo)入某個(gè)模塊,其導(dǎo)入模塊的形式有兩種。1.用import形式導(dǎo)入模塊用import導(dǎo)入模塊的一般形式為:import模塊名
在調(diào)用import導(dǎo)入模塊的函數(shù)時(shí),必須使用以下形式來調(diào)用:模塊名.函數(shù)名2.5模塊2.用
from....import....形式導(dǎo)入模塊用from....import....導(dǎo)入模塊的一般形式為:
from模塊名import函數(shù)名或變量名
比如要引用模塊math中的sqrt()函數(shù),可以用frommathimportsqrt()語句來導(dǎo)入。在調(diào)用from....import....導(dǎo)入模塊的函數(shù)時(shí),直接使用函數(shù)名來調(diào)用模塊中的函數(shù),而不需要在函數(shù)的前面加上模塊名。3.導(dǎo)入模塊的順序
當(dāng)需要導(dǎo)入多個(gè)模塊時(shí),應(yīng)按照下面的順序依次導(dǎo)入模塊:
(1)導(dǎo)入Python系統(tǒng)的標(biāo)準(zhǔn)庫(kù)模塊,如os、sys等;
(2)導(dǎo)入第三方擴(kuò)展庫(kù)模塊,如pygame、mp3play等;
(3)導(dǎo)入自己定義和開發(fā)的本地模塊。自定義模塊
在Python中,每個(gè)包含有函數(shù)的Python文件都可以作為一個(gè)模塊來使用,其模塊名就是文件名?!纠孔远x模塊使用示例。(1)設(shè)有Python文件hello.py,其中包含hh()函數(shù),代碼如下:(2)調(diào)用模塊hello中hh()函數(shù)的程序ex3_8.py代碼如下:【例】編寫一個(gè)計(jì)算二數(shù)和的模塊,再在另一個(gè)程序中調(diào)用該模塊。
(1)編寫模塊代碼,其中包含有計(jì)算二數(shù)之和的函數(shù)sum(),保存為ex3_9_1.py。(2)編寫調(diào)用模塊程序ex3_9_2.py,其代碼如下:使用pip安裝和管理擴(kuò)展模塊
1.安裝pipPython安裝第三方的模塊,大多使用包管理工具pip進(jìn)行安裝。Python包管理工具pip提供了對(duì)Python包的查找、下載、安裝、卸載的功能。下載pip下載地址是:
https:///pypi/pip#downloads下載完成之后,解壓到一個(gè)文件夾,使用控制臺(tái)命令窗口進(jìn)入解壓目錄,輸入安裝命令:
pythonsetup.pyinstall
安裝pip完后還需要配置環(huán)境變量,pip指令才能生效。
2.通過pip安裝擴(kuò)展模塊例如:(1)安裝MySQL數(shù)據(jù)庫(kù)管理模塊:pipinstallpymysql
(2)安裝圖形處理庫(kù)模塊:pipinstallpillow
(3)安裝SomePackage模塊:
pipinstallSomePackage
(4)卸載SomePackage模塊:
pipuninstallSomePackage
(5)查看當(dāng)前已經(jīng)安裝的模塊:
piplist2.6文件操作Python的os模塊提供對(duì)文件的操作函數(shù),常用操作函數(shù)如下表2-7所示:函數(shù)說明os.rmdir(path)創(chuàng)建一個(gè)文件夾os.mknod(“test.txt”)創(chuàng)建空文件open(“test.txt”,w)以w模式打開一個(gè)文件,如果文件不存在則創(chuàng)建文件os.rename(“oldfile”,”newfile”)文件重命名os.remove(“file”)刪除文件os.path.exists(“goal”)判斷文件是否存在文件操作函數(shù)
打開和關(guān)閉文件1.打開文件在python中,使用open函數(shù),可以打開一個(gè)已經(jīng)存在的文件,或者創(chuàng)建一個(gè)新文件。打開文件時(shí)將創(chuàng)建一個(gè)文件對(duì)象。其一般格式為:f=open(文件名,訪問模式)
其中,f為創(chuàng)建的文件對(duì)象,參數(shù)“訪問模式”見表6-3。2.關(guān)閉文件
文件操作完成之后,需要將文件對(duì)象關(guān)閉,其一般格式為:f.close()1.read()函數(shù)
使用read()函數(shù)可以讀取文件內(nèi)容,其一般格式為:str=f.read([b])其中:f為文件對(duì)象;參數(shù)b為指定讀取的字節(jié)數(shù),如果不指定,則讀取全部?jī)?nèi)容;str為字符串,存放讀取的內(nèi)容。讀取文件操作【例】設(shè)有文件a.txt,其文件內(nèi)容為“HelloPython”,編寫程序讀取該文件中的內(nèi)容,并顯示到屏幕上。編寫程序代碼如下:importosf=open("a.txt","r")str=f.read()print(str)f.close()2.readline()函數(shù)
使用readline()函數(shù)可以逐行讀取文件的內(nèi)容,其一般形式如下:str=f.readline()【例】設(shè)有文件“荷塘月色.txt”,其文件內(nèi)容為:荷塘月色剪一段時(shí)光緩緩流淌,流進(jìn)了月色中微微蕩漾,彈一首小荷淡淡的香,美麗的琴音就落在我身旁。編寫程序,用readline()函數(shù)逐行讀取文件的內(nèi)容。編寫程序代碼如下:importosf=open("荷塘月色.txt","r")whileTrue: str=f.readline() print(str) ifnotstr: breakf.close()3.readlines()函數(shù)
使用readlines()函數(shù)可以一次讀取文件中所有行的內(nèi)容,其一般形式如下:str=f.readlines()
【例】編寫程序,用readlines()函數(shù)讀取上例的“荷塘月色.txt”文件內(nèi)容。編寫程序代碼如下:importosf=open("荷塘月色.txt","r")str=f.readlines()print(str)f.close()寫入文件操作
Python通過函數(shù)write()向文件寫入數(shù)據(jù),其一般格式為:
f.write(content)【例】編寫程序,新建文本文件ex6_8.txt,并向其寫入文本數(shù)據(jù)。編寫程序代碼如下:importosstr="HelloPython\n向文件寫入數(shù)據(jù)"f=open("ex6_8.txt","w")f.write(str)f.close()
將程序保存為ex6_8.py,運(yùn)行程序后,在當(dāng)前目錄下生成一個(gè)名為“ex6_8.txt”的文本文件,其內(nèi)容為:HelloPython向文件寫入數(shù)據(jù)【例】編寫程序,在文件ex6_8.txt原數(shù)據(jù)內(nèi)容之后,添加“我對(duì)學(xué)習(xí)Python很癡迷!”。
當(dāng)以w模式為參數(shù)調(diào)用open()函數(shù)打開文件時(shí),如果寫入數(shù)據(jù)到文件中,新內(nèi)容將覆蓋文件中原有數(shù)據(jù)內(nèi)容。若要在文件中追加數(shù)據(jù),可以以a或a+模式為參數(shù)調(diào)用open()函數(shù)打開文件。
編寫程序代碼如下:importosf1=open("ex6_8.txt","a+")f1.write("\n我對(duì)學(xué)習(xí)Python很癡迷!")f1.close()f2=open("ex6_8.txt","r")str=f2.read()print(str)
運(yùn)行程序,其結(jié)果如下:HelloPython向文件寫入數(shù)據(jù)我對(duì)學(xué)習(xí)Python很癡迷!python中的常見標(biāo)準(zhǔn)異常2.7異常處理異常的捕捉與處理1.使用try...except語句try...except語句的語法格式為:
try: <被檢測(cè)的語句塊>except<異常類型名稱>: <處理異常的語句塊>
【例】元組下標(biāo)越界引發(fā)異常。
編寫程序代碼如下:s=[1,2,3,4,5]try: print(s[5])exceptIndexError: print("發(fā)生異常原因:索引出界")
運(yùn)行程序結(jié)果為:發(fā)生異常原因:索引出界
2.使用try...except...else語句try...except...else語句的語法格式為:
try: <被檢測(cè)的語句塊>except<異常類型名稱>: <處理異常的語句塊>
else: <無異常時(shí)執(zhí)行的語句塊>【例】編寫一個(gè)把字符串寫入到一個(gè)文件的程序。若寫入成功,則提示“內(nèi)容寫入文件成功”,否則提示“Error:沒有找到文件或讀取文件失敗”。
try:
fh=open("testfile.txt","w")
fh.write("這是一個(gè)測(cè)試文件,用于測(cè)試異常!!")exceptIOError:
print("Error:沒有找到文件或讀取文件失敗")else:
print("內(nèi)容寫入文件成功")
fh.close()3.帶有多個(gè)except子句的try語句【例】編寫程序,從鍵盤輸入1,2,……,5中的一個(gè)數(shù)字,否則,當(dāng)輸入其他數(shù)字或字符則提示為異常。4.帶有finally子句的try語句【例】帶有finally子句的try語句示例。1.類的一般形式
在類聲明中,class是聲明類的關(guān)鍵字,表示類聲明的開始,類聲明后面跟著類名,按習(xí)慣類名要用大寫字母開頭,并且類名不能用阿拉伯?dāng)?shù)字開頭。
類中的self在調(diào)用時(shí)代表類的實(shí)例,與c++或Java中的this作用類似。
2.8面向?qū)ο缶幊?.創(chuàng)建對(duì)象類在使用時(shí),必須創(chuàng)建類的對(duì)象,再通過類的對(duì)象來操作類中的成員變量和成員方法。創(chuàng)
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年濰坊貨車從業(yè)資格證考試試題
- 洛陽商業(yè)職業(yè)學(xué)院《口述史實(shí)踐》2023-2024學(xué)年第一學(xué)期期末試卷
- 2024年新能源發(fā)電項(xiàng)目投資合作協(xié)議
- 港口安全防護(hù)設(shè)施施工合同
- 橡膠制品招投標(biāo)內(nèi)控要點(diǎn)分析
- 高層公寓建設(shè)合同范文
- 施工合同執(zhí)行追蹤系統(tǒng)
- 2025正規(guī)貨物運(yùn)輸合同
- 人事專用章使用規(guī)范
- 營(yíng)業(yè)執(zhí)照辦理中的地址問題
- 北京市西城區(qū)2023-2024學(xué)年七年級(jí)上學(xué)期期末地理試卷
- 建設(shè)工程安全風(fēng)險(xiǎn)管理
- 臨水臨電施工組織方案
- 國(guó)網(wǎng)安全生產(chǎn)培訓(xùn)課件
- 木材的分類和命名規(guī)則
- 火電行業(yè)的稅收分析
- 班會(huì):拓展學(xué)生的興趣愛好課件
- 學(xué)校“禁毒八個(gè)一”臺(tái)賬目錄
- 心律失常PPT醫(yī)學(xué)課件
- 城市污水處理廠水質(zhì)檢測(cè)與安全生產(chǎn)
- 消化系統(tǒng)常見疾病及護(hù)理
評(píng)論
0/150
提交評(píng)論