博主在前兩篇博文分別介紹了加密RAR文件的解壓https://www.cnblogs.com/kangbazi666/p/13646308.html和加密ZIP文件的解壓https://www.cnblogs.com/kangbazi666/p/13666783.html,后面又開始嘗試了兩類文件的加密壓縮,在查閱相關資料后,發現rarfile庫和zipfile庫都不支持加密壓縮,只能實現普通壓縮,因此另謀他路,發現可以調用CMD命令進行壓縮,下面將分別介紹RAR和ZIP文件的加密壓縮。
調用壓縮成RAR的CMD命令為:
C:\"Program Files"\WinRAR\WinRAR.exe a -p123 C:\test.rar C:\test.txt
命令參數解釋:第一個參數為WinRAR軟件的安裝路徑,第二個參數a表示添加壓縮,第三個參數用於設置壓縮密碼,-p加上密碼“123”,第四個參數為壓縮文件的輸出路徑及其壓縮的文件名,第五個參數為需要壓縮的文件路徑,如果是單個文件需要具體到文件名,如果是文件夾下所有文件,只需到當前文件夾路徑。
調用壓縮成ZIP的CMD命令同RAR,只是輸出路徑不同,需將后綴改為.zip:
C:\"Program Files"\WinRAR\WinRAR.exe a -p123 C:\test.zip C:\test.txt
因此首先需要在電腦上安裝WinRAR文件,下載鏈接為:http://www.winrar.com.cn/download.htm ,官網最新版本的WInRAR軟件加密方式AES-256加密,如果需要CRC32加密,也即傳統加密方式,可以下載WinRAR5.4版本,博主的百度網盤分享鏈接:https://pan.baidu.com/s/1IyC9TKJ4E8LmMBZAN2kGXw 提取碼:dgkt
在弄清CMD命令后,利用Python實現就很容易了,有兩種實現方式:
(1)os.system
(2)subprocess.Popen
博主采用了os模塊的system實現,下面分別介紹RAR和ZIP的加密壓縮實現:
(1)RAR加密壓縮:
1 import os 2 password = "123"
3 dirpath = "C:\test.txt"#待壓縮的文件路徑及文件
4 outFullName = "C:\test.rar"#壓縮文件的輸出路徑及文件名
5 cmd = r'C:\"Program Files"\WinRAR\WinRAR.exe a -p%s %s %s' % (password, outFullName, dirpath)#password為壓縮密碼
6 os.system(cmd)
如果上面的代碼調用的WinRAR為比較新的版本,加密方式即為AES-256加密,如果你想要實現傳統加密,有兩種方法實現:(1)安裝前面介紹的WinRAR5.4版本;(2)可以在命令行中添加一個參數:-mezl
代碼實現也即將第5行修改為:
cmd = r'C:\"Program Files"\WinRAR\WinRAR.exe a -p%s -mezl %s %s' % (password, outFullName, dirpath)
(2)ZIP加密壓縮:
代碼同RAR加密壓縮,只需修改第4行中的壓縮文件的輸出名為.zip即可
import os password = "123" dirpath = "C:\test.txt"#待壓縮的文件路徑及文件
outFullName = "C:\test.zip"#壓縮文件的輸出路徑及文件名
cmd = r'C:\"Program Files"\WinRAR\WinRAR.exe a -p%s %s %s' % (password, outFullName, dirpath)#password為壓縮密碼
os.system(cmd)
博主在實現過程中測試密碼的時候發現,CMD命令中也存在特殊字符的轉義問題,例如博主在測試的密碼中帶有雙引號時,轉義遇到了很大的麻煩,因為Python和CMD中都需要對雙引號進行轉義,在查詢很大資料,嘗試了"" /符號進行轉義都無果,最后進行大量嘗試,發現了CMD中兩種方式能對雙引號進行轉義,(博主的密碼為“123):
(1)雙引號用兩個雙引號引起來,最后再加一個雙引號,此時壓縮密碼是“123
(2)雙引號前面再加一個雙引號,此時壓縮密碼仍然是“123
因此博主在代碼上考慮了引號:
import os def Rar(): cmd = r'C:\"Program Files"\WinRAR\WinRAR.exe a -p%s -mezl %s %s' % (password, outFullName, dirpath) print(cmd) if __name__ == "__main__": dirpath = "C:\\Test" outFullName = "C:\\test.rar" pwd = input("密碼") i = '"'if i in pwd: password = pwd.replace('"','""') print(password) else: password = pwd Rar()
當然CMD中還有/等符號的轉義,還有空格符號的一些處理,有興趣的朋友都可以去了解一下。