仿射密码实验——Python实现(完整解析版)
文章目录
- 前言
- 实验内容
- 实验操作步骤
- 1.编写主程序
- 2.编写加密模块
- 3.编写解密模块
- 4.编写文件加解密模块
- 实验结果
- 实验心得
- 实验源码
- scirpt.py
- usefile.py
前言
实验目的
1)初步了解古典密码
2)掌握仿射密码的实现
实验方法
根据下图仿射密码(变换)加解密的描述,用所熟悉的语言,完成实验内容、描述实验操作步骤、实验结果与实验心得。
实验环境
计算机语言:Python
开发环境:Pycharm
原理
实验内容
- 编程实现仿射密码,要求有加密步骤和解密步骤。若输入参数a,b不合法,则报错。
- 提供两种解密方法,一是掌握密钥破解,而是无密钥的暴力破解
- 使用两种加解密的操作,一是命令行的输入输出,而是文件的读取写入生成
- 加解密过程中应考虑大小写
实验操作步骤
1.编写主程序
在main主程序里,需要有相应的功能提示
作为菜单栏使用
不同的数字对应实现不同的功能:1加密2解密3文件形式加解密4退出程序
2.编写加密模块
需求有:提示输入明文和密钥,对明文进行仿射密码方式的加密,最后输出
m接收用户输入的明文
c作为数组来存储,a和b就是密钥需要用户提供
对于输入的a和b需整形化,然后判断a、b是否互素通过ab的最大公因数是否为1判断
若不互素则提示用户重新输入
达成互素条件后
首先采用正则表达式处理一下用户输入一些特殊符号
(如果不处理的话,那么形成的密文最后也是解密不了的)
接着采用replace去除空格
进入encrypt模块
在这个模块中,原理就是将之前用户输入的参数m,a,b传入
然后通过先转化成ascii码和进行模运算,这里计算得到的ascii码chr后,得到的是大写的英文字母,为此最后输出的时候提供给用户两种结果:大写和小写
3.编写解密模块
首先提示输入密文,考虑之前我们加密后的结果一般都是只有英文字母的组合
这里我就只有进行大小写的处理
提示用户是否知道密钥,若有则接受参数a和b,同样得判断a,b是否互素来确认密钥的合法性
然后由a计算出k,再传入decrypt模块解密
解密其实就是加密数学上的逆运算
这里刚刚好相反,通过一系列计算得到的是一串小写英文字母
那与之前一样,我们需要给用户提供大写和小写的结果
假如选择不知道密钥的话,那么就是采用暴力破解
也就是数字组合一个个试,这里通过对仿射原理的理解便可以缩小点范围
定义的la数组和lb数组分别如图
4.编写文件加解密模块
这个文件我命名为usefile.py,并且作为库来给之前的脚本代码引用
这个文件其实和之前的代码以及实现的功能差不多
不过为了代码看起来不那么冗长,就单独再写一个模块了
以下是该代码的展示
密钥的输入
互素条件的判断
逆元的求解
文件加密
文件解密
主函数模块
实验结果
开始使用程序
运行script.py
输入数字1
我们用hello作为例子,密钥就为3和4吧
得到密文为ZQLLU 或 zqllu
这次试一下特殊符号
输入hell,,!!o
可以看到加密结果与之前一致
那我们现在试着解密
输入之前的密文zqllu,先按照有密钥解密
得到hello说明正确
再试一下无密钥暴力破解
这一次故意输入大写的ZQLLU,然后寻找一下正确的明文
Ok,与我们之前有密钥解出来结果一致,说明代码可行
好的,我们来看看文件模块运行如何
出现usefile里特有的菜单模块
事先我创建了一个test.txt,里面内含明文hello
运行功能1看看
然后当前目录下多了ciphertext.txt文件,查看该文件
结果没错
我们再试解密功能
该目录下多出plaintext.txt文件,查看该文件
还原成功,是明文hello
这里是提供了密钥,如果暴力破解就是和之前script文件中一致
实验心得
作为古典密码的一种,仿射密码的原理其实挺简单的,所以这次使用python来实现关于仿射密码的加解密难度不大,中间遇到的一些问题还是让我收获不少:加解密时要注意英文字母大小写、特殊符号需要处理、chr和ord的配合使用、编写不同的函数模块和文件来实现CLI版的功能等等,让我对于python的使用更加的得心应手。
很喜欢python的话语:人生苦短,我用python。
希望之后继续使用python解决有关密码学的问题。
实验源码
scirpt.py
# 暴力破解
import usefile as u
import rela = [1, 3, 5, 7, 9, 11, 15, 17, 19, 21, 23, 25]
lb = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13,14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25]# 最大公约数
def gcd(a, b):while b != 0:tem = a % ba = bb = temreturn a# 加密
def encrypt(m, c, a, b):for i in range(len(m)):# 加密成相应的大写字母c.append(chr(((ord(m[i]) - 97) * a + b) % 26 + 65))d = ''.join(c)print(d,"或 {}".format(d.lower()))# 求逆元
def niyuan(a, b):ny = 1while (a * ny) % b != 1:ny += 1return ny# 解密
def decrypt(c, k, b):mw = []for i in range(len(c)):tem = ord(c[i]) - 65 - bif tem < 0:tem += 26mw.append(chr((k * tem) % 26 + 97))print("k=" + str(k) + ", b=" + str(b) + "时,解密后的明文为:")res = ''.join(mw)print(res,"或 {}".format(res.upper()))def jiami():m = input("请输入明文:")c = []x, y = input("请输入a和b: ").split()a = int(x)b = int(y)while gcd(a, b) != 1:x, y = input("a和b不互素,请重新输入a和b: ").split()a = int(x)b = int(y)print("明文内容为:")print(m)r = "[!!+-=——,,。??、]"m = re.sub(r, ' ', m)m = m.replace(' ', '')print("加密后的密文为:")encrypt(m, c, a, b)def jiemi():m = input("请输入密文:")c = []q = input("是否有密钥,有请输入1,无则输入0:")print("密文内容为:")print(m)if int(q)==1:x, y = input("请输入a和b: ").split()a = int(x)b = int(y)while gcd(a, b) != 1:x, y = input("a和b不互素,请重新输入a和b: ").split()a = int(x)b = int(y)m = m.upper()for i in range(len(m)):# 加密成相应的大写字母c.append(m[i])print("知道密钥破解:")k = niyuan(a, 26)decrypt(c, k, b)elif int(q)==0:m = m.upper()# 加密成相应的大写字母for i in range(len(m)):c.append(chr(ord(m[i])))print("不知道秘钥破解,暴力破解如下: ")for i in range(0, 12):for j in range(0, 26):decrypt(c, la[i], lb[j])#实现
if __name__ == "__main__":# 明文while True:print("-------------------------")print("1.仿射密码加密")print("2.仿射密码解密")print("3.文件仿射加解密")print("4.程序退出")n = input("请输入功能对应的数字:")print("-------------------------")if int(n)==1:jiami()elif int(n)==2:jiemi()elif int(n)==3:u.main()elif int(n)==4:print("感谢使用!")breakelse:print("输入有误,请重新输入!")
usefile.py
#仿射密码加密与解密实现算法
# -*- coding=utf-8 -*-#输入密钥
def accept():k1,k2 = map(int,input('请输入两个密钥(以空格隔开):').split())while gcd(k1, 26) !=1:k1,k2 = map(int,input('k1和26不互素,请重新输入密钥:').split())return k1,k2#判断互素
def gcd(k1,m):t = 0while m!=0:t = mm = k1%mk1 = treturn k1#求逆元
def niyuan(k1):n = 1while (k1 * n) % 26 != 1:n += 1return n#加密算法
def encrypt():#输入密钥k1,k2 = accept()n = input("请输入当前目录下需要加密文件名:")f = open(n)plain = f.read()#print(plain)c = []for i in range(len(plain)):#小写字母if plain[i].islower():c.append(chr(((ord(plain[i])-97)*k1+k2)%26+97))#大写字母elif plain[i].isupper():c.append(chr(((ord(plain[i])-65)*k1+k2)%26+65))#其他else :c.append(plain[i])cipher = ''.join(c)w = open('ciphertext.txt','w')w.write(cipher)print('加密完成!')f.close()w.close()#解密算法
def decrypt():#输入密钥k1,k2 = accept()#逆元ny = niyuan(k1)str = input("请输入当前目录下需要解密文件名:")f = open(str)cipher = f.read()p = []for i in range(len(cipher)):#小写字母if cipher[i].islower():t1 = ord(cipher[i])-97-k2if t1 < 0:t1 +=26p.append(chr((ny * t1)%26+97))#大写字母elif cipher[i].isupper():t2 = ord(cipher[i])-65-k2if t2 < 0:t2 +=26p.append(chr((ny * t2)%26+65))#其他else :p.append(cipher[i])plain = ''.join(p)w = open('plaintext.txt','w')w.write(plain)print('解密完成!')f.close()w.close()def main():while True:print("--------文件加解密操作--------")print("加密【1】:")print("解密【2】:")print("退出【3】:")ch = int(input("请输入对应功能数字:"))if ch == 1:encrypt()elif ch == 2:decrypt()elif ch == 3:print("感谢使用!")exit()else:print("请输入1或2")
相关文章:

