实验一 古典密码算法的设计与实现

✅作者简介:CSDN内容合伙人、信息安全专业在校大学生🏆
🔥系列专栏 :简单外包单
📃新人博主 :欢迎点赞收藏关注,会回访!
💬舞台再大,你不上台,永远是个观众。平台再好,你不参与,永远是局外人。能力再大,你不行动,只能看别人成功!没有人会关心你付出过多少努力,撑得累不累,摔得痛不痛,他们只会看你最后站在什么位置,然后羡慕或鄙夷。


文章目录

  • 实验一 古典密码算法的设计与实现
    • 一、实验目的
    • 二、实验任务
    • 三、实验环境
    • 四、实验原理
      • 4.1 替代密码
      • 4.2 置换密码
    • 五、程序设计核心代码
    • 六、实验结果及软件使用说明
      • 1. 替代密码
    • 七、源代码

实验一 古典密码算法的设计与实现

一、实验目的

通过编程实现替代密码和置换密码算法,加深对古典密码体制对了解,为深入学习密码学奠定基础。

二、实验任务

实验内容与要求:自己生成明文,并选择一个密钥,编程实现一种替代密码和一种置换密码算法,实现加解密操作,要求上述密码算法最后的实现程序提供加密和解密两个接口,提供图形化用户界面(选做)。提交核心程序代码和执行结果,并撰写实验报告。

三、实验环境

信息楼西505,Windows10,python3.9.7

四、实验原理

4.1 替代密码

密钥生成: 替代密码的关键是一个密钥,该密钥定义了明文字符和密文字符之间的映射关系。密钥通常是一个简单的置换表,其中包含字母表的不同排列。
加密: 加密过程涉及将明文中的每个字符替换为密钥中相应字符。例如,如果密钥规定字母A映射到密文中的字母D,则在加密时,所有的A都会被替换为D。
解密: 解密是加密的逆过程,涉及将密文字符替换为明文字符。如果在加密中A映射到D,那么在解密中D将被替换为A。
单字母替代和多字母替代: 替代密码可以是单字母替代,其中每个明文字母都被替换为一个密文字母,也可以是多字母替代,其中一组字母被替换为另一组字母或符号。

4.2 置换密码

单行置换密码:
密钥生成: 单行置换密码使用一个密钥,通常是一个数字或单词,表示重新排列字符的规则。
加密: 将明文按照密钥规定的顺序重新排列,然后读取排列后的字符以生成密文。例如,如果密钥是2314,那么明文中的第一个字符就会被移到第二个位置,第二个移到第三个位置,以此类推。

解密: 解密过程是加密过程的逆操作,按照密钥规定的逆序重新排列密文即可还原为明文。
多行置换密码:
密钥生成: 多行置换密码使用一个矩阵作为密钥,规定了字符的排列顺序。
加密: 将明文按照矩阵的规定,逐行写入矩阵,然后按列读取,得到密文。例如,如果密钥矩阵为:3 1 4 2那么明文中的字符将按照列的顺序排列,生成密文。
解密: 解密过程是加密过程的逆操作,按照密钥规定的逆序重新排列密文即可还原为明文。

五、程序设计核心代码

在SubstitutionCipher类的构造函数中,接受用户提供的密钥,并初始化两个字典,encrypt_dict和decrypt_dict。encrypt_dict将明文字母映射到密钥对应的字母,而decrypt_dict则实现反向映射。
加密:encrypt方法接受一个字符串作为参数,遍历字符串中的每个字符。对于字母字符,根据其大小写使用encrypt_dict进行替换;对于非字母字符,保持不变。构建加密后的字符串并返回。
解密:decrypt方法与encrypt类似,遍历输入字符串中的每个字符。对于字母字符,根据其大小写使用decrypt_dict进行替换;对于非字母字符,保持不变。构建解密后的字符串并返回。
这个算法简单地通过替换字母来实现替代密码。界面部分使用了tkinter库来构建一个简单的图形用户界面,用户可以通过界面输入密钥和文本,然后进行加密和解密操作。

  1. def encrypt(self, text):
  2. encrypted_text = ''  
    
  3. **for** char **in** text:  
    
  4.     **if** char.isalpha():  # 只加密字母  
    
  5.         **if** char.islower():  
    
  6.             encrypted_text += self.encrypt_dict.get(char, char)  
    
  7.         **else**:  
    
  8.             encrypted_text += self.encrypt_dict.get(char.lower(), char)  
    
  9.     **else**:  
    
  10.         encrypted_text += char  
    
  11. **return** encrypted_text  
    
  12. def decrypt(self, text):
  13. decrypted_text = ''  
    
  14. **for** char **in** text:  
    
  15.     **if** char.isalpha():  # 只解密字母  
    
  16.         **if** char.islower():  
    
  17.             decrypted_text += self.decrypt_dict.get(char, char)  
    
  18.         **else**:  
    
  19.             decrypted_text += self.decrypt_dict.get(char.lower(), char)  
    
  20.     **else**:  
    
  21.         decrypted_text += char  
    
  22. **return** decrypted_text  
    

