溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶(hù)服務(wù)條款》

Python編程密碼學(xué)文件加密與解密的方法

發(fā)布時(shí)間:2022-05-24 11:50:25 來(lái)源:億速云 閱讀:249 作者:iii 欄目:開(kāi)發(fā)技術(shù)

本文小編為大家詳細(xì)介紹“Python編程密碼學(xué)文件加密與解密的方法”,內(nèi)容詳細(xì),步驟清晰,細(xì)節(jié)處理妥當(dāng),希望這篇“Python編程密碼學(xué)文件加密與解密的方法”文章能幫助大家解決疑惑,下面跟著小編的思路慢慢深入,一起來(lái)學(xué)習(xí)新知識(shí)吧。

本章要點(diǎn)

open()方法。

讀、寫(xiě)文件。

write()、close()及read()文件對(duì)象操作方法。

os.path.exists()方法。

upper()、lower()及title()字符串操作方法。

startswith()及endswith()字符串操作方法。

time模塊及time.time()方法

1 純文本文件

對(duì)文件進(jìn)行置換操作的程序只對(duì)純文本(無(wú)格式文本)文件進(jìn)行加/解密,這類(lèi)文件指的是那些后綴名為 .txt 且文件中不包含除文本數(shù)據(jù)以外的內(nèi)容的文件。要編寫(xiě)這類(lèi)文件,可以選擇在Windows系統(tǒng)下使用Notepad、在macOS系統(tǒng)下使用TextEdit,或者在Linux系統(tǒng)下使用gedit。(Word這樣的文本處理程序同樣也可以生成純文本文件,但記住這些文件不能保存字體樣式、字體大小、顏色或其他任何格式。)除上述文本編輯軟件外,讀者甚至可以使用IDLE文本編輯器,只要將文件后綴保存為 .txt 而不是通常使用的 .py 即可。

如果需要純文本文件的樣例,則可以從網(wǎng)絡(luò)上下載一些txt小說(shuō),要將純文本手動(dòng)輸入程序中,可能要花費(fèi)很多時(shí)間,但如果使用現(xiàn)成的txt文件,則程序在數(shù)秒內(nèi)就可以完成加密操作。

2 使用置換密碼加密文件的源代碼

在前兩章置換密碼測(cè)試程序的基礎(chǔ)上,針對(duì)文件的置換密碼程序引入了transposition Encrypt.py和transpositionDecrypt.py這兩個(gè)文件,這樣就可以調(diào)用encryptMessage()和decryptMessage() 這兩個(gè)函數(shù)。因此,編寫(xiě)這個(gè)新程序?qū)⒉挥弥匦螺斎雰蓚€(gè)函數(shù)的代碼。

選中 File?New File,打開(kāi)一個(gè)新的編輯窗口,將下列代碼輸入編輯窗口并將其存儲(chǔ)為transpositionFileCipher.py。接下來(lái),訪問(wèn)本書(shū)配套資源下載一個(gè)名為frankenstein.txt的文件,并將其放置在與py文件相同的路徑之下,按下F5鍵運(yùn)行這個(gè)程序。

transpositionFileCipher.py

 # 置換密碼加/解密文件
 # https://www.nostarch.com/crackingcodes/ (BSD Licensed)
 import time, os, sys, transpositionEncrypt, transpositionDecrypt
 def main():
   inputFilename = 'frankenstein.txt'
   # 注意,如果具有outputFilename 名稱(chēng)的文件已存在,則此程序
   # 覆蓋該文件
   outputFilename = 'frankenstein.encrypted.txt'
   myKey = 10
   myMode = 'encrypt' # 設(shè)置為'encrypt'或'decrypt'
   # 如果輸入文件不存在,則程序提前終止
   if not os.path.exists(inputFilename):
     print('The file %s does not exist. Quitting...' % (inputFilename))
     sys.exit()
   # 如果輸出文件已存在,則給用戶(hù)退出的機(jī)會(huì)
   if os.path.exists(outputFilename):
     print('This will overwrite the file %s. (C)ontinue or (Q)uit?' %
      (outputFilename))
     response = input('> ')
     if not response.lower().startswith('c'):
       sys.exit()
   # 從輸入文件中讀取消息
   fileObj = open(inputFilename)
   content = fileObj.read()
   fileObj.close()
   print('%sing...' % (myMode.title()))
   # 測(cè)量加/解密所需時(shí)間
   startTime = time.time()
   if myMode == 'encrypt':
     translated = transpositionEncrypt.encryptMessage(myKey, content)
   elif myMode == 'decrypt':
     translated = transpositionDecrypt.decryptMessage(myKey, content)
   totalTime = round(time.time() - startTime, 2)
   print('%sion time: %s seconds' % (myMode.title(), totalTime))
   # 將置換后的消息寫(xiě)入輸出文件
   outputFileObj = open(outputFilename, 'w')
   outputFileObj.write(translated)
   outputFileObj.close()
   print('Done %sing %s (%s characters).' % (myMode, inputFilename,
    len(content)))
   print('%sed file is %s.' % (myMode.title(), outputFilename))
 # 如果運(yùn)行 transpositionCipherFile.py (而不是作為模塊引入),則
 # 調(diào)用main() 函數(shù)
 if __name__ == '__main__':
   main()

