<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
這是一個類似於記事本的文書處理器。與正常的記事本不同的是,它會將文字檔案進行加密,確保無法被常規的程式開啟。
由於本人是一位業餘程式設計愛好者,對於“python之禪”之類的規則比較不以為然,因此本程式程式碼也許有些許凌亂(當然不利於後期修改)。
這篇文章我早已釋出過,但當時只給出了程式碼,並加了一些註釋。現在,我希望在這裡詳細解釋這個程式。我會分一個月或更久更新這篇文章,請讀者耐心等待。
首先,對於一個適合我們廣大中華兒女使用的程式,我們不可避免地要使用中文。這就需要對編碼進行宣告:
# coding:utf-8
然後,就到了模組匯入的環節了。我們這裡需要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檔案也有這個功能,但是多數情況下這樣操作後只能使程式正常執行,而不能對檔案進行任何操作。而“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
這一段就比較勁爆了。它定義了兩個函數,一個用於加密,另外一個用於解密(順便說一句,我英語不太好,有的函數或變數的名字可能比較古怪,請見諒)。
encryption是加密的函數(呃,這個應該叫做encrypt,我編這個程式時大腦有些短路,但既然已經這樣了,也就不改了),它會將明文(輸入的c)通過與金鑰d有關的某些運算,得出一個十六進位制數,然後將其轉化為十進位制。同時,為了確保解密結果唯一,將金鑰一起連線在明文上,起校驗作用。在這裡,對於明文的每一個字元都會將加密過程中實際使用的金鑰進行變動,因此基本是不可能通過字元出現頻率的規律來破解的。由於金鑰是字元,暴力拆解也基本不可能。
decrypt是解密,它大致就是encryption的逆操作,同時如果校驗的結果有誤,或是遇到其他解密失敗的情況它會產生錯誤(因此使用時需要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。這裡有一個可選引數a,這是因為通過bind啟用函數會輸入一個引數(這點我非常反感),為了不讓程式執行出錯,就新增了一個可選引數。這個其實沒啥好說。global後面是所需的全域性變數,然後就是設定視窗名稱、檔名稱,並清空輸入框,很簡單,很明瞭。
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()”就是,彈出一個選擇開啟的檔案的視窗,並將結果存入filename。然後我們獲取檔案的字尾資訊,作為解密所需的金鑰。接下來,我們先嚐試解密檔案。如果執行中有錯誤,也就是無法解密,則用gbk編碼正常開啟,仍然開啟失敗,則使用utf-8。當然,如果都失敗了,就用rb模式,也就是位元組流的形式開啟。
啊,越講越上頭,超過了我預期的篇幅……好了,現在先講到這裡,等待下一次更新吧(本人初二,因此接觸電腦機會不多,更新嘛,自然是比較慢的。耐心等待!耐心等待!!!)!
完整的程式碼:
# 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()
總結
到此這篇關於用python實現一個加密文書處理器的文章就介紹到這了,更多相關python加密文書處理器內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45