密碼學(xué) RSA密碼代碼

2020-07-30 17:21 更新

如下為Python實(shí)現(xiàn)RSA加密的代碼(包含圖形界面)

運(yùn)行之前需要先導(dǎo)入包

#?-*-?coding:?UTF-8?-*-


import?os
from?tkinter?import?*
import?tkinter.messagebox?as?mbox


from?rsa?import?RSA
from?makeRsaKeys?import?makeKeyFiles,?delKeyFiles,?Key




class?Cipher(Frame):
????def?__init__(self,?master):
????????frame?=?Frame(master)
????????frame.pack()
????????self.var1?=?Variable()
????????self.var2?=?Variable()
????????self.var3?=?Variable()
????????self.var4?=?Variable()


????????self.title1?=?Label(frame,?text="對(duì)消息進(jìn)行加密和解密",?fg='red')
????????self.title1.grid(row=0,?column=1)


????????self.lab1?=?Label(frame,?text="消息:")
????????self.lab1.grid(row=1,?column=0,?sticky=W)


????????self.ent1?=?Entry(frame)
????????self.ent1.grid(row=1,?column=1,?sticky=W)


????????self.button1?=?Button(frame,?text="加密",?command=self.encrypt,?fg='orange')
????????self.button1.grid(row=1,?column=2)


????????self.lab2?=?Label(frame,?text="結(jié)果:")
????????self.lab2.grid(row=2,?column=0,?sticky=W)


????????self.ent2?=?Entry(frame,?textvariable=self.var1)
????????self.ent2.grid(row=2,?column=1,?sticky=W)


????????self.button2?=?Button(frame,?text="解密",?command=self.decrypt,?fg='orange')
????????self.button2.grid(row=2,?column=2)


????????self.info?=?Label(frame,?text="",?textvariable=self.var2,?fg='orange')
????????self.info.grid(row=3,?column=1)


????????self.lab_null?=?Label(frame,?text="")
????????self.lab_null.grid(row=4,?column=1)


????????self.title2?=?Label(frame,?text="生成?RSA?公鑰和密鑰",?fg='red')
????????self.title2.grid(row=5,?column=1)


????????self.lab3?=?Label(frame,?text="位數(shù):")
????????self.lab3.grid(row=6,?column=0,?sticky=W)


????????self.ent3?=?Entry(frame)
????????self.ent3.grid(row=6,?column=1,?sticky=W)


????????self.lab4?=?Label(frame,?text="公鑰:")
????????self.lab4.grid(row=7,?column=0,?sticky=W)


????????self.ent4?=?Entry(frame,?textvariable=self.var3)
????????self.ent4.grid(row=7,?column=1,?sticky=W)


????????self.lab5?=?Label(frame,?text="私鑰:")
????????self.lab5.grid(row=8,?column=0,?sticky=W)


????????self.ent5?=?Entry(frame,?textvariable=self.var4)
????????self.ent5.grid(row=8,?column=1,?sticky=W)


????????self.button3?=?Button(frame,?text="生成",?command=self.generate,?fg='orange')
????????self.button3.grid(row=9,?column=1,?sticky=W)


????????self.button4?=?Button(frame,?text="清除",?command=self.delete,?fg='orange')
????????self.button4.grid(row=9,?column=1,?sticky=E)


????def?encrypt(self):
????????message?=?self.ent1.get()
????????size?=?self.ent3.get()
????????result?=?RSA(message,?pubkey=size?+?'_pubkey.txt',?privkey=size?+?'_privkey.txt')?if?size?else?RSA(message)
????????ciphertext?=?result.ciphertext
????????print('Ciphertext:?'?+?ciphertext)
????????self.var2.set('已加密至?ciphertext.txt?文件。')


????def?decrypt(self):
????????with?open('ciphertext.txt',?'rt')?as?f:
????????????message?=?f.read()


????????size?=?self.ent3.get()
????????result?=?RSA(message,?pubkey=size?+?'_pubkey.txt',?privkey=size?+?'_privkey.txt')?if?size?else?RSA(message)


????????plaintext?=?result.plaintext
????????if?plaintext:
????????????print('Plaintext:?'?+?plaintext)
????????????self.var1.set(plaintext)
????????????self.var2.set('已解密至?plaintext.txt?文件。')
????????else:
????????????mbox.showwarning('錯(cuò)誤',?'密文缺失信息,無(wú)法解密!')


????def?generate(self):
????????size?=?self.ent3.get()
????????if?size:
????????????Key.setKeySize(int(size))
????????flag?=?makeKeyFiles(name=size,?keysize=int(size))?if?size?else?makeKeyFiles()


????????if?flag:
????????????self.var3.set(flag[0])
????????????self.var4.set(flag[1])
????????????mbox.showinfo('成功',?'公鑰和私鑰生成成功!')
????????else:
????????????mbox.showwarning('錯(cuò)誤',?'當(dāng)前文件夾下已有同名公鑰和私鑰,請(qǐng)選擇別的名稱進(jìn)行生成!')


????def?delete(self):
????????name?=?self.ent3.get()
????????flag?=?delKeyFiles(name)?if?name?else?delKeyFiles()
????????if?flag:
????????????self.var3.set('')
????????????self.var4.set('')
????????????mbox.showinfo('成功',?'公鑰和私鑰清除成功!')
????????else:
????????????mbox.showwarning('錯(cuò)誤',?'當(dāng)前文件夾下無(wú)指定公鑰和私鑰,請(qǐng)核對(duì)后重新進(jìn)行操作!')
????????


root?=?Tk()
root.title('RSA')
root.geometry('400x280')
app?=?Cipher(root)
root.mainloop()

對(duì)字符串“hellorsa”使用不同長(zhǎng)度的RSA密鑰加解密,實(shí)驗(yàn)過(guò)程關(guān)鍵步驟截圖如下:

以上內(nèi)容是否對(duì)您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)