3 運(yùn)行置換密碼加密文件程序的樣例

運(yùn)行transpositionFileCipher.py得到的輸出如下。

Encrypting...
Encryption time: 1.21 seconds
Done encrypting frankenstein.txt (441034 characters).
Encrypted file is frankenstein.encrypted.txt.

這樣就創(chuàng)建出了一個(gè)名為frankenstein.encrypted.txt 的新文件,該文件與 transposition FileCipher.py 在同一個(gè)路徑下。使用IDLE文件編輯器打開(kāi)這個(gè)新文件,就可以看到frankenstein.txt 中的文本內(nèi)容被加密后的結(jié)果了。它應(yīng)有的格式如下所示。

PtFiyedleo a arnvmt eneeGLchongnes Mmuyedlsu0#uiSHTGA r sy,n t ys
s nuaoGeL
sc7s,
--snip--

每次加密一個(gè)文件,都可以將加密的結(jié)果發(fā)送給另一個(gè)人去解密它,對(duì)方同樣需要文件置換操作程序的源代碼。

要解密密文,可以對(duì)源代碼進(jìn)行下述改變(粗體部分),隨后再次運(yùn)行這個(gè)程序。

   inputFilename = 'frankenstein.encrypted.txt'
   # 如果具有outputFilename 名稱(chēng)的文件已存在,則此程序
   # 覆蓋該文件
   outputFilename = 'frankenstein.decrypted.txt'
   myKey = 10
   myMode = 'decrypt' # 設(shè)置為 'encrypt'或'decrypt

這時(shí)候運(yùn)行該程序,就會(huì)在當(dāng)前文件夾下創(chuàng)建出一個(gè)名為 frankenstein.decrypted.txt 的新文件,此時(shí)這個(gè)新文件的內(nèi)容和原始明文是一致的。

4 文件操作

在深入研究 transpositionFileCipher.py 文件的源代碼之前,首先要明白Python是如何對(duì)文件進(jìn)行操作的。讀取文件內(nèi)容的3個(gè)步驟分別是打開(kāi)文件、讀取文件內(nèi)容并將其存儲(chǔ)到一個(gè)變量中、關(guān)閉文件。類(lèi)似地,要將新內(nèi)容寫(xiě)入文件中時(shí),首先必須打開(kāi)(或創(chuàng)建)一個(gè)文件,接著將新的內(nèi)容寫(xiě)入其中,最后關(guān)閉這個(gè)文件。

4.1 打開(kāi)文件

Python可以通過(guò)open()方法打開(kāi)一個(gè)文件以供讀取、寫(xiě)入內(nèi)容時(shí)使用,其第一個(gè)參數(shù)為文件名。當(dāng)要打開(kāi)的文件和Python程序處于同一個(gè)文件夾下時(shí),可以直接使用文件名,例如“thetimemachine.txt”,如果當(dāng)前文件夾存在這么一個(gè)文件,則打開(kāi)它的Python指令如下所示。

fileObj = open('thetimemachine.txt')

這樣,一個(gè)文件對(duì)象就被存儲(chǔ)在變量 fileObj 中了,之后進(jìn)行讀寫(xiě)操作時(shí)使用這個(gè)變量即可。

