- 實驗目的:
密碼學是研究如何隱密地傳遞信息的學科。在現代特別指對信息以及其傳輸的數學性研究,常被認爲是數學和計算機科學的分支,和信息論也密切相關。在信息與網絡安全課程學習,密碼學是一門核心知識。本次實驗的目的是掌握常見加解密算法及其應用,具體是以用戶爲中心,建立密碼學加解密相關的綜合系統設計及實現。
- 實驗原理
2.1 掌握一種典型的加解密算法,並能夠應用。見RSA.docx和RC.docx。
2.2 Python的圖形界面設計與實現
實例1 創建典型的窗口
參考代碼:
import tkinter
# 初始化Tk()
top = tkinter.Tk()
# 進入消息循環
top.mainloop()
- 窗口常用屬性
title('hello tkinter'):設置窗口標題
geometry('200x100'):設置窗口大小,注意是x而不是*
resizable((width=True, height=True):設置窗口是否可以變化長寬,默認可變
參考代碼
import tkinter
# 初始化Tk()
top = tkinter.Tk()
top.title('hello tkinter')
top.geometry('200x100')
top.resizable()
# 進入消息循環
top.mainloop()
實例2 創建Label
- Label (根對象,[屬性列表])
屬性如下:
text:要現實的文本
bg:背景顏色
fg : 前景顏色(就是字體顏色)
font: 字體(樣式, 大小)
width: 控件寬度
height: 控件高度
justify: 文字的對齊方向,可選值爲 RIGHT, CENTER, LEFT, 默認爲 Center.
padx: 指定水平方向的邊距, 默認爲1像素.
pady: 指定豎直方向的邊距, 默認爲1像素.
compound :讓圖片和文字一同顯示,缺省爲None
1- compound = 'left' 圖像居左
2- compound = 'right' 圖像居右
3- compound = 'top' 圖像居上
4- compound = 'bottom' 圖像居下
5- compound = 'center' 文字覆蓋在圖像上
bitmap/image:顯示在label上的圖像 實例:label = Label(root,text='error',compound='left',bitmap='error')
- 代碼:
import tkinter
top = tkinter.Tk()
top.title('hello tkinter')
top.geometry('400x400')
top.resizable()
#
l0 = tkinter.Label(top, text='這是一個label')
l1 = tkinter.Label(top, text='測試背景顏色', bg='red').pack(side='left')
l2 = tkinter.Label(top, text='測試字體顏色和大小', font=("Arial", 12)).pack(side='right')
l3 = tkinter.Label(top, text='測試空間寬高度', width=20, height=15).pack(side='top')
l0.place(relx=0.5, rely=0.5)
實例3. 採用Frame佈局窗口
- 代碼:
'''
Frame:在屏幕上創建一塊矩形區域,多作爲容器來佈局窗體
例如
frm = Frame(root)
frm_L=Frame(frm)
...
frm_L.pack()
frm_r=Frame(frm)
...
frm_r.pack()
frm.pack()
'''
import tkinter
top = tkinter.Tk()
top.title('hello tkinter')
top.geometry('400x400')
top.resizable()
l = tkinter.Label(text='main').pack()
frm = tkinter.Frame(top)
# left
frml = tkinter.Frame(frm)
l1 = tkinter.Label(frml, text='left', bg='green').pack()
frml.pack(side='left')
# right
frmr = tkinter.Frame(frm)
l2 = tkinter.Label(frmr, text='right', bg='red').pack()
frmr.pack(side='right')
frm.pack()
top.mainloop()
實例4. 輸入多行文本
- 代碼:
'''
Text:向該空間內輸入文本,t = Text(根對象)
插入:t.insert(mark, 內容)
刪除:t.delete(mark1, mark2),其中,mark可以是行號,或者特殊標識
例如:
INSERT:光標的插入點
CURRENT:鼠標的當前位置所對應的字符位置
END:這個Textbuffer的最後一個字符
SEL_FIRST:選中文本域的第一個字符,如果沒有選中區域則會引發異常
SEL_LAST:選中文本域的最後一個字符,如果沒有選中區域則會引發 異常
注意:Text組件不僅支持編輯和插入文本,還支持插入圖片和組件
'''
import tkinter
top = tkinter.Tk()
top.title('hello tkinter')
top.geometry('400x400')
top.resizable()
t = tkinter.Text(top)
t.insert(1.0, 'hello\n')
t.insert('end', 'hello000000\n')
t.insert('end', 'nono\n')
t.pack()
# 獲取文本內內容
n = t.get(0.0, 'end')
l = tkinter.Label(top, text=n, justify='left').pack(side='left')
top.mainloop()
實例5. 輸入Button按鈕
- Button :創建按鈕,Button(master,option = value,……)
屬性參數:
activebackground:當鼠標放上去時,按鈕的背景色
activeforeground:當鼠標放上去時,按鈕的前景色 bd:按鈕邊框的大小,默認爲 2 個像素
bg:按鈕的背景色
command:按鈕關聯的函數,當按鈕被點擊時,執行該函數 fg:按鈕的前景色(按鈕文本的顏色)
font:文本字體
height:按鈕的高度
highlightcolor:要高亮的顏色
image:按鈕上要顯示的圖片
justify:顯示多行文本的時候,設置不同行之間的對齊方式,可選項包括LEFT, RIGHT, CENTER padx:按鈕在x軸方向上的內邊距(padding),是指按鈕的內容與按鈕邊緣的距離
pady:按鈕在y軸方向上的內邊距(padding)
relief:邊框樣式,設置控件3D效果 可選的有:FLAT、SUNKEN、RAISED、GROOVE、RIDGE。默認爲 FLAT。
state:設置按鈕組件狀態,可選的有NORMAL、ACTIVE、 DISABLED。默認 NORMAL。
underline:下劃線。默認按鈕上的文本都不帶下劃線。取值就是帶下劃線的字符串索引 爲 0 時,第一個字符帶下劃線,爲 1 時,前兩個字符帶下劃線,以此類推
width:按鈕的寬度,如未設置此項,其大小以適應按鈕的內容(文本或圖片的大小)
wraplength:限制按鈕每行顯示的字符的數量
text:按鈕的文本內容
anchor:錨選項,控制文本的位置,默認爲中心 方法:
deselect() 清除單選按鈕的狀態
flash() 在激活狀態顏色和正常顏色之間閃爍幾次單選按鈕,但保持它開始時的狀態。
invoke() 可以調用此方法來獲得與用戶單擊單選按鈕以更改其狀態時發生的操作相同的操作
select() 設置單選按鈕爲選中。
- 代碼:
import tkinter
# 輸入文本內容,點擊按鈕獲取內容並且輸出
top = tkinter.Tk()
top.title('hello tkinter')
top.geometry('400x400')
top.resizable()
# t = tkinter.Text(top)
# t.pack()
e = tkinter.Entry()
e.pack()
def fun():
# n = t.get(0.0, 'end')
n = e.get()
l = tkinter.Label(top, text=n, justify='left').pack(side='left')
return l
bt = tkinter.Button(top, text='獲取文本內容', command=fun).pack()
# 獲取文本內內容
top.mainloop()
實例6 Listbox列表控件
- Listbox :列表控件,可以含有一個或多個文本項,可單選也可多選
創建:lb = ListBox(根對象, [屬性列表])
lb=ListBox(根對象, listvariable = var)
綁定變量 var=StringVar()
得到列表中的所有值 var.get()
設置列表中的所有值 var.set((item1, item2, .....))
添加:lb.insert(item)
刪除:lb.delete(item,...)
綁定事件 lb.bind('<ButtonRelease-1>', 函數)
獲得所選中的選項 lb.get(lb.curselection())
獲取指定索引的項值:lb.get(1)
返回多個項值,返回元組:lb.get(0,2)
判斷是否選中狀態:lb.select_includes(2)
參數:
selectmode = MULTIPLE:設置是否多選
selectmode = BROWSE:通過鼠標的移動點擊進行選擇
selectmode = EXTENDED:shift+左鍵,ctrl+左鍵可以進行多選
- 代碼:
import tkinter
root = tkinter.Tk()
root.title("hello world")
root.geometry()
def print_item(event):
res = lb.get(lb.curselection())
print(res)
var = tkinter.StringVar()
lb = tkinter.Listbox(root, listvariable=var)
# 放入列表的值
list_item = [1, 2, 3, 4] # 控件的內容爲1 2 3 4
for item in list_item:
lb.insert('end', item)
# lb.delete(2, 4) # 刪除指定此時控件的內容爲1 3
# 放入元組的值
# var.set(('a1', 'a2', 'A3', 'A4')) # 重新設置了,這時控件的內容就編程var的內容了
print(var.get())
# 綁定事件函數
lb.bind('<ButtonRelease-1>', print_item)
lb.pack()
root.mainloop()
2.3 Python的菜單設計與實現
實例7 典型菜單欄的設計與實現
代碼:
from tkinter import *
def new_file():
print("Open new file")
def open_file():
print("Open existing file")
def stub_action():
print("Menu select")
def makeCommandMenu():
CmdBtn = Menubutton(mBar, text='Button Commands', underline=0)
CmdBtn.pack(side=LEFT, padx="2m")
CmdBtn.menu = Menu(CmdBtn) CmdBtn.menu.add_command(label="Undo")
CmdBtn.menu.entryconfig(0, state=DISABLED)
CmdBtn.menu.add_command(label='New...', underline=0, command=new_file)
CmdBtn.menu.add_command(label='Open...', underline=0, command=open_file)
CmdBtn.menu.add_command(label='Wild Font', underline=0,
font=('Tempus Sans ITC', 14), command=stub_action)
#CmdBtn.menu.add_command(bitmap="@bitmaps/RotateLeft")
CmdBtn.menu.add('separator')
CmdBtn.menu.add_command(label='Quit', underline=0,
background='white', activebackground='green',
command=CmdBtn.quit)
CmdBtn['menu'] = CmdBtn.menu
return CmdBtn
def makeCascadeMenu():
CasBtn = Menubutton(mBar, text='Cascading Menus', underline=0)
CasBtn.pack(side=LEFT, padx="2m")
CasBtn.menu = Menu(CasBtn)
CasBtn.menu.choices = Menu(CasBtn.menu)
CasBtn.menu.choices.wierdones = Menu(CasBtn.menu.choices)
CasBtn.menu.choices.wierdones.add_command(label='A')
CasBtn.menu.choices.wierdones.add_command(label='B')
CasBtn.menu.choices.wierdones.add_command(label='C')
CasBtn.menu.choices.wierdones.add_command(label='D')
CasBtn.menu.choices.add_command(label='A')
CasBtn.menu.choices.add_command(label='B')
CasBtn.menu.choices.add_command(label='C')
CasBtn.menu.choices.add_command(label='D')
CasBtn.menu.choices.add_command(label='E')
CasBtn.menu.choices.add_command(label='F')
CasBtn.menu.choices.add_cascade(label='G',
menu=CasBtn.menu.choices.wierdones)
CasBtn.menu.add_cascade(label='Scipts', menu=CasBtn.menu.choices)
CasBtn['menu'] = CasBtn.menu
return CasBtn
def makeCheckbuttonMenu():
ChkBtn = Menubutton(mBar, text='Checkbutton Menus', underline=0)
ChkBtn.pack(side=LEFT, padx='2m')
ChkBtn.menu = Menu(ChkBtn)
ChkBtn.menu.add_checkbutton(label='A')
ChkBtn.menu.add_checkbutton(label='B')
ChkBtn.menu.add_checkbutton(label="C")
ChkBtn.menu.add_checkbutton(label='D')
ChkBtn.menu.add_checkbutton(label='E')
ChkBtn.menu.invoke(ChkBtn.menu.index('C'))
ChkBtn['menu'] = ChkBtn.menu
return ChkBtn
def makeRadiobuttonMenu():
RadBtn = Menubutton(mBar, text='Radiobutton Menus', underline=0)
RadBtn.pack(side=LEFT, padx='2m')
RadBtn.menu = Menu(RadBtn)
RadBtn.menu.add_radiobutton(label='A')
RadBtn.menu.add_radiobutton(label='B')
RadBtn.menu.add_radiobutton(label='C')
RadBtn.menu.add_radiobutton(label='D')
RadBtn.menu.add_radiobutton(label='E')
RadBtn.menu.add_radiobutton(label='F')
RadBtn.menu.add_radiobutton(label='G')
RadBtn.menu.add_radiobutton(label='H')
RadBtn.menu.add_radiobutton(label='I')
RadBtn['menu'] = RadBtn.menu
return RadBtn
def makeDisabledMenu():
Dummy_button = Menubutton(mBar, text='Disabled Menu', underline=0)
Dummy_button.pack(side=LEFT, padx='2m')
Dummy_button["state"] = DISABLED
return Dummy_button
root = Tk()
mBar = Frame(root, relief=RAISED, borderwidth=2)
mBar.pack(fill=X)
CmdBtn = makeCommandMenu()
CasBtn = makeCascadeMenu()
ChkBtn = makeCheckbuttonMenu()
RadBtn = makeRadiobuttonMenu()
NoMenu = makeDisabledMenu()
mBar.tk_menuBar(CmdBtn, CasBtn, ChkBtn, RadBtn, NoMenu)
root.title('Menus')
root.mainloop()
- 實驗過程
3.1 實驗界面設計
1. 打開的主界面設計
2. 打開RSA的界面
3.2 綜合系統菜單設計與實現
3.3 綜合系統界面設計與實現
3.4 基於RSA的編程
難點:菜單關聯界面及界面之間的切換;加解密過程及顯示等
見源代碼Cryption.py。
- 實驗擴展
1、把RC4的python算法整合到密碼學整合進系統中,限定一人完成。
2、增加其它的一種加解密算法或者算法破譯,整合進整合進系統中,由1-3人共同完成。
- 實驗總結
- 參考文獻及程序下載
- 參考文獻
[1] https://blog.csdn.net/qq_33961117/article/details/82595101
[2] https://blog.csdn.net/chl0000/article/details/7657859
2. 參考程序下載
公衆號提供源碼下載,包括RSA加解密算法源碼以及應用案例代碼(Cryption.py),編譯和調試工具:pycharm。
1)在“豆豆諮詢”公衆號裏,輸入彩蛋號即可獲得下載地址:
源代碼及仿真環境下載的彩蛋號:9201;
2)如果有疑問或者需要幫助,請加入QQ羣(羣名稱:豆豆諮詢,羣號:625686304);或者公衆號douAsk,公衆號名稱爲“豆豆諮詢”。掃描以下二維碼,關注“豆豆諮詢”。
技術QQ羣名稱:豆豆諮詢,羣號:625686304
微信公衆號名稱:豆豆諮詢,微信公衆號:douAsk
如果覺得有用,請動動手指,分享該文章!