SubstitutionCipher 类是置换密码的实现,它包含一个构造函数和两个方法:encrypt_block 和 encrypt。encrypt_block 方法对一个8位的文本块进行置换加密。encrypt 方法将输入的文本分割成8位一组的块,然后对每个块调用 encrypt_block 方法进行加密,最后合并所有的块。decrypt 方法通过将密钥反转后,使用相同的加密逻辑进行解密。SubstitutionCipherGUI 类是用户界面的实现,通过 Tkinter 构建。它包含一个构造函数和三个方法:encrypt_text、decrypt_text 和 create_widgets。create_widgets 方法负责创建用户界面的各种元素,包括标签、输入框、文本框以及加密和解密按钮。encrypt_text 方法从界面获取用户输入的密钥和文本,然后调用 SubstitutionCipher 类的 encrypt 方法进行加密,并将结果显示在界面上。
decrypt_text 方法同样从界面获取用户输入的密钥和文本,然后调用 SubstitutionCipher 类的 decrypt 方法进行解密,并将结果显示在界面上。

六、实验结果及软件使用说明

1. 替代密码


图 1 替代密码主界面
使用说明:
前两行的26个字母代表字典表,可以直接输入修改替代的方法,在input中输入文本,点击encrypt实现加密,decrypt实现解密。

图 2 测试数据

图 3 测试数据

七、源代码