還可以用文件的絕對(duì)路徑(absolute path)作為第一個(gè)參數(shù),這樣引號(hào)內(nèi)就需要包括文件所在的文件夾及其所有父文件夾的名稱(chēng),舉個(gè)例子,類(lèi)似“C:\\Users\\Al\\frankenstein.txt”(Windows系統(tǒng)下),或“/Users/Al/frankenstein.txt”(macOS及Linux系統(tǒng)下)格式的都是絕對(duì)路徑。記住,Windows系統(tǒng)下,反斜線(/)前一定要多加一個(gè)反斜線用于轉(zhuǎn)義。

舉個(gè)例子,若想打開(kāi)“frankenstein.txt”文件,則需要將其路徑以字符串的形式作為open()方法的第一個(gè)參數(shù)(絕對(duì)路徑的格式由使用的操作系統(tǒng)決定)。

fileObj = open('C:\\Users\\Al\\frankenstein.txt')

文件對(duì)象有多種用于讀取、寫(xiě)入和關(guān)閉文件的方法,下面將對(duì)這些方法進(jìn)行詳細(xì)介紹,為方便說(shuō)明這里調(diào)換一下順序。

4.2 數(shù)據(jù)寫(xiě)入及文件關(guān)閉

對(duì)于文件的加密程序而言,在讀取文本內(nèi)容之后就需要將加密的數(shù)據(jù)寫(xiě)入一個(gè)新的文件中,這時(shí)用到的方法就是write()。

要想使用一個(gè)文件對(duì)象的write()方法,首先需要將文件以寫(xiě)模式打開(kāi),即將字符串 &lsquo;w&rsquo; 傳入open()方法作為其二個(gè)參數(shù)。open()方法的第二個(gè)參數(shù)是一個(gè)<span style=“color:#20B2AA”;“font-family: Times New Roman,楷體_GB2312”>可選參數(shù)(optional parameter),這意味著open()方法在沒(méi)有第二個(gè)參數(shù)的情況下仍然能夠被調(diào)用。例如,將下列代碼輸入交互式運(yùn)行環(huán)境中。

>>> fileObj = open('spam.txt', 'w')

這一行以寫(xiě)模式創(chuàng)建了一個(gè)名為“spam.txt”的文件,則可以對(duì)其進(jìn)行編輯。如果在open()方法創(chuàng)建新文件的路徑下存在一個(gè)同名文件,則該同名文件將被重寫(xiě),因此,以寫(xiě)模式使用opne()方法時(shí)需要萬(wàn)分小心。

spam.txt 以寫(xiě)模式打開(kāi)后,就可以調(diào)用write()方法往其中寫(xiě)入內(nèi)容了。write()方法有一個(gè)參數(shù):存儲(chǔ)在一個(gè)字符串中的、將要被寫(xiě)入文件的內(nèi)容。將下列代碼輸入交互式運(yùn)行環(huán)境,把字符串Hello, world!寫(xiě)入 spam.txt 中。

>>> fileObj.write('Hello, world!')13

上述代碼將字符串Hello, world!作為參數(shù)傳入write()方法,把該字符串寫(xiě)入文件 spam.txt 中并打印出數(shù)字13,這個(gè)數(shù)字代表了寫(xiě)入文件中的字符數(shù)。

對(duì)文件的操作執(zhí)行完成之后,需要通過(guò)調(diào)用文件對(duì)象的close()方法告知Python此事。

>>> fileObj.close()

除上述必定會(huì)覆蓋原文件內(nèi)容的寫(xiě)模式之外,還存在一個(gè)附加模式,在該模式下字符串會(huì)被添加到文件已有內(nèi)容的末尾。盡管本章程序中沒(méi)有用到這個(gè)模式,讀者也可以自己嘗試以附加模式打開(kāi)文件,只需要將字符串 &lsquo;a&rsquo; 作為 open() 方法的第二個(gè)參數(shù)即可。

如果在調(diào)用文件對(duì)象的write()方法時(shí),遇到了“io.UnsupportedOperation: not readable”的報(bào)錯(cuò)信息,則可能是因?yàn)闆](méi)有以寫(xiě)模式打開(kāi)文件。調(diào)用open()方法的過(guò)程中若沒(méi)有包括可選參數(shù),則其默認(rèn)值將被自動(dòng)設(shè)置為寫(xiě)模式(&lsquo;r&rsquo;),該模式下只允許使用者調(diào)用文件對(duì)象的read()方法。

