- 实验目的:
密码学是研究如何隐密地传递信息的学科。在现代特别指对信息以及其传输的数学性研究,常被认为是数学和计算机科学的分支,和信息论也密切相关。在信息与网络安全课程学习,密码学是一门核心知识。本次实验的目的是掌握常见加解密算法及其应用,具体是以用户为中心,建立密码学加解密相关的综合系统设计及实现。
- 实验原理
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
如果觉得有用,请动动手指,分享该文章!