'''
Author: Martin
Date: 2023-11-11 19:08:09
Description: 替代密码的实现
'''
import tkinter as tkclass SubstitutionCipher:def __init__(self, key):self.key = keyself.encrypt_dict = dict(zip('abcdefghijklmnopqrstuvwxyz', key))self.decrypt_dict = dict(zip(key, 'abcdefghijklmnopqrstuvwxyz'))def encrypt(self, text):encrypted_text = ''for char in text:if char.isalpha():  # 只加密字母if char.islower():encrypted_text += self.encrypt_dict.get(char, char)else:encrypted_text += self.encrypt_dict.get(char.lower(), char)else:encrypted_text += charreturn encrypted_textdef decrypt(self, text):decrypted_text = ''for char in text:if char.isalpha():  # 只解密字母if char.islower():decrypted_text += self.decrypt_dict.get(char, char)else:decrypted_text += self.decrypt_dict.get(char.lower(), char)else:decrypted_text += charreturn decrypted_textclass SubstitutionCipherGUI:def __init__(self, master):self.master = mastermaster.title("Substitution Cipher")self.master.geometry("600x400")  # 设置窗口大小self.alphabet_frame = tk.Frame(master)self.alphabet_frame.pack()self.labels = []self.entries = []tmp1 = 0tmp2 = 1for i, char in enumerate('abcdefghijklmnopqrstuvwxyz'):if i>=13:tmp1 = 2tmp2 = 3label = tk.Label(self.alphabet_frame, text=char, width=2)label.grid(row=(i // 13) + tmp1, column=i % 13, padx=2)self.labels.append(label)entry = tk.Entry(self.alphabet_frame, width=3)entry.grid(row=(i // 13) + tmp2, column=i % 13, padx=2)entry.insert(tk.END, char)  # 设置默认值为大写字母self.entries.append(entry)self.label_input = tk.Label(master, text="Input:")self.label_input.pack()self.entry_input = tk.Text(master,width=50,height=3)self.entry_input.pack()self.label_encrypt_output = tk.Label(master, text="Encrypted:")self.label_encrypt_output.pack()self.text_encrypt_output = tk.Text(master, height=3, width=50)self.text_encrypt_output.pack()self.label_decrypt_output = tk.Label(master, text="Decrypted:")self.label_decrypt_output.pack()self.text_decrypt_output = tk.Text(master, height=3, width=50)self.text_decrypt_output.pack()self.button_encrypt = tk.Button(master, text="Encrypt", command=self.encrypt_text)self.button_encrypt.pack()self.button_decrypt = tk.Button(master, text="Decrypt", command=self.decrypt_text)self.button_decrypt.pack()self.canvas = tk.Canvas(master, width=600, height=150)self.canvas.pack()def encrypt_text(self):key = [entry.get() for entry in self.entries]  # 获取用户输入的字典内容text = self.entry_input.get("1.0", tk.END).strip()  # 获取多行文本框的内容cipher = SubstitutionCipher(key)encrypted_text = cipher.encrypt(text)self.text_encrypt_output.delete(1.0, tk.END)  # 清空之前的内容self.text_encrypt_output.insert(tk.END, encrypted_text)def decrypt_text(self):key = [entry.get() for entry in self.entries]  # 获取用户输入的字典内容text = self.entry_input.get("1.0", tk.END).strip()  # 获取多行文本框的内容cipher = SubstitutionCipher(key)decrypted_text = cipher.decrypt(text)self.text_decrypt_output.delete(1.0, tk.END)  # 清空之前的内容self.text_decrypt_output.insert(tk.END, decrypted_text)if __name__ == "__main__":root = tk.Tk()app = SubstitutionCipherGUI(root)root.mainloop()
'''
Author: Martin
Date: 2023-11-11 19:52:32
Description: 置换密码
'''
import tkinter as tkclass SubstitutionCipherGUI:def __init__(self, master):self.master = mastermaster.title("Substitution Cipher")self.master.geometry("600x400")  # 设置窗口大小self.alphabet_frame = tk.Frame(master)self.alphabet_frame.pack()self.labels = []self.entries = []tmp1 = 0tmp2 = 1for i, char in enumerate('12345678'):label = tk.Label(self.alphabet_frame, text=f"{char}:")label.grid(row=tmp2, column=i, padx=2)self.labels.append(label)entry = tk.Entry(self.alphabet_frame, width=3)entry.grid(row=tmp2 + 1, column=i, padx=2)entry.insert(tk.END, 9-int(char))  # 设置默认值为大写字母self.entries.append(entry)self.label_input = tk.Label(master, text="Input:")self.label_input.pack()self.entry_input = tk.Text(master, width=50, height=3)self.entry_input.pack()self.label_encrypt_output = tk.Label(master, text="Encrypted:")self.label_encrypt_output.pack()self.text_encrypt_output = tk.Text(master, height=3, width=50)self.text_encrypt_output.pack()self.label_decrypt_output = tk.Label(master, text="Decrypted:")self.label_decrypt_output.pack()self.text_decrypt_output = tk.Text(master, height=3, width=50)self.text_decrypt_output.pack()self.button_encrypt = tk.Button(master, text="Encrypt", command=self.encrypt_text)self.button_encrypt.pack()self.button_decrypt = tk.Button(master, text="Decrypt", command=self.decrypt_text)self.button_decrypt.pack()self.canvas = tk.Canvas(master, width=600, height=150)self.canvas.pack()def encrypt_text(self):key = [entry.get() for entry in self.entries]  # 获取用户输入的字典内容text = self.entry_input.get("1.0", tk.END).strip()  # 获取多行文本框的内容cipher = SubstitutionCipher(key)encrypted_text = cipher.encrypt(text)self.text_encrypt_output.delete(1.0, tk.END)  # 清空之前的内容self.text_encrypt_output.insert(tk.END, encrypted_text)def decrypt_text(self):key = [entry.get() for entry in self.entries]  # 获取用户输入的字典内容text = self.entry_input.get("1.0", tk.END).strip()  # 获取多行文本框的内容cipher = SubstitutionCipher(key)decrypted_text = cipher.decrypt(text)self.text_decrypt_output.delete(1.0, tk.END)  # 清空之前的内容self.text_decrypt_output.insert(tk.END, decrypted_text)class SubstitutionCipher:def __init__(self, key):self.key = keydef encrypt_block(self, block):return ''.join(block[int(self.key[i]) - 1] for i in range(min(len(self.key), len(block))))def encrypt(self, plaintext):blocks = [plaintext[i:i + 8] for i in range(0, len(plaintext), 8)]print(blocks)encrypted_blocks = [self.encrypt_block(block) for block in blocks[:-1]]encrypted_blocks.append(blocks[-1])return ''.join(encrypted_blocks)def decrypt(self, ciphertext):reversed_key = ''.join(reversed(self.key))reversed_cipher = SubstitutionCipher(reversed_key)return reversed_cipher.encrypt(ciphertext)if __name__ == "__main__":root = tk.Tk()app = SubstitutionCipherGUI(root)root.mainloop()

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/662116.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