仿射密码实验——Python实现(完整解析版)
文章目录 前言实验内容实验操作步骤1.编写主程序2.编写加密模块3.编写解密模块4.编写文件加解密模块 实验结果实验心得实验源码scirpt.pyusefile.py 前言 实验目的 1)初步了解古典密码 2)掌握仿射密码的实现 实验方法 根据下图仿射密码(变换…...

【Qt 常用控件】按钮类(QPushButton、QRadioButton、QCheckBox)
按钮控件继承自抽象类QAbstractButton。 抽象类不允许实例化对象,内部定义纯虚函数。只能通过子类继承,重写纯虚函数的方式使用。 1. QPushButton 1.1 QAbstractButton中和QPushButton相关的属性 text按钮显示文本icon按钮图标iconSize按钮图标尺寸s…...

Amazon Relational Database Service (RDS)
Amazon Relational Database Service (RDS) 是 AWS 提供的一项完全托管的关系数据库服务,旨在简化部署、管理和扩展关系型数据库应用程序。通过 RDS,用户可以使用多种流行的关系数据库引擎,如 MySQL、PostgreSQL、MariaDB、Oracle 和 Microso…...

linux分配磁盘空间命令
使用命令lsblk查询linux磁盘空间时,发现空间并没有被分配完 如图,600G,但实际分配了一共199G,剩余500G,我们需要通过命令进行剩余存储的分配。 思路:创建新的分区->更新内核分区表->初始化新分区作…...
21_Spring Boot缓存注解介绍
前面我们通过使用@EnableCaching、@Cacheable注解实现了Spring Boot默认的基于注解的缓存管理,除此之外,还有更多的缓存注解以及注解属性可以配置优化缓存管理。下面我们针对Spring Boot中的缓存注解及相关属性进行详细讲解。 1.@EnableCaching注解 @EnableCaching是由Spri…...
【linux】grep、awk、sed实战练习(1)-template
一、grep常见用法 1.1.从文件中查找关键字符串 # 比如:查找/etc/nginx/nginx.conf文件包含"listen"的行 [rootecs_server test]# grep "listen" -n /etc/nginx/nginx.conf 52: listen 8088; 87: listen 8096; # 比如:查…...

UDP报文格式
UDP是传输层的一个重要协议,他的特性有面向数据报、无连接、不可靠传输、全双工。 下面是UDP报文格式: 1,报头 UDP的报头长度位8个字节,包含源端口、目的端口、长度和校验和,其中每个属性均为两个字节。报头格式为二…...
联想Android面试题及参考答案
请介绍一下 Android 的架构,并谈谈对 Linux 的了解。 Android 架构主要分为四层,从下往上依次是 Linux 内核层、系统运行库层、应用框架层和应用层。 Linux 内核层是 Android 系统的基础。它提供了底层的硬件驱动程序,包括显示驱动、摄像头驱动、音频驱动等多种硬件设备的驱…...

Android CustomTextField
在 Compose 中开发用户界面时,需要处理输入框和键盘的交互,例如在键盘弹出时调整布局位置,避免遮挡重要内容。本篇博客将通过一个完整的示例展示如何实现这一功能。 功能概述 本例实现了一个简单的输入框。当输入框获得焦点或输入文字时&…...
网络设备安全保证计划 (NESAS) - 供应商视角 笔记
NESAS 对供应商的意义 提升产品安全性: NESAS 为供应商提供了一套全球认可的安全评估标准,帮助其识别和解决产品中的安全漏洞。通过 NESAS 评估,供应商可以证明其产品符合行业最高安全标准,增强客户信任。增强市场竞争力: 通过 NESAS 认证的…...

强化学习-蒙特卡洛方法
强化学习-数学理论 强化学习-基本概念强化学习-贝尔曼公式强化学习-贝尔曼最优公式强化学习-值迭代与策略迭代强化学习-蒙特卡洛方法 文章目录 强化学习-数学理论一、蒙特卡洛方法理论(Monte Carlo, MC)二、MC Basic2.1 算法拆解2.2 MC Basic算法 三、MC Exploring Starts3.1 …...

IIO(Industrial I/O)驱动介绍
文章目录 IIO(Industrial I/O)驱动是Linux内核中用于工业I/O设备的子系统,主要用于处理传感器数据采集和转换。以下是其关键点: 功能 数据采集:从传感器读取数据。数据处理:对原始数据进行滤波、校准等操作…...
画流程图 代码生成流程图 流程图自动运行
一:在线平台 典藏 drawio:完全免费;可拆入代码生成;使用方法 Kimi drawio生成流程图:Kimi里面生成Mermaid格式——>生成代码并复制——>进入drawio里面点插入"号"——>高级——>Mermaid——…...
Maven 配置本地仓库
步骤 1:修改 Maven 的 settings.xml 文件 找到你的 Maven 配置文件 settings.xml。 Windows: C:\Users\<你的用户名>\.m2\settings.xmlLinux/macOS: ~/.m2/settings.xml 打开 settings.xml 文件,找到 <localRepository> 标签。如果没有该标…...

计算机网络常见协议
目录 OSPF(Open Shortest Path First) NAT(Network Address Translation) ICMP (Internet Control Message Protocol) HTTPS(SSL/TLS加密) HTTPS协议 1. 对称加密 2. 非对称加密 3. 证书验证 4. 回顾https协议传输流程 HTTP TCP UDP 1. TCP&a…...

SCSSA-BiLSTM基于改进麻雀搜索算法优化双向长短期记忆网络多特征分类预测Matlab实现
SCSSA-BiLSTM基于改进麻雀搜索算法优化双向长短期记忆网络多特征分类预测Matlab实现 目录 SCSSA-BiLSTM基于改进麻雀搜索算法优化双向长短期记忆网络多特征分类预测Matlab实现分类效果基本描述程序设计参考资料 分类效果 基本描述 SCSSA-BiLSTM基于改进麻雀搜索算法优化双向长…...

基于Java+SpringBoot+Vue的前后端分离的体质测试数据分析及可视化设计
基于JavaSpringBootVue的前后端分离的体质测试数据分析及可视化设计 前言 ✌全网粉丝20W,csdn特邀作者、博客专家、CSDN[新星计划]导师、java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ 🍅文末附源码…...

Ansible实战:如何正确选择 command 和shell模块?
在使用Ansible进行自动化运维时,command 和 shell 模块是我们执行命令的好帮手。虽然它们看起来很相似,但在功能特性和适用场景上其实有着明显的不同。正确选择合适的模块不仅能够提高任务的效率,还能帮助我们规避一些潜在的风险。在这篇文章…...

机器学习:监督学习与非监督学习
监督学习是利用带有标签的数据进行训练,模型通过学习输入和输出之间的关系来进行预测。也就是说,数据集中既有输入特征,也有对应的输出标签,模型的目标是找到从输入到输出的映射关系。 而无监督学习则使用没有标签的数据进行训练,模型的任务是发现数据中的内在结构或模式…...

近红外简单ROI分析matlab(NIRS_SPM)
本次笔记主要想验证上篇近红外分析是否正确,因为叠加平均有不同的计算方法,一种是直接将每个通道的5分钟实时长单独进行叠加平均,另一种是将通道划分为1分钟的片段,将感兴趣的通道数据进行对应叠加平均,得到一个总平均…...
云原生核心技术 (7/12): K8s 核心概念白话解读(上):Pod 和 Deployment 究竟是什么?
大家好,欢迎来到《云原生核心技术》系列的第七篇! 在上一篇,我们成功地使用 Minikube 或 kind 在自己的电脑上搭建起了一个迷你但功能完备的 Kubernetes 集群。现在,我们就像一个拥有了一块崭新数字土地的农场主,是时…...
CVPR 2025 MIMO: 支持视觉指代和像素grounding 的医学视觉语言模型
CVPR 2025 | MIMO:支持视觉指代和像素对齐的医学视觉语言模型 论文信息 标题:MIMO: A medical vision language model with visual referring multimodal input and pixel grounding multimodal output作者:Yanyuan Chen, Dexuan Xu, Yu Hu…...

【HarmonyOS 5.0】DevEco Testing:鸿蒙应用质量保障的终极武器
——全方位测试解决方案与代码实战 一、工具定位与核心能力 DevEco Testing是HarmonyOS官方推出的一体化测试平台,覆盖应用全生命周期测试需求,主要提供五大核心能力: 测试类型检测目标关键指标功能体验基…...

【大模型RAG】Docker 一键部署 Milvus 完整攻略
本文概要 Milvus 2.5 Stand-alone 版可通过 Docker 在几分钟内完成安装;只需暴露 19530(gRPC)与 9091(HTTP/WebUI)两个端口,即可让本地电脑通过 PyMilvus 或浏览器访问远程 Linux 服务器上的 Milvus。下面…...
测试markdown--肇兴
day1: 1、去程:7:04 --11:32高铁 高铁右转上售票大厅2楼,穿过候车厅下一楼,上大巴车 ¥10/人 **2、到达:**12点多到达寨子,买门票,美团/抖音:¥78人 3、中饭&a…...
什么是EULA和DPA
文章目录 EULA(End User License Agreement)DPA(Data Protection Agreement)一、定义与背景二、核心内容三、法律效力与责任四、实际应用与意义 EULA(End User License Agreement) 定义: EULA即…...
【HTML-16】深入理解HTML中的块元素与行内元素
HTML元素根据其显示特性可以分为两大类:块元素(Block-level Elements)和行内元素(Inline Elements)。理解这两者的区别对于构建良好的网页布局至关重要。本文将全面解析这两种元素的特性、区别以及实际应用场景。 1. 块元素(Block-level Elements) 1.1 基本特性 …...

Springboot社区养老保险系统小程序
一、前言 随着我国经济迅速发展,人们对手机的需求越来越大,各种手机软件也都在被广泛应用,但是对于手机进行数据信息管理,对于手机的各种软件也是备受用户的喜爱,社区养老保险系统小程序被用户普遍使用,为方…...
C++课设:简易日历程序(支持传统节假日 + 二十四节气 + 个人纪念日管理)
名人说:路漫漫其修远兮,吾将上下而求索。—— 屈原《离骚》 创作者:Code_流苏(CSDN)(一个喜欢古诗词和编程的Coder😊) 专栏介绍:《编程项目实战》 目录 一、为什么要开发一个日历程序?1. 深入理解时间算法2. 练习面向对象设计3. 学习数据结构应用二、核心算法深度解析…...
怎么让Comfyui导出的图像不包含工作流信息,
为了数据安全,让Comfyui导出的图像不包含工作流信息,导出的图像就不会拖到comfyui中加载出来工作流。 ComfyUI的目录下node.py 直接移除 pnginfo(推荐) 在 save_images 方法中,删除或注释掉所有与 metadata …...