4.3 讀取文件

read()方法能夠以字符串的形式返回文件中包含的所有內(nèi)容,為驗(yàn)證其功能,本節(jié)將讀取之前用wirte()方法創(chuàng)建的 spam.txt 文件。在交互式運(yùn)行環(huán)境中運(yùn)行如下代碼。

>>> fileObj = open('spam.txt', 'r')
>>> content = fileObj.read()
>>> print(content)
Hello world!
>>> fileObj.close()

打開(kāi)文件之后創(chuàng)建的文件對(duì)象存儲(chǔ)在變量 fileObj 中,如果該對(duì)象存在,則可以使用read()方法讀取文件的內(nèi)容并將其存儲(chǔ)在變量 content 中,隨后打印該變量的值。執(zhí)行完上述對(duì)文件對(duì)象的操作后,使用close()方法關(guān)閉該文件。

如果遇到“IOError: [Errno 2] No such file or directory”的報(bào)錯(cuò)信息,請(qǐng)確保想要打開(kāi)的文件就在讀者認(rèn)為的路徑下,并再次檢查文件名和文件夾的名稱(chēng)是否正確輸入。(<span style=“color:#20B2AA”;“font-family: Times New Roman,楷體_GB2312”>文件夾即<span style=“color:#20B2AA”;“font-family: Times New Roman,楷體_GB2312”>路徑。)

在transpositionFileCipher.py程序中,對(duì)文件進(jìn)行的加密和解密需要用到上文提到的所有open()、write() 及 close()方法。

5 創(chuàng)建main()函數(shù)

transpositionFileCipher.py 程序的第一部分應(yīng)該看起來(lái)十分眼熟,第4行是一個(gè)import 語(yǔ)句,引入了transpositionEncypt.py和transpositionDecrypt.py兩個(gè)程序和Python庫(kù)中的time、os及sys模塊,接下來(lái)的部分即main()函數(shù),其中創(chuàng)建了程序需要用到的變量。

 # 置換密碼加/解密文件
 # https://www.nostarch.com/crackingcodes/ (BSD Licensed)
 import time, os, sys, transpositionEncrypt, transpositionDecrypt
 def main():
    inputFilename = 'frankenstein.txt'
    # 注意,如果具有outputFilename 名稱(chēng)的文件已存在,則此程序
    # 覆蓋該文件
    outputFilename = 'frankenstein.encrypted.txt'
    myKey = 10
    myMode = 'encrypt' # 設(shè)置為 'encrypt'或'decrypt'

變量 inputFilename 存儲(chǔ)了待讀取文件名的字符串,而加密后(或解密后)的內(nèi)容寫(xiě)入以變量 outputFilename 的值命名的文件內(nèi)。程序涉及的置換密碼使用一個(gè)整數(shù)作為密鑰,并存儲(chǔ)在myKey中,同時(shí),程序需要一個(gè)變量 myMode 存儲(chǔ)字符串encrypt或decrypt以決定對(duì) inputFilename 存儲(chǔ)的文件進(jìn)行何種操作。在讀取 inputFilename 文件之前,首先要使用 os.path.exists() 檢查該文件是否存在。

6 檢查文件是否存在

讀取文件往往不會(huì)存在什么危害,但往文件中寫(xiě)入內(nèi)容時(shí)就需要多加小心了,這是因?yàn)橐詫?xiě)模式調(diào)用open()方法時(shí),若原文件已存在,會(huì)覆蓋掉原文件中的內(nèi)容。針對(duì)這個(gè)潛在問(wèn)題,程序可以使用os.path.exists() 方法,檢查要打開(kāi)的文件是否已經(jīng)存在。

6.1 os.path.exists() 方法

os.path.exists()方法只有一個(gè)參數(shù),即文件名或指向文件的文件路徑,如果文件存在,則返回True;否則返回False。該方法包含在path模塊內(nèi),而path模塊包含在 os 模塊中,因此引入 os 模塊時(shí),path模塊一并被引入了。