猫什么时候发腮?猫咪发腮指南!这些生骨肉冻干发腮效果好

猫什么时候发腮是许多猫主人非常关心的问题。在猫咪的成长过程中,发腮是一项重要的体征,也是猫咪成熟的标志。主人需要在适龄的年龄段加强营养补给,可以让让猫咪拥有可爱的肉嘟嘟脸型,不要错失最佳发腮期。那么,什么时…

花瓣网美女图片爬取

爬虫基础案例01 花瓣网美女图片 网站url:https://huaban.com 图片爬取 import requests import json import os res requests.get(url "https://api.huaban.com/search/file?text%E7%BE%8E%E5%A5%B3&sortall&limit40&page1&positionsear…

【论文阅读笔记】Advances in 3D Generation: A Survey

Advances in 3D Generation: A Survey 挖个坑,近期填完摘要 time:2024年1月31日 paper:arxiv 机构:腾讯 挖个坑,近期填完 摘要 生成 3D 模型位于计算机图形学的核心,一直是几十年研究的重点。随着高级神经…

第2章 Linux 中执行命令

第2章 Linux 中执行命令 命令格式 命令 [选项] [参数....] 在linux 中命令分为内部命令和外部命令。 ctrll 可以清屏 查看帮助的命令 在使用命令之前,我们可以通过帮助来查看这个命令的格式和使用方式。在 Linux 中有两个帮助命令, help 和 man help…

第96讲:MySQL高可用集群MHA的核心概念以及集群搭建

文章目录 1.MHA高可用数据库集群的核心概念1.1.主从复制架构的演变1.2.MHA简介以及架构1.3.MHA的软件结构1.4.MHA Manager组件的启动过程1.5.MHA高可用集群的原理 2.搭建MHA高可用数据库集群2.1.环境架构简介2.2.搭建基于GTID的主从复制集群2.2.1.在三台服务器中分别搭建MySQL实…

Prometheus 企业级监控使用总结

一、监控概念&误区 监控是管理基础设施和业务的核心工具,监控应该和应用程序一起构建和部署,没有监控,将无法了解你的系统运行环境,进行故障诊断,也无法阻止提供系统性的性能、成本和状态等信息。 误区&#xff…

监控系统的评分标准

一、监控概念 监控是有效管理基础设施和业务的关键工具。正确的监控应当与应用程序一同构建和部署,因为缺乏监控会导致对系统运行环境的不了解,阻碍故障诊断,以及无法及时获取关键的性能、成本和状态等信息。 然而,我们需要注意一…

CSS 选择器与相关规则详解

CSS(Cascading Style Sheets)的选择器是网页样式设计中至关重要的工具,它们允许开发者精确地定位并应用样式到HTML文档中的元素。下面将逐一介绍几种主要的选择器类型,以及相关的注释和规则。 1. 类选择器 (Class Selector) 类选…

法兰缺损零件设计加工替换盾构机扫描建模厂家抄数修图出CAD图纸

在现代工业生产中,法兰缺损零件的问题时有发生,这不仅会影响设备的正常运行,还会给企业带来巨大的经济损失。为了解决这一问题,CASAIM中科广电三维扫描和3D打印设计加工技术的运用成为了关键。 首先,CASAIM中科广电需要…

【后端】乐观锁和悲观锁

