来源:早起<em>Python</em> 作者:陈熹 大家好,我是早起。本文将分享如何利用 <em>Python</em> 对 PDF 进行加密和解密操作,主要利用到之前多次介绍过的PyPDF2模块。PDF 加密 在之前的文章PDF合并、拆分、水印、加密中简单
2021-05-17 14:30:06
來源:早起Python
作者:陳熹
大家好,我是早起。
本文將分享如何利用 Python 對 PDF 進行加密和解密操作,主要利用到之前多次介紹過的PyPDF2模組。
PDF 加密
在之前的文章PDF合併、拆分、水印、加密中簡單提到過加密一個 PDF 檔案的方法,我們先拿自己隨意的一個PDF 檔案試一下:
from PyPDF2 import PdfFileWriter, PdfFileReaderpath = r'C:xxx' # 這裡填寫目標 PDF 所在的路徑pdf_reader = PdfFileReader(path + r'test.pdf')pdf_writer = PdfFileWriter()for page in range(pdf_reader.getNumPages()):pdf_writer.addPage(pdf_reader.getPage(page))pdf_writer.encrypt('a123') # 設定密碼為 a123with open(path + r'test.pdf', 'wb') as out: pdf_writer.write(out)
上面程式碼的運行邏輯是:例項化一個 PDF 寫入器和讀取器,讀取器讀取完目標 PDF 檔案後,一頁一頁交給寫入器,然後對寫入器設定密碼並輸出。看一下運行結果:
可見這個 PDF 檔案成功設定上了密碼,如果有多個PDF需要加密,可以寫一個簡單的迴圈利用上述指令碼批量處理,此處不再展開說明。
PDF 已知密碼解密
如果知道密碼的情況下,想直接取消 PDF 的加密,可以用.decrypt,解密的過程需要讀取器和寫入器共同配合。但區別於加密.encrypt,.decrypt 是針對讀取器進行解密的,而不是寫入器
from PyPDF2 import PdfFileWriter, PdfFileReader
path = r'C:xxx'pdf_reader = PdfFileReader(path + r'test.pdf')pdf_reader.decrypt('a123') #pdf_writer = PdfFileWriter()for page in range(pdf_reader.getNumPages()):pdf_writer.addPage(pdf_reader.getPage(page))with open(path + r'test.pdf', 'wb') as out: pdf_writer.write(out)
上面程式碼的運行邏輯是:首先用讀取器讀取加密檔案,然後直接在讀取器上使用.decrypt進行解密,逐頁傳到剛例項化的寫入器後統一輸出,就完成了解密
PDF 暴力解密
暴力破解,其實就是通過手上已經有的密碼庫,或者完全通過數字、字母、符號的窮舉,將可能的密碼都放進去,逐個嘗試直到成功。
「目前暴力破解只適用於已知密碼位數少,由簡單的數字、字母構成」
假設今天要破解的密碼就是a123,已知密碼 4 位且由數字和小寫字母組成。破解又分為兩種情況:
1. 手上有密碼本
第一種情況,知道大概密碼,可以整理成一個
password.txt,保證可能的密碼一定在其中:
首先讀取.txt檔案獲取其中所有密碼(示例檔案只有 9 個密碼):
passw = []path = r'C:Scientific ResearchPython'file = open(path + r'password.txt')for line in file.readlines():passw.append(line.strip())print(passw)file.close()
然後就可以用密碼本的密碼做暴力破解:
from PyPDF2 import PdfFileReader
passw = []path = r'C:xxx'file = open(path + r'password.txt')for line in file.readlines():passw.append(line.strip())file.close()path = r'C:xxx'pdf_reader = PdfFileReader(path + r'test).pdf')for i in passw: if pdf_reader.decrypt(i): print(f'破解成功,密碼為{i}') else: print(f'破解不成功,密碼{i}錯誤')
2. 手術無密碼本,完全窮舉
首先介紹
itertools,可以構建含需要組合的生成器供後續迭代:
import itertoolsmylist = ("".join(x) for x in itertools.product("0123456789abcdef", repeat=4))print(next(mylist))
利用這個方法就可以用while迴圈嘗試暴力破解(為了減少時間,生成器用"abc123"生成組合):
import itertools
from PyPDF2 import PdfFileReadermylist = ("".join(x) for x in itertools.product("123abc", repeat=4))path = r'C:xxx'pdf_reader = PdfFileReader(path + r'test.pdf')while True:i = next(mylist) if pdf_reader.decrypt(i): print(f'破解成功,密碼為{i}') break else: print(f'破解不成功,密碼{i}錯誤')
可以看到最後也成功破解了,但需要注意:但即使是這麼簡單的組合也耗費了一點時間,如果複雜的密碼破解難度和破解時間就指數級增長了,暴力的窮舉法就不一定適用,可以根據需求具體調整規則,縮小範圍再進行嘗試。
相關文章
来源:早起<em>Python</em> 作者:陈熹 大家好,我是早起。本文将分享如何利用 <em>Python</em> 对 PDF 进行加密和解密操作,主要利用到之前多次介绍过的PyPDF2模块。PDF 加密 在之前的文章PDF合并、拆分、水印、加密中简单
2021-05-17 14:30:06
而对华为来说,鸿蒙的出现是自己打破封锁的第一步、替换<em>安卓</em>的第一步。少量“花粉”升级鸿蒙,和<em>安卓</em>相比到底如何?在经历长达四个多月将近五个月的内测工作之后,鸿蒙的Beta公测版正式公布,不少“花粉”都
2021-05-17 14:01:06
对于海外的机顶盒也是这样的,最贵的是苹果TV盒子,另外就是谷歌<em>安卓</em>TV,这两个都是支持真4K的,比如刚才说的Netflix、Disney+、HBO Max,完全支持真4K的内容。其中还有一点就是我们最关心的,它里面都支持基于高
2021-05-17 14:00:41
说到底,鸿蒙的真正目的并非取代<em>安卓</em>,而是开创5G时代的物联网发展,再加上华为有5G技术作为靠山,所以华为可以说是物联网行业当中的“黑马”,这一点是<em>安卓</em>所无法比拟的。但面对这一种情况我们也不能
2021-05-17 14:00:36
似乎是察觉到我的视线在身上停留过久,陆禹承从<em>iPad</em>上移开眼神看向我,<em>iPad</em>屏幕上的光经过他鼻梁上的镜片反射到我这里,我莫名就感觉眼睛一痛。“看什么?”哪里来的冷箭。我揉了揉汗毛竖起胳膊,摇了摇头说
2021-05-17 14:00:29
我们经常在朋友圈看见九宫格照片,看着是九张图拼成的一张图片,但是点开发送其实就是一张图,这个是怎么做到的呢?不要慌快趁520那天还没有到来在我这里学会这个技能,到时候也能朋友圈秀了!!! 1.首先打开<em>word</em>,
2021-05-17 14:00:03