將下列代碼輸入交互式運(yùn)行環(huán)境。

  >>> import os
 ? >>> os.path.exists('spam.txt')
  False
  >>> os.path.exists('C:\\Windows\\System32\\calc.exe') # Windows
  True
  >>> os.path.exists('/usr/local/bin/idle3') # macOS
  False
  >>> os.path.exists('/usr/bin/idle3') # Linux
  False

在本例中,os.path.exists()方法證實(shí)了Windows系統(tǒng)中存在calc.exe文件。當(dāng)然,只有在Windows系統(tǒng)下運(yùn)行Python的時(shí)候,才能得到上面的結(jié)果。記住,在Windows下輸入文件路徑時(shí),要在反斜杠前再添加一個(gè)反斜杠進(jìn)行轉(zhuǎn)義。如果使用的是macOS,則上述代碼中只有macOS的樣例會(huì)返回True,同理在Linux系統(tǒng)下只有最后一個(gè)例子會(huì)返回True。如果沒(méi)有給出完整的路徑?,則Python會(huì)檢查當(dāng)前的工作路徑;對(duì)IDLE交互式運(yùn)行環(huán)境而言,當(dāng)前工作路徑即安裝了Python的文件夾。

6.2 使用os.path.exists()方法檢查輸入的文件是否存在

本章程序的第14~17行使用了os.path.exists()檢查 inputFilename 中的文件是否存在,如果沒(méi)有這一步,就無(wú)法獲得用于加解密的文件。

14.   # 如果輸入文件不存在,則程序提前終止
15.   if not os.path.exists(inputFilename):
16.     print('The file %s does not exist. Quitting...' % (inputFilename))
17.     sys.exit()

若文件不存在,程序?qū)橛脩?hù)彈出提示并退出。

7 使用字符串方法令用戶(hù)的輸入更靈活

接下來(lái),程序需要檢查是否存在與 outputFilename 同名的文件,如果存在,則詢(xún)問(wèn)用戶(hù)是輸入c繼續(xù)運(yùn)行程序還是輸入q退出程序。由于用戶(hù)可能會(huì)輸入多種回復(fù),例如c、C,甚至是單詞Continue,因此程序需要確??梢越邮账羞@些輸入,要實(shí)現(xiàn)這一功能,必須使用更多字符串方法。

7.1 upper()、lower()和title()字符串方法

upper()和lower()方法能夠分別以全大寫(xiě)和全小寫(xiě)返回它們所接收的字符串。將下列代碼輸入交互式運(yùn)行環(huán)境中以分辨這兩個(gè)方法是如何對(duì)同一個(gè)字符串進(jìn)行操作的。

>>> 'Hello'.upper()
'HELLO'
>>> 'Hello'.lower()
'hello'

lower()、upper()方法以小寫(xiě)和大寫(xiě)的形式返回字符串,title()方法也和它們類(lèi)似,然而該方法返回的是各單詞首字母大寫(xiě)的字符串,這意味著字符串中的每個(gè)單詞的首字母是大寫(xiě),而其余所有字母都是小寫(xiě)。將下列代碼輸入交互式運(yùn)行環(huán)境中。

>>> 'hello'.title()
'Hello'
>>> 'HELLO'.title()
'Hello'
>>> 'extra! extra! man bites shark!'.title()
'Extra! Extra! Man Bites Shark!'

本章程序會(huì)在稍后部分使用title()方法,來(lái)為輸出的信息格式化。

7.2 startswith()和endswith()方法

若字符串以參數(shù)指定的字符串開(kāi)頭,則startwith()方法返回True。將下列代碼輸入交互式運(yùn)行環(huán)境。

 >>> 'hello'.startswith('h')
 True
 >>> 'hello'.startswith('H')
 False
 >>> spam = 'Albert'
 ? >>> spam.startswith('Al')
 True

startswith()方法對(duì)大小寫(xiě)敏感,同時(shí)也可以接收多字符的字符串?。

endswith()方法用于檢查字符串是否以某一個(gè)特定字符串結(jié)尾。將下列代碼輸入交互式運(yùn)行環(huán)境。

 >>> 'Hello world!'.endswith('world!')
 True
? >>> 'Hello world!'.endswith('world')
 False

字符串的匹配必須一字不差,注意,由于?中缺少感嘆號(hào),因此endswith()的返回結(jié)果為False。

7.3 在程序中使用上述字符串方法

之前提到過(guò),程序需要能夠接收所有以字母C開(kāi)頭的響應(yīng),無(wú)論大小寫(xiě),這意味著不管用戶(hù)輸入的是C、continue、c還是其他以C開(kāi)頭的字符串,程序都需要對(duì)文件進(jìn)行重寫(xiě)。使用lower()和upper()方法可以使程序在處理用戶(hù)輸入的字符串時(shí)更加靈活。

   # 如果輸出文件已存在,則給用戶(hù)退出的機(jī)會(huì)
   if os.path.exists(outputFilename):
     print('This will overwrite the file %s. (C)ontinue or (Q)uit?' %
     (outputFilename))
     response = input('> ')
     if not response.lower().startswith('c'):
       sys.exit()

第23行,取字符串的首字母并使用startswith()方法來(lái)檢查它是否為C。由于startswith()方法大小寫(xiě)敏感且檢查的是小寫(xiě)的 &lsquo;c&rsquo;,因此在調(diào)用它之前使用lower()方法改變r(jià)esponse字符串的首字母,使其保持為小寫(xiě)的 &lsquo;c&rsquo;。如果用戶(hù)沒(méi)有輸入以C開(kāi)頭的響應(yīng),則if的條件語(yǔ)句將得到True(因?yàn)槠渲邪粋€(gè)not),于是sys.exit()語(yǔ)句被調(diào)用,程序終止。從技術(shù)上來(lái)說(shuō),用戶(hù)不需要輸入q來(lái)退出,任何不以C開(kāi)頭的字符串都會(huì)導(dǎo)致 sys.exit() 方法的調(diào)用,從而使程序退出。

8 讀取作為輸入的文件

第27行,程序開(kāi)始使用本章開(kāi)頭討論過(guò)的文件對(duì)象方法。

26.   # 從輸入文件中讀取消息
27.   fileObj = open(inputFilename)
28.   content = fileObj.read()
29.   fileObj.close()
30.
31.   print('%sing...' % (myMode.title()))

第27~29行打開(kāi)了與inputFilename同名的文件,讀取它的內(nèi)容并存儲(chǔ)到變量 content 中,隨后關(guān)閉了文件。讀取完文件之后,第31行為用戶(hù)輸出了一行提示信息,告知他們加密或解密已經(jīng)開(kāi)始。由于變量 myMode 中存儲(chǔ)著字符串encrypt或decrypt,調(diào)用title()字符串方法將它的首字母轉(zhuǎn)換為大寫(xiě),又在它之后添加了ing字符串,因此最終它顯示的內(nèi)容是 Encrypting&hellip;或者Decrypting&hellip;。

9 計(jì)算加/解密所需的時(shí)間

對(duì)一個(gè)文件進(jìn)行全面的加/解密往往要比僅加/解密一個(gè)短短的字符串要耗時(shí)多,而用戶(hù)可能會(huì)想要了解加/解密文件的過(guò)程具體需要多長(zhǎng)時(shí)間。程序可以使用 time 模塊計(jì)算加/解密過(guò)程所需的時(shí)間長(zhǎng)度。

9.1 time模塊和time.time()方法

time.time()方法以浮點(diǎn)數(shù)的形式返回從1970年1月1日至當(dāng)前時(shí)間的總秒數(shù),這個(gè)數(shù)字被稱(chēng)為<span style=“color:#20B2AA”;“font-family: Times New Roman,楷體_GB2312”>UNIX時(shí)間戳。將下列代碼輸入交互式運(yùn)行環(huán)境,觀察該方法的運(yùn)行結(jié)果。

>>> import time
>>> time.time()
1540944000.7197928
>>> time.time()
1540944003.4817972

由于time.time()返回的是一個(gè)浮點(diǎn)數(shù),因此它可以精確到<span style=“color:#20B2AA”;“font-family: Times New Roman,楷體_GB2312”>毫秒。當(dāng)然,time.time()顯示的時(shí)間由程序員調(diào)用它的時(shí)間決定,并且要將它轉(zhuǎn)化為正常的時(shí)間也有一定難度,比如很難看出 1540944000.7197928 就是2018年的10月30日(星期二)的下午5點(diǎn)左右。然而time.time()非常適合于比較兩次調(diào)用time.time()之間相差的秒數(shù),因此程序可以使用它計(jì)算運(yùn)行時(shí)間。

