目录
1、凯撒密码是什么?
PyCharm是一款Python集成开发环境(IDE),而凯撒密码是一种简单的替换密码,它是由罗马将军凯撒(Julius Caesar)在古罗马时期使用的一种加密算法。凯撒密码的加密过程是将明文中的每个字母按照字母表顺序向后移动一个固定的位置,比如将明文中的每个字母都向后移动3个位置。例如,将明文中的字母A加密为D,B加密为E,依此类推。凯撒密码的解密过程则是将密文中的每个字母按照相同的规则向前移动对应的位置,即将密文中的字母D解密为A,E解密为B,依此类推。
2、凯撒密码的历史由来:
密码学发展阶段 使用加密技术是保护信息的最基本的方法,密码学技术是信息安全技术的核心,已被广泛应用到各类交互的信息中。 1.密码学的雏形始于古希腊人,他们与敌人作战时,在战场上需要与同伴传递书写有“战争机密”的信件,为了防止信件会落到敌人手中从而泄漏了战略机密,聪明的古希腊战士采取了将信中的内容“加密”的手段 2.古典密码学的核心手段是代换和置换。 3.代换是指明文中的每一个字符被替换成密文中的另一个字符,接收者对密文做反向替换便可恢复出明文 4.置换是密文和明文字母保持相同,但顺序被打乱。 5.例子:凯撒密码是对字母表中每个字母用它之后的第 k 个字母来代换,如,将“comeatnine”加密为“htrjfysnsj”(k=5)。
近现代的密码学: 1.快速计算工具和现代数学方法一方面为加密技术提供了新的概念和工具,另一方面也给破译者提供了有力武器 2.Arthur Scherbius 于 1919 年设计出了历史上最著名的密码机—德国的 Enigma机,,在二次世界大战期间,Enigma 曾作为德国陆、海、空三军最高级密码机。 3.这一阶段真正开始源于香农在 20 世纪 40 年代末发表的一系列论文,特别是1949 年的《保密系统通信理论》,把已有数千年历史的密码学推向了基于信息论的科学轨道 4.1976 年,美国密码学家提出“公钥密码”概念。
量子密码学: 1.量子密码学是一种新的重要加密方法,它利用单光子的量子性质,借助量子密钥分配协议可实现数据传输的可证安全 2.量子密码的安全性建立在量子力学的基础理论上 密码学前景: 未来的密码学发展将涉及更多的领域,也将面临更多的挑战。例如,随着人工智能和机器学习的进一步推广,密码学也要应对存在的诸多挑战。在信息安全领域内,密码学无疑将在未来所扮演的角色变得更加重要
制作凯撒密码程序:
1.tkinter (Tk interface,tk 接口),是 Tk 图形用户界面工具包标准的 Python 接口。tkinter是 Python 的标准 GUI 库,支持跨平台的图形用户界面应用程序开发,包括 Windows、
LINUX、Unix和Macintosh 操作系统。tkinter 的特点是简单实用。tkinter 是 Python 语言的标准库之一,Python 自带的IDLE 就是采用它开发的。tkinter 开发的图形界面,其显示风格是本地化的。tkinter 适用于小型图形界面应用程序的快速开发。本书主要基于 kinter,阐述图形用户界面应用程序开发的主要流程。
程序图形化下图:
2.tkinter 由若干的模块组成:_tkinter、tkinter 和 tkinter.constants 等。tkinter 是二进制扩展模块,提供了对 Tk 的低级接口,应用级程序员不会直接使用tkinter通常是一个共享库(或DLL),但是在一情况下也可被 Python 解释器静态链接。tkinter 是主要使用的模块,导人 tkinter 时,会自动导人tkinter.constants。tkinter.constants模块定义了许多常量。导人 tkinter 模块一般采用以下方式。
import tkinter:导入tkinter 模块。
import tkinter as tk:导入tkinter 模块为tk。
from tkinter import*:导入tkinter 模块的所有内容
3.本次利用 tkinter 编写编程流程:
(1)导入 tkinter 模块。由于 tkinter 模块已经内置在 Python 3 中,使用之前只需要使import 语句将其导入即可。如:
import tkinter as tk
from tkinter import *
(2) 创建一个顶层窗口。顶层窗口实际上是一个普通窗口,包括一个标题栏和窗口管理器所提供的窗口装饰部分,如最大化、最小化按钮等。顶层窗口必须在布局管理器、组件等之前创建。
(3) 创建组件。创建组件对象,并设置组件相关属性。
(4) 在窗口上布局组件。可以直接在顶层窗口上布局相关组件,也可以先创建 frame框架架,并在其上布局相关组件,然后在顶层窗口上布局 frame 框架。
(5) 事件处理。首先定义事件发生时需要执行的函数,然后将此丽数绑定到特定组件的事件上。
(6) 执行主循环。显示窗口,等待鼠标、键盘等各种事件消息
4.创建一个简单顶层窗口,程序如下:
# tkinter_topwin.py # coding = utf - 8
import tkinter
# 创建顶层窗口
topwin = tkinter.Tk()
# 初始化窗口大小
topwin. geometry('250x50')
# 设置窗口标题
topwin.title(‘顶层窗口’
)# 进入主循环
topwin.mainloop()
5.组件
组件名称:
组件常用属性:
组件布局管理方法:
6.按钮
tkinter 的按钮组件 Button 对象用于监听用户行为,当按钮被按下时,自动调用与其绑定的函数。按钮上可以放置文本或图片。其创建的格式为 tkinter. Button(父对象,属性列表)。
import tkinter
import tkinter.messagebox
#创建函数,将被绑定到按钮的单击事件中
def bindFun( ) :
tkinter.messagebox.showinfo("按钮事件测试","成功!")
#主程序
# 创建顶层窗口
topwin = tkinter.Tk()
# 初始化窗口大小
topwin.geometry('250x100')
# 设置窗口标题
topwin.title('按钮测试')
# 创建按钮
button1 = tkinter.Button(topwin, text ="测试按钮",command = bindFun)
7.输入框
Entry 输入框组件就是用来接收用户输入的单行编辑器。可以为 Entry 组件设置默认值,也可以禁止用户输入。如果禁止输入,用户就不能通过键盘输人来改变输入框中的值了。当输入框中的内容显示不下时,它会自动向后滚动。其创建格式为:tkinter.Entry(父对象,属性列表)。
import tkinter# 创建顶层窗口
topwin = tkinter.Tk()
# 初始化窗口大小
topwin. geometry('230x80')
# 设置窗口标题
topwin.title("输入框测试")
#创建标签
tkinter.Label(topwin, text ="姓名").grid(row = 0)
tkinter.Label(topwin, text ="学号").grid(row = 1, column = 0)
tkinter.Label(topwin,text = "测试").grid(row = 2)
#创建输入框
el = tkinter.Entry(topwin)
e2 = tkinter.Entry(topwin)
e3 = tkinter.Entry(topwin, state = tkinter.DISABLED)
el.grid(row = 0,column = 1)
e2. grid(row = 1,column = 1)
e3. grid(row = 2,column = 1)
# 进入主循环
topwin. mainloop()
8.复选框
Checkbutton 复选框(多选框)组件有两种状态表示选中或未选中。选中时,其 variable 属性值为 1,否则其值为 0也可以通过 onvalue 和 offvalue 两个属性分别设置勾选和不勾选时的任何类型值
command:指定Checkbutton 的回调函数(改变状态时调用)。
indicatoron:默认为1,选择状态为打;设置为0,则选择状态为按下按钮。
selectcolor 和 selectimage:选择时的颜色(默认为red')和图像(可指定)
offrelief:指定未选时的3D样式和值。默认为 tkinter.RAISED。
offvalue和onvalue:指定未选中和选中时值。默认分别为0和1。
Variable:绑定IntVar 对象到的选择状态值offvalue和onvalue。
import tkinter
import tkinter.messagebox
import tkinter
import tkinter.messagebox
def checkselect():
tkinter.messagebox.showinfo('状态值是', var.get())
def checkLanguage( ):
tkinter.messagebox. showinfo( '选中的语言',v.get( ))
# 创建顶层窗口
topwin = tkinter.Tk()
# 初始化窗口大小
topwin.geometry('250x100')
# 设置窗口标题
topwin.title('复选框测试')
#通过 var.get()来获取其的状态,勾选为 1 未勾选为 0
var = tkinter.IntVar()
# variable将该复选框的状态赋值给一个变量
check1 = tkinter.Checkbutton(topwin,text ="复选框测试",variable = var, command = checkselect)
check1. select()
check1. pack(anchor = tkinter. W)
v = tkinter.StringVar()
v. set('Java')# 设置为 offvalue,默认不选中
check2 = tkinter.Checkbutton(topwin, variable = v,text='勾选为 Python,否则为 Java!',onvalue ='Python',offvalue ='Java',command = checkLanguage)
check2. pack(anchor = tkinter. W)
topwin. mainloop()
3、制作凯撒密码程序
本项目用到
PyCharm Community Edition 2023.1.2
tkinter 组件完成
import tkinter
# 定义字符范围
CHARACTERS = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789'
# 凯撒密码加密函数
def encrypt(plaintext, key):
ciphertext = ''
for ch in plaintext:
if ch in CHARACTERS:
index = CHARACTERS.index(ch)
# 计算加密后的索引
encrypted_index = (index + key) % len(CHARACTERS)
# 获取加密后的字符并添加到密文中
ciphertext += CHARACTERS[encrypted_index]
else:
# 非法输入处理
return None
return ciphertext
# 凯撒密码解密函数
def decrypt(ciphertext, key):
plaintext = ''
for ch in ciphertext:
if ch in CHARACTERS:
index = CHARACTERS.index(ch)
# 计算解密后的索引
decrypted_index = (index - key) % len(CHARACTERS)
# 获取解密后的字符并添加到明文中
plaintext += CHARACTERS[decrypted_index]
else:
# 非法输入处理
return None
return plaintext
# 处理加密按钮点击事件
def encrypt_button_clicked():
plaintext = plaintext_entry.get()
key = key_entry.get()
if key.isdigit():
key = int(key)
ciphertext = encrypt(plaintext, key)
if ciphertext is not None:
result_label.config(text=f"加密结果: {ciphertext}")
else:
result_label.config(text="密钥必须是整数")
# 处理解密按钮点击事件
def decrypt_button_clicked():
ciphertext = ciphertext_entry.get()
key = key_entry.get()
if key.isdigit():
key = int(key)
plaintext = decrypt(ciphertext, key)
if plaintext is not None:
result_label.config(text=f"解密结果: {plaintext}")
else:
result_label.config(text="密钥必须是整数")
# 创建顶层窗口
topwin = tkinter.Tk()
topwin.geometry('380x260')
topwin.title('凯撒密码加密解密')
# 明文输入标签和输入框
plaintext_label = tkinter.Label(topwin, text="输入明文:")
plaintext_label.pack()
plaintext_entry = tkinter.Entry(topwin)
plaintext_entry.pack()
# 密钥输入标签和输入框
key_label = tkinter.Label(topwin, text="输入密钥:")
key_label.pack()
key_entry = tkinter.Entry(topwin)
key_entry.pack()
# 加密按钮
encrypt_button = tkinter.Button(topwin, text="加密", command=encrypt_button_clicked)
encrypt_button.pack()
# 密文输入标签和输入框
ciphertext_label = tkinter.Label(topwin, text="密文:")
ciphertext_label.pack()
ciphertext_entry = tkinter.Entry(topwin)
ciphertext_entry.pack()
# 解密按钮
decrypt_button = tkinter.Button(topwin, text="解密", command=decrypt_button_clicked)
decrypt_button.pack()
# 结果展示标签
result_label = tkinter.Label(topwin, text="")
result_label.pack()
# 运行窗口主循环
topwin.mainloop()
4、运行凯撒密码程序
1、运行后出现tkinter 组件
2、尝试输入明文与密钥
这就是加密后的结果
3、这次我们来尝试解密
总结
1. 导入所需的库:
- 导入`string`模块:用于处理字母表和字符串的操作。
- 导入`re`模块:用于处理正则表达式。
2. 定义凯撒密码的加密和解密函数:
- 加密函数`encrypt(text, shift)`:将给定的文本按照指定的位移量进行加密,并返回加密后的文本。
- 解密函数`decrypt(ciphertext, shift)`:将给定的密文按照指定的位移量进行解密,并返回解密后的明文。
3. 提示用户输入加密/解密操作和位移量:
- 使用`input()`函数获取用户输入的操作类型和位移量,并将其存储到相应的变量中。
4. 根据用户选择的操作类型进行加密/解密操作:
- 如果用户选择的操作类型是加密,则调用加密函数,并将加密后的结果打印输出。
- 如果用户选择的操作类型是解密,则调用解密函数,并将解密后的结果打印输出。
5. 处理异常情况:
- 使用`try-except`语句捕获可能的异常情况,比如用户输入的位移量不是一个整数。
综上所述,这是一个简单的制作PyCharm凯撒密码的总结。在实际使用过程中,还可以进一步完善代码和功能,比如添加更多的加密算法和操作选项,增加用户界面等。