前置知识点 锁:一种确保数据安全的机制和手段。 在多个线程修改共享变量时,我们可以对修改操作进行加锁。当多个用户修改表中的同一数据时,我们可以对该行数据进行加锁(行锁)。锁是用于控制多个操作在并发环境下按顺…

“与客户,共昂首”——Anzo Capital昂首资本尽释行业进取之姿

“以匠心,铸不凡” 活动的现场,Anzo Capital 作为演讲嘉宾分享“以匠心,铸不凡”的产品理念。Anzo Capital积淀九载,匠心打造出“STP”和“ECN”两大核心账户,以光之速度将交易中的订单直达市场和流动性提供商&#…

Unity通过物理带动实现传输带运输物品

前言:遇到个听起来挺简单的需求,就是实现一个传输带,传输物品。但细想发现如果是直接设置物品的速度,或者通过设置父物体的方式带动物品,都挺不好,关联性太强。最后选择用到一个很实用的API, Rigidbody.M…

Vue+OpenLayers7入门到实战:OpenLayers7加载天地图

返回《Vue+OpenLayers7》专栏目录:Vue+OpenLayers7 前言 本章介绍如何使用OpenLayers7在地图上加载天地图. 天地图瓦片访问需要先到天地图申请key。天地图官网链接 本文使用xyz方式加载天地图,并且介绍如何加载xyz格式天地图url,包括天地图纯底图(无标记)、卫星影像图…

SpringMVC入门学习(十)----mvc:annotation-driven标签介绍

目录 1、关于mvc:annotation-driven作用2、mvc:annotation-driven在什么时候必须配置3、关于mvc:annotation-driven配合使用的几种情况 回到顶部 1、关于mvc:annotation-driven作用 [1]、<mvc:annotation-driven /> 会自动向容器中注册如下组件&#xff0c;并且会代替…

0101appscan安装与使用入门-扫描-信息收集

1 简介 HCL AppScan&#xff08;原IBM Security AppScan&#xff09;是原IBM的Rational软件部门的一组网络安全测试和监控工具&#xff0c;2019年被HCL技术公司收购。AppScan旨在在开发过程中对Web应用程序的安全漏洞进行测试[1]。该产品学习每个应用程序的行为&#xff0c;无…

【蓝桥杯51单片机入门记录】LED

目录 一、基础 &#xff08;1&#xff09;新建工程 &#xff08;2&#xff09;编写前准备 二、LED &#xff08;1&#xff09;点亮LED灯 &#xff08;2&#xff09;LED闪烁 延时函数的生成&#xff08;stc-isp中生成&#xff09; 实现 &#xff08;3&#xff09;流水灯…

MG7050HAN 基于声表的差分多输出 晶体振荡器 (HCSL)

基于MG7050 HAN的声表差分多输出晶体振荡器(HCSL)&#xff0c;采用两路或四路差分HCSL&#xff08;高速电流驱动逻辑&#xff09;输出&#xff0c;可以减少外部扇出缓冲区&#xff0c;特别适用于需要超低抖动、高频率范围内稳定工作的应用场合。其输出特性曲线超低抖动&#xf…

降维(Dimensionality Reduction)

一、动机一&#xff1a;数据压缩 这节我将开始谈论第二种类型的无监督学习问题&#xff0c;称为降维。有几个原因使我们可能想要做降维&#xff0c;其一是数据压缩&#xff0c;它不仅允许我们压缩数据使用较少的计算机内存或磁盘空间&#xff0c;而且它可以加快我们的学习算法。…

90年代的黄河路,大家都在用什么方式互相联络?

1992 年的上海&#xff0c;霓虹养眼&#xff0c;万花如海… 新年伊始&#xff0c;一部《繁花》爆火出圈&#xff0c;带观众穿越回了那个灯红酒绿的上海。90 年代的黄河路遍地是机会&#xff0c;商业战场上&#xff0c;信息成了最宝贵的财富&#xff0c;谁能获得最真实有用的资讯…

Python学习之路-DRF基础:视图

Python学习之路-DRF基础:视图 视图概览 简介 REST framework 提供了众多的通用视图基类与扩展类&#xff0c;以简化视图的编写。 视图的继承关系 视图的方法与属性 视图说明 两个基类 APIView 简介 rest_framework.views.APIView APIView是REST framework提供的所有视…