舉個(gè)例子,如果按照下述代碼,把前一段代碼中兩次調(diào)用time.time()的時(shí)間相減,就可以得到兩次調(diào)用中間經(jīng)過(guò)的時(shí)間了。

>>> 1540944003.4817972 - 1540944000.7197928
2.7620043754577637

如果想要編寫(xiě)對(duì)日期和時(shí)間進(jìn)行操作的代碼,可以查閱 datetime 模塊的相關(guān)資料。

9.2 在程序中使用time.time()方法

第34行,time.time()方法返回了當(dāng)前時(shí)間并將其存儲(chǔ)到名為 startTime 的變量中;第35~38行根據(jù)變量 myMode 的值是encrypt還是decrpt來(lái)調(diào)用encryptMessage()或decryptMessage()。

33.   # 測(cè)量加/解密所需時(shí)間
34.   startTime = time.time()
35.   if myMode == 'encrypt':
36.     translated = transpositionEncrypt.encryptMessage(myKey, content)
37.   elif myMode == 'decrypt':
38.     translated = transpositionDecrypt.decryptMessage(myKey, content)
39.   totalTime = round(time.time() - startTime, 2)
40.   print('%sion time: %s seconds' % (myMode.title(), totalTime))

加/解密完成后,第39行再次調(diào)用了time.time()方法,并用這次調(diào)用的時(shí)間減去startTime,得到的結(jié)果是兩次調(diào)用time.time()方法的間隔時(shí)間。time.time() - startTime表達(dá)式將所得結(jié)果傳給round()方法,也就是將其取整,因?yàn)槌绦虿⒉恍枰_到毫秒。這個(gè)整數(shù)值賦值給了變量 totalTime。第40行使用了字符串連接,并為用戶(hù)打印了程序所處的模式及用于加密或解密的時(shí)長(zhǎng)。

10 將輸出寫(xiě)入文件

加密后(或解密后)的文件內(nèi)容現(xiàn)在存儲(chǔ)在變量translated中,但這個(gè)變量在程序終止時(shí)就會(huì)被釋放,因此需要一個(gè)文件來(lái)存儲(chǔ)這個(gè)字符串,這樣哪怕程序停止執(zhí)行,結(jié)果仍能保存。第43~45行的代碼進(jìn)行了這部分操作,打開(kāi)了一個(gè)新文件[將w傳給open()方法]并調(diào)用文件對(duì)象的write()方法。

42.   # 將置換后的消息寫(xiě)入輸出文件
43.   outputFileObj = open(outputFilename, 'w')
44.   outputFileObj.write(translated)
45.   outputFileObj.close()

接下來(lái)在第47行和第48行打印了更多信息,告知用戶(hù)輸出文件的名稱(chēng)及加/解密過(guò)程已經(jīng)結(jié)束。

47.   print('Done %sing %s (%s characters).' % (myMode, inputFilename,
     len(content)))
48.   print('%sed file is %s.' % (myMode.title(), outputFilename))

第48行是main()函數(shù)的最后一行。

11 調(diào)用main()函數(shù)

第53行和第54行(在第6行def語(yǔ)句執(zhí)行之后被執(zhí)行的兩行)調(diào)用了main()函數(shù),前提是當(dāng)前程序處于運(yùn)行狀態(tài)而非被引用的狀態(tài)下。

51. # 如果運(yùn)行 transpositionCipherFile.py (而不是作為模塊引入),則
52. # 調(diào)用main() 函數(shù)
53. if __name__ == '__main__':
54.   main()

讀到這里,這篇“Python編程密碼學(xué)文件加密與解密的方法”文章已經(jīng)介紹完畢,想要掌握這篇文章的知識(shí)點(diǎn)還需要大家自己動(dòng)手實(shí)踐使用過(guò)才能領(lǐng)會(huì),如果想了解更多相關(guān)內(nèi)容的文章,歡迎關(guān)注億速云行業(yè)資訊頻道。

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI