Python實現加密壓縮成RAR或ZIP文件

       部落客在前兩篇博文分別介紹了加密RAR文件的解壓//www.cnblogs.com/kangbazi666/p/13646308.html和加密ZIP文件的解壓//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文件,下載鏈接為://www.winrar.com.cn/download.htm ,官網最新版本的WInRAR軟體加密方式AES-256加密,如果需要CRC32加密,也即傳統加密方式,可以下載WinRAR5.4版本,部落客的百度網盤分享鏈接://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中還有/等符號的轉義,還有空格符號的一些處理,有興趣的朋友都可以去了解一下。

Tags: