
【資料圖】
“等待著下課,等待著放學,等待游戲的童年"。當羅大佑這首耳熟能詳的“童年”再度想起的時候,你和我是否都會被這個熟悉的旋律帶回到那個只屬我們的懵懂年代?你還記得那個“同桌的你”嗎?那個周杰倫唱到的“等你下課”的人,如今身在何方?在那樣一個沒有手機微信和短信傳遞訊息的年代,你是否經歷或見證過這樣的場景,通過一張張“小紙條”,給那個心儀的“她/他”傳遞浪漫?那些曾經在課堂上冒險傳遞諸如:“放學后,小樹林見!”的約會紙條,既承載著浪漫,又蘊含著風險。如果約會紙條被老師截獲或者被同學偷窺揭發,浪漫的初戀基本就涼涼了。在這種浪漫與風險并存場景中,如何保證紙條內容在傳遞中不被泄密,繼續美好的浪漫呢?
下面讓我們走進Python場景編程,一起見證和感悟浪漫的初戀與嚴謹的計算機科學相遇的時候,將會碰撞出怎樣的火花。
我們的基本思路是這樣的:首先對約會紙條的原始內容(明文)進行加密;其次將加密后生成的內容(密文)書寫在紙條上傳遞出去;最后對紙條上的密文內容進行解密,還原紙條的原始內容。通過這樣的方式,可以很好地解決約會紙條在傳遞過程中可能存在的泄密問題。在Python中,我們可以使用函數ord(ch)獲取字符ch在Unicode字符集中的數字值;函數chr(n)可以將數字值還原為Unicode中的字符。你完全可以把ord() / chr()看成是一對互逆的函數。現在我們啟動Python的交互式解釋器,執行以下命令,并觀察結果:
>>> ord("約")32422>>> chr(32422)"約">>>>>> ord("會")20250>>> chr(20250)"會">>>
整個程序有兩個模塊組成。其中:code_convert.py 完成加密/解密函數的基礎模塊,具有代碼重要價值;dating_paper.py 這是主程序模塊,調用基礎模塊中的函數,實現字符串內容的加密/解密功能。下面是具體的程序代碼和代碼注解。
"""code_covert.py : 實現對字符串的編碼/解碼功能"""def encode(message, offset=0):""" 功能:將明文轉換密文 參數:message : 以明文形式的原始字符串offset : 整數偏移量返回:content : 以密文形式的原始字符串""" content = "" for ch in message: content += str(ord(ch)+offset)+" " # ① return contentdef decode(content, offset=0): """ 功能:將密文轉成明文參數:content : 密文形式存放的原始字符offset : 整數偏移量返回:解密后的原始字符串""" content = content.split() # ② content = [chr(int(n)-offset) for n in content] # ③ return "".join(content) # ④# dating-paper.py : 懵懂的青春from code_convert import encode, decodedef main(): message = input("約會紙條原始內容:")content = encode(message) print("加密后的紙條內容:" + content) print("解密后的紙條內容:" + decode(content))if __name__ == "__main__": main()
下面是主要函數的代碼實現進行簡要說明:函數encode(message, offset)實現對原始字符串message加密,通過對message中的每一個字符進行循環處理:使用語句①獲取字符在Unicode字符集中的數字值,再加上一個偏移量offset,然后轉換成數字字符串后追加變量content中,以此實現字符串的累加式拼接。該函數的返回值就是經過加密處理后的密文內容;offset是一個整數類型的參數,代表一個偏移量,使用它可以簡單地提升加密算法的安全強度,以此增加一些加密破譯的難度。函數decode(content, offset=0)實現對密文的解密/還原處理。參數content是存放密文的字符串,offset是一個整數偏移量;在函數的實現中,首先使用語句②把content存放的密文字符串轉換為列表,這個列表中的每一個元素就是字符串形式的整數,其次通過語句③的列表推導式功能,將content中的每個元素轉換為Unicode字符集中的字符,逐一將密文字符還原為明文字符。我們使用語句④,將列表content中的每一個元素進行字符串連接后返回這個值。這個函數的返回值就是解密后的原始字符串內容。通過函數encode(message)和decode(content)配合使用,實現“明文”與“密文”相互轉換,需要強調的是兩個函數中必須使用相同的偏移量offset,方能正確地加密和還原。例如:使用encode(message, 100) / decode(content, 100) 的函數對,以此完成加密/解密功能,達到防止約會紙條內容泄密的終極目標。
D:\cases\懵懂的青春>python dating-paper.py
約會紙條原始內容:放學后小樹林見,不見不散!加密后的紙條內容:25918 23398 21518 23567 26641 26519 35265 65292 19981 35265 19981 25955 33解密后的紙條內容:放學后小樹林見,不見不散!D:\cases\懵懂的青春>
經代碼測試,程序實現了紙條內容的加密和還原功能。需要進一步說明的是,盡管encode()/decode()函數采用的加密/解密算法非常簡單,容易被破解,但是把它們應用于約會紙條場景中,實現紙條內容的加密/解密功能,其安全強度是足夠了。
現代社會是網絡化和信息化的時代,我們每個人都會有許多密碼。例如:手機銀行登錄密碼、郵箱登錄密碼、銀行卡轉賬密碼、支付寶密碼、微信支付密碼等等, 這些種類繁多的密碼已經成為保護隱私和財產安全不受侵害的安全手段。如果密碼被一些居心叵測的人截獲,盜取銀行卡或是社交工具中的隱私和錢財,將會給你的正常生活帶來嚴重的困擾。如何保護密碼不被泄密,最安全的方法還是將密碼強行記憶在自己的腦海里,輔之于把密碼寫在紙質的“密碼記事本”中,以防遺忘密碼時備查。生活的經驗告訴我們,往往最傳統的方式就是最安全的方法,只要你保證了“密碼記事本”安全,你就守住了隱私和財產安全的最后防線。但是一旦“密碼記事本”被偷窺或遺失,你同樣可能要面臨風險和承擔損失。我們如何解決因“密碼記事本”被偷窺或遺失所帶來的風險問題?答案就是使用加密/解密技術,將賬號和密碼原始內容轉換為密文,然后手工抄錄到“密碼記事本”中;當你需要查詢時,再將這段密文還原成明文。通過這種方法,我們就為“密碼記事本”添加了安全鎖。