教你用python實現(xiàn)一個加密的文字處理器
這是一個類似于記事本的文字處理器。與正常的記事本不同的是,它會將文本文檔進行加密,確保無法被常規(guī)的程序打開。
由于本人是一位業(yè)余編程愛好者,對于“python之禪”之類的規(guī)則比較不以為然,因此本程序代碼也許有些許凌亂(當然不利于后期修改)。
這篇文章我早已發(fā)布過,但當時只給出了代碼,并加了一些注釋?,F(xiàn)在,我希望在這里詳細解釋這個程序。我會分一個月或更久更新這篇文章,請讀者耐心等待。
首先,對于一個適合我們廣大中華兒女使用的程序,我們不可避免地要使用中文。這就需要對編碼進行聲明:
# coding:utf-8
然后,就到了模塊導(dǎo)入的環(huán)節(jié)了。我們這里需要tkinter,windnd,os和sys。windnd可以用pip安裝,tkinter則需要在安裝python時勾選:
from tkinter import * from tkinter.filedialog import * from tkinter.messagebox import * import windnd import os import sys
接下來,我們會看到這樣一段代碼:
try: filename = sys.argv[1] except: filename = ""
這是干什么的呢?我們知道,對于exe程序,有一個“Open with”功能,也就是可以將拖動到exe文件或其快捷方式的文件打開。事實上,py文件也有這個功能,但是多數(shù)情況下這樣操作后只能使程序正常運行,而不能對文件進行任何操作。而“sys.argv[1]”的作用就是,讀取這個文件的路徑信息。這樣,我們就可以用open或sys庫里的一些指令進行對文件的操作了。
def encryption(c, d): c = list(c + d) g=list(d) d=0 for i in g: d*=ord(i) d=round(abs(d)**0.5) f="0x" for i in c: e=str(ord(i)+d) d=round(300*(d**0.5)) f=f+e+"a" f=eval(f[:-1]) return (f) def decrypt(c,d): c=hex(int(c)) print(c) c=c[2:].split("a") z=d g = list(d) d = 0 for i in g: d *= ord(i) d = round(abs(d) ** 0.5) f="" for i in c: e = chr(int(i)-d) d = round(300 * (d ** 0.5)) f = f + e if f[-len(z):]==z: f=f[:-len(z)] return (f) else: c="bbc"+12
這一段就比較勁爆了。它定義了兩個函數(shù),一個用于加密,另外一個用于解密(順便說一句,我英語不太好,有的函數(shù)或變量的名字可能比較古怪,請見諒)。
encryption是加密的函數(shù)(呃,這個應(yīng)該叫做encrypt,我編這個程序時大腦有些短路,但既然已經(jīng)這樣了,也就不改了),它會將明文(輸入的c)通過與密鑰d有關(guān)的某些運算,得出一個十六進制數(shù),然后將其轉(zhuǎn)化為十進制。同時,為了確保解密結(jié)果唯一,將密鑰一起連接在明文上,起校驗作用。在這里,對于明文的每一個字符都會將加密過程中實際使用的密鑰進行變動,因此基本是不可能通過字符出現(xiàn)頻率的規(guī)律來破解的。由于密鑰是字符,暴力拆解也基本不可能。
decrypt是解密,它大致就是encryption的逆操作,同時如果校驗的結(jié)果有誤,或是遇到其他解密失敗的情況它會產(chǎn)生錯誤(因此使用時需要try-except,來確保程序不會退出,同時對解密失敗的情況進行處理)。
接下來是基本的文件操作部分:
def mynew(aaa=1): ? ? global top, filename, textPad ? ? top.title("無標題 - 加密文本編輯器") ? ? filename = None ? ? textPad.delete(1.0, END) ? ? textPad.insert(1.0, "") def myopen(aaa=1): ? ? global filename,kkk ? ? filename = askopenfilename() ? ? if filename == "": ? ? ? ? filename = None ? ? else: ? ? ? ? top.title(os.path.basename(filename)+" - 加密文本編輯器") ? ? ? ? format=os.path.basename(filename)[os.path.basename(filename).find(".")+1:] ? ? ? ? textPad.delete(1.0, END) ? ? ? ? try: ? ? ? ? ? ? f = open(filename, 'rb') ? ? ? ? ? ? c = f.read() ? ? ? ? ? ? ccc = str(c)[2:-1] ? ? ? ? ? ? ccc.replace("\\","") ? ? ? ? ? ? textPad.insert(1.0,decrypt(ccc,format)) ? ? ? ? ? ? kkk=1 ? ? ? ? except: ? ? ? ? ? ? f.close() ? ? ? ? ? ? try: ? ? ? ? ? ? ? ? f = open(filename, 'r', encoding="gbk") ? ? ? ? ? ? ? ? try: ? ? ? ? ? ? ? ? ? ? c = f.read() ? ? ? ? ? ? ? ? except: ? ? ? ? ? ? ? ? ? ? f.close() ? ? ? ? ? ? ? ? ? ? f = open(filename, 'r', encoding="utf-8") ? ? ? ? ? ? ? ? ? ? c = f.read() ? ? ? ? ? ? ? ? textPad.insert(1.0, c) ? ? ? ? ? ? ? ? kkk = 0 ? ? ? ? ? ? except: ? ? ? ? ? ? ? ? f.close() ? ? ? ? ? ? ? ? f = open(filename, 'rb') ? ? ? ? ? ? ? ? c = f.read() ? ? ? ? ? ? ? ? textPad.insert(1.0, c) ? ? ? ? ? ? ? ? kkk=0 ? ? ? ? f.close() def mysave(aaa=1): ? ? global filename,kkk ? ? try: ? ? ? ? msg = textPad.get(1.0, 'end')[0:-1] ? ? ? ? if kkk==0: ? ? ? ? ? ? f = open(filename, 'w', encoding="utf-8") ? ? ? ? ? ? f.write(msg) ? ? ? ? else: ? ? ? ? ? ? f = open(filename, 'wb') ? ? ? ? ? ? fffff = str(encryption(msg, format)) ? ? ? ? ? ? fffff = eval("b'{}'".format(fffff)) ? ? ? ? ? ? print(fffff) ? ? ? ? ? ? f.write(fffff) ? ? ? ? f.close() ? ? except: ? ? ? ? mysaveas() def mysaveas(aaa=1): ? ? global filename ? ? f = asksaveasfilename(initialfile="無標題.txt") ? ? filename = f ? ? format = os.path.basename(filename)[os.path.basename(filename).find(".") + 1:] ? ? msg = textPad.get(1.0, 'end')[0:-1] ? ? if not format == "py" and not format=="bat" and not format == "pyw"and not format == "cmd": ? ? ? ? fh = open(filename, 'wb') ? ? ? ? fffff = str(encryption(msg, format)) ? ? ? ? fffff = eval("b'{}'".format(fffff)) ? ? ? ? print(fffff) ? ? ? ? fh.write(fffff) ? ? else: ? ? ? ? fh = open(filename, 'w', encoding="utf-8") ? ? ? ? fh.write(msg) ? ? fh.close() ? ? top.title(os.path.basename(f)+" - 加密文本編輯器") def opened(files): ? ? global filename,kkk ? ? ff = '\n'.join((item.decode('gbk') for item in files)) ? ? filename = ff ? ? if filename == "": ? ? ? ? filename = None ? ? else: ? ? ? ? top.title(os.path.basename(filename) + " - 加密文本編輯器") ? ? ? ? format = os.path.basename(filename)[os.path.basename(filename).find(".") + 1:] ? ? ? ? textPad.delete(1.0, END) ? ? ? ? try: ? ? ? ? ? ? f = open(filename, 'rb') ? ? ? ? ? ? c = f.read() ? ? ? ? ? ? ccc = str(c)[2:-1] ? ? ? ? ? ? ccc.replace("\\", "") ? ? ? ? ? ? textPad.insert(1.0, decrypt(ccc, format)) ? ? ? ? ? ? kkk = 1 ? ? ? ? except: ? ? ? ? ? ? f.close() ? ? ? ? ? ? try: ? ? ? ? ? ? ? ? f = open(filename, 'r', encoding="gbk") ? ? ? ? ? ? ? ? try: ? ? ? ? ? ? ? ? ? ? c = f.read() ? ? ? ? ? ? ? ? except: ? ? ? ? ? ? ? ? ? ? f.close() ? ? ? ? ? ? ? ? ? ? f = open(filename, 'r', encoding="utf-8") ? ? ? ? ? ? ? ? ? ? c = f.read() ? ? ? ? ? ? ? ? textPad.insert(1.0, c) ? ? ? ? ? ? ? ? kkk = 0 ? ? ? ? ? ? except: ? ? ? ? ? ? ? ? f.close() ? ? ? ? ? ? ? ? f = open(filename, 'rb') ? ? ? ? ? ? ? ? c = f.read() ? ? ? ? ? ? ? ? textPad.insert(1.0, c) ? ? ? ? ? ? ? ? kkk = 0 ? ? ? ? f.close() def mynew(aaa=1): ? ? global top, filename, textPad ? ? top.title("無標題 - 加密文本編輯器") ? ? filename = None ? ? textPad.delete(1.0, END) ? ? textPad.insert(1.0, "")
首先說mynew。這里有一個可選參數(shù)a,這是因為通過bind激活函數(shù)會輸入一個參數(shù)(這點我非常反感),為了不讓程序運行出錯,就添加了一個可選參數(shù)。這個其實沒啥好說。global后面是所需的全局變量,然后就是設(shè)置窗口名稱、文件名稱,并清空輸入框,很簡單,很明了。
def myopen(aaa=1): ? ? global filename,kkk ? ? filename = askopenfilename() ? ? if filename == "": ? ? ? ? filename = None ? ? else: ? ? ? ? top.title(os.path.basename(filename)+" - 加密文本編輯器") ? ? ? ? format=os.path.basename(filename)[os.path.basename(filename).find(".")+1:] ? ? ? ? textPad.delete(1.0, END) ? ? ? ? try: ? ? ? ? ? ? f = open(filename, 'rb') ? ? ? ? ? ? c = f.read() ? ? ? ? ? ? ccc = str(c)[2:-1] ? ? ? ? ? ? ccc.replace("\\","") ? ? ? ? ? ? textPad.insert(1.0,decrypt(ccc,format)) ? ? ? ? ? ? kkk=1 ? ? ? ? except: ? ? ? ? ? ? f.close() ? ? ? ? ? ? try: ? ? ? ? ? ? ? ? f = open(filename, 'r', encoding="gbk") ? ? ? ? ? ? ? ? try: ? ? ? ? ? ? ? ? ? ? c = f.read() ? ? ? ? ? ? ? ? except: ? ? ? ? ? ? ? ? ? ? f.close() ? ? ? ? ? ? ? ? ? ? f = open(filename, 'r', encoding="utf-8") ? ? ? ? ? ? ? ? ? ? c = f.read() ? ? ? ? ? ? ? ? textPad.insert(1.0, c) ? ? ? ? ? ? ? ? kkk = 0 ? ? ? ? ? ? except: ? ? ? ? ? ? ? ? f.close() ? ? ? ? ? ? ? ? f = open(filename, 'rb') ? ? ? ? ? ? ? ? c = f.read() ? ? ? ? ? ? ? ? textPad.insert(1.0, c) ? ? ? ? ? ? ? ? kkk=0 ? ? ? ? f.close()
然后就是myopen。“filename=askopenfilename()”就是,彈出一個選擇打開的文件的窗口,并將結(jié)果存入filename。然后我們獲取文件的后綴信息,作為解密所需的密鑰。接下來,我們先嘗試解密文件。如果執(zhí)行中有錯誤,也就是無法解密,則用gbk編碼正常打開,仍然打開失敗,則使用utf-8。當然,如果都失敗了,就用rb模式,也就是字節(jié)流的形式打開。
啊,越講越上頭,超過了我預(yù)期的篇幅……好了,現(xiàn)在先講到這里,等待下一次更新吧(本人初二,因此接觸電腦機會不多,更新嘛,自然是比較慢的。耐心等待!耐心等待?。。。?/p>
完整的代碼:
# coding:utf-8 from tkinter import * from tkinter.filedialog import * from tkinter.messagebox import * import windnd import os import sys kkk=1 try: ? ? filename = sys.argv[1] except: ? ? filename = "" def encryption(c, d): ? ? c = list(c + d) ? ? g=list(d) ? ? d=0 ? ? for i in g: ? ? ? ? d*=ord(i) ? ? ? ? d=round(abs(d)**0.5) ? ? f="0x" ? ? for i in c: ? ? ? ? e=str(ord(i)+d) ? ? ? ? d=round(300*(d**0.5)) ? ? ? ? f=f+e+"a" ? ? f=eval(f[:-1]) ? ? return (f) def decrypt(c,d): ? ? c=hex(int(c)) ? ? print(c) ? ? c=c[2:].split("a") ? ? z=d ? ? g = list(d) ? ? d = 0 ? ? for i in g: ? ? ? ? d *= ord(i) ? ? ? ? d = round(abs(d) ** 0.5) ? ? f="" ? ? for i in c: ? ? ? ? e = chr(int(i)-d) ? ? ? ? d = round(300 * (d ** 0.5)) ? ? ? ? f = f + e ? ? if f[-len(z):]==z: ? ? ? ? f=f[:-len(z)] ? ? ? ? return (f) ? ? else: ? ? ? ? c="bbc"+12 def mynew(aaa=1): ? ? global top, filename, textPad ? ? top.title("無標題 - 加密文本編輯器") ? ? filename = None ? ? textPad.delete(1.0, END) ? ? textPad.insert(1.0, "") def myopen(aaa=1): ? ? global filename,kkk ? ? filename = askopenfilename() ? ? if filename == "": ? ? ? ? filename = None ? ? else: ? ? ? ? top.title(os.path.basename(filename)+" - 加密文本編輯器") ? ? ? ? format=os.path.basename(filename)[os.path.basename(filename).find(".")+1:] ? ? ? ? textPad.delete(1.0, END) ? ? ? ? try: ? ? ? ? ? ? f = open(filename, 'rb') ? ? ? ? ? ? c = f.read() ? ? ? ? ? ? ccc = str(c)[2:-1] ? ? ? ? ? ? ccc.replace("\\","") ? ? ? ? ? ? textPad.insert(1.0,decrypt(ccc,format)) ? ? ? ? ? ? kkk=1 ? ? ? ? except: ? ? ? ? ? ? f.close() ? ? ? ? ? ? try: ? ? ? ? ? ? ? ? f = open(filename, 'r', encoding="gbk") ? ? ? ? ? ? ? ? try: ? ? ? ? ? ? ? ? ? ? c = f.read() ? ? ? ? ? ? ? ? except: ? ? ? ? ? ? ? ? ? ? f.close() ? ? ? ? ? ? ? ? ? ? f = open(filename, 'r', encoding="utf-8") ? ? ? ? ? ? ? ? ? ? c = f.read() ? ? ? ? ? ? ? ? textPad.insert(1.0, c) ? ? ? ? ? ? ? ? kkk = 0 ? ? ? ? ? ? except: ? ? ? ? ? ? ? ? f.close() ? ? ? ? ? ? ? ? f = open(filename, 'rb') ? ? ? ? ? ? ? ? c = f.read() ? ? ? ? ? ? ? ? textPad.insert(1.0, c) ? ? ? ? ? ? ? ? kkk=0 ? ? ? ? f.close() def mysave(aaa=1): ? ? global filename,kkk ? ? try: ? ? ? ? msg = textPad.get(1.0, 'end')[0:-1] ? ? ? ? if kkk==0: ? ? ? ? ? ? f = open(filename, 'w', encoding="utf-8") ? ? ? ? ? ? f.write(msg) ? ? ? ? else: ? ? ? ? ? ? f = open(filename, 'wb') ? ? ? ? ? ? fffff = str(encryption(msg, format)) ? ? ? ? ? ? fffff = eval("b'{}'".format(fffff)) ? ? ? ? ? ? print(fffff) ? ? ? ? ? ? f.write(fffff) ? ? ? ? f.close() ? ? except: ? ? ? ? mysaveas() def mysaveas(aaa=1): ? ? global filename ? ? f = asksaveasfilename(initialfile="無標題.txt") ? ? filename = f ? ? format = os.path.basename(filename)[os.path.basename(filename).find(".") + 1:] ? ? msg = textPad.get(1.0, 'end')[0:-1] ? ? if not format == "py" and not format=="bat" and not format == "pyw"and not format == "cmd": ? ? ? ? fh = open(filename, 'wb') ? ? ? ? fffff = str(encryption(msg, format)) ? ? ? ? fffff = eval("b'{}'".format(fffff)) ? ? ? ? print(fffff) ? ? ? ? fh.write(fffff) ? ? else: ? ? ? ? fh = open(filename, 'w', encoding="utf-8") ? ? ? ? fh.write(msg) ? ? fh.close() ? ? top.title(os.path.basename(f)+" - 加密文本編輯器") def opened(files): ? ? global filename,kkk ? ? ff = '\n'.join((item.decode('gbk') for item in files)) ? ? filename = ff ? ? if filename == "": ? ? ? ? filename = None ? ? else: ? ? ? ? top.title(os.path.basename(filename) + " - 加密文本編輯器") ? ? ? ? format = os.path.basename(filename)[os.path.basename(filename).find(".") + 1:] ? ? ? ? textPad.delete(1.0, END) ? ? ? ? try: ? ? ? ? ? ? f = open(filename, 'rb') ? ? ? ? ? ? c = f.read() ? ? ? ? ? ? ccc = str(c)[2:-1] ? ? ? ? ? ? ccc.replace("\\", "") ? ? ? ? ? ? textPad.insert(1.0, decrypt(ccc, format)) ? ? ? ? ? ? kkk = 1 ? ? ? ? except: ? ? ? ? ? ? f.close() ? ? ? ? ? ? try: ? ? ? ? ? ? ? ? f = open(filename, 'r', encoding="gbk") ? ? ? ? ? ? ? ? try: ? ? ? ? ? ? ? ? ? ? c = f.read() ? ? ? ? ? ? ? ? except: ? ? ? ? ? ? ? ? ? ? f.close() ? ? ? ? ? ? ? ? ? ? f = open(filename, 'r', encoding="utf-8") ? ? ? ? ? ? ? ? ? ? c = f.read() ? ? ? ? ? ? ? ? textPad.insert(1.0, c) ? ? ? ? ? ? ? ? kkk = 0 ? ? ? ? ? ? except: ? ? ? ? ? ? ? ? f.close() ? ? ? ? ? ? ? ? f = open(filename, 'rb') ? ? ? ? ? ? ? ? c = f.read() ? ? ? ? ? ? ? ? textPad.insert(1.0, c) ? ? ? ? ? ? ? ? kkk = 0 ? ? ? ? f.close() top = Tk() top.title("無標題 - 加密文本編輯器") top.geometry("1000x600+100+50") menubar = Menu(top) menubar.add_command(label="新建", command=mynew) menubar.add_command(label="打開", command=myopen) menubar.add_command(label="保存", ?command=mysave) menubar.add_command(label="另存為", command=mysaveas) menu = Menu(top, tearoff=False) menu.add_command(label="新建", accelerator="Ctrl+N", command=mynew) menu.add_command(label="打開", accelerator="Ctrl+O", command=myopen) menu.add_command(label="保存", accelerator="Ctrl+S", ?command=mysave) menu.add_command(label="另存為", accelerator="Ctrl+Shift+S", command=mysaveas) def command(event): ? ? menu.post(event.x_root, event.y_root) top['menu'] = menubar all=Frame(top) all.pack(expand=YES, fill=BOTH) textPad = Text(all,font=('宋體', 14), undo=True) if filename == "": ? ? filename = None ? ? textPad.insert(1.0, "") else: ? ? top.title(os.path.basename(filename) + " - 加密文本編輯器") ? ? format = os.path.basename(filename)[os.path.basename(filename).find(".") + 1:] ? ? textPad.delete(1.0, END) ? ? try: ? ? ? ? f = open(filename, 'rb') ? ? ? ? c = f.read() ? ? ? ? ccc = str(c)[2:-1] ? ? ? ? ccc.replace("\\", "") ? ? ? ? textPad.insert(1.0, decrypt(ccc, format)) ? ? ? ? kkk = 1 ? ? except: ? ? ? ? f.close() ? ? ? ? try: ? ? ? ? ? ? f = open(filename, 'r', encoding="gbk") ? ? ? ? ? ? try: ? ? ? ? ? ? ? ? c = f.read() ? ? ? ? ? ? except: ? ? ? ? ? ? ? ? f.close() ? ? ? ? ? ? ? ? f = open(filename, 'r', encoding="utf-8") ? ? ? ? ? ? ? ? c = f.read() ? ? ? ? ? ? textPad.insert(1.0, c) ? ? ? ? ? ? kkk = 0 ? ? ? ? except: ? ? ? ? ? ? f.close() ? ? ? ? ? ? f = open(filename, 'rb') ? ? ? ? ? ? c = f.read() ? ? ? ? ? ? textPad.insert(1.0, c) ? ? ? ? ? ? kkk = 0 ? ? f.close() scroll = Scrollbar(all) textPad.config(yscrollcommand=scroll.set) scroll.config(command=textPad.yview) scroll.pack(side=RIGHT, fill=Y) textPad.pack(expand=YES,side=RIGHT,fill=BOTH) top.bind("<Control-N>", mynew) top.bind("<Control-n>", mynew) top.bind("<Control-O>", myopen) top.bind("<Control-o>", myopen) top.bind("<Control-S>", mysave) top.bind("<Control-s>", mysave) top.bind("<Control-Shift-S>", mysaveas) top.bind("<Control-Shift-s>", mysaveas) top.bind("<Button-3>", command) windnd.hook_dropfiles(top,func=opened) top.mainloop()
總結(jié)
到此這篇關(guān)于用python實現(xiàn)一個加密文字處理器的文章就介紹到這了,更多相關(guān)python加密文字處理器內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Python學(xué)習(xí)之內(nèi)置函數(shù)總結(jié)
這篇文章主要為大家總結(jié)一下python?中常用的是個內(nèi)置函數(shù)的使用方法,文中的示例代碼講解詳細,對我們學(xué)習(xí)Python有一定的幫助,需要的可以參考一下2022-03-03運用Python的webbrowser實現(xiàn)定時打開特定網(wǎng)頁
今天小編就為大家分享一篇運用Python的webbrowser實現(xiàn)定時打開特定網(wǎng)頁,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2019-02-02用python的turtle模塊實現(xiàn)給女票畫個小心心
今天小編就為大家分享一篇用python的turtle模塊實現(xiàn)給女票畫個小心心,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2019-11-11Python利用itchat模塊定時給朋友發(fā)送微信信息
這篇文章主要介紹了在Python中利用itchat模塊編寫一個爬蟲腳本,可以實現(xiàn)每天定時給朋友發(fā)微信暖心話,感興趣的可以跟隨小編一起學(xué)習(xí)一下2022-01-01