仿射密码实验——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分钟的片段,将感兴趣的通道数据进行对应叠加平均,得到一个总平均…...
Windows系统优化神器:Winhance中文版全面使用指南
Windows系统优化神器:Winhance中文版全面使用指南 【免费下载链接】Winhance-zh_CN A Chinese version of Winhance. C# application designed to optimize and customize your Windows experience. 项目地址: https://gitcode.com/gh_mirrors/wi/Winhance-zh_CN …...
物理信息机器学习新突破!连中SCI一区TOP刊!
小伙伴们好,我是小嬛。专注于人工智能、计算机视觉、AI大模型领域相关分享研究。【目标检测、图像分类、图像分割、目标跟踪等项目都可做,相关领域论文辅导也可以找我;需要的可联系(备注来意)】-------正文开始-------…...
消费增值生态:从规则设计到商业价值实现
还在为用户复购低、留存弱、平台难长效而困扰?当多数商家还困在传统经营思路里止步不前,一套依托真实消费、贴合政策导向的增值生态已然崛起。它以合规为底、以价值为核、以闭环为骨架,正在重新定义平台与商家的增长逻辑,成为数字…...
WMatrix 7语料库分析工具上线:隐喻识别高效精准,语言学研究利器
温馨提示:文末有联系方式WMatrix 7:专为语料库驱动隐喻分析优化的实用工具 WMatrix 7是当前广受语言学研究者青睐的语料库分析平台,内置强大词性标注、搭配提取与语义域分类功能,尤其在隐喻识别(如MVU框架适配…...
什么是 AI Agent?它和直接调用大模型 API 做一次问答有什么本质区别?
👨⚕️ 主页: gis分享者 👨⚕️ 感谢各位大佬 点赞👍 收藏⭐ 留言📝 加关注✅! 👨⚕️ 收录于专栏:AI大模型原理和应用面试题 文章目录一、🍀AI Agent概念、AI Agent和直接…...
用 Bedrock AgentCore SDK 把 OpenClaw Agent 部署到 AWS 托管运行时:从本地开发到生产上线全流程
用 Bedrock AgentCore SDK 把 OpenClaw Agent 部署到 AWS 托管运行时:从本地开发到生产上线全流程 手里有个跑得好好的 OpenClaw Agent,想搬到 AWS 上让它自动扩缩、有监控有告警?Amazon Bedrock AgentCore 就是干这个的——把任意框架的 AI …...
收藏!小白也能看懂的大模型推理能力训练与未来趋势深度解析
文章讨论了大模型的发展历程,从早期的“读很多书”模式到引入“思考”能力的转变。重点介绍了推理式思考与智能体式思考的区别,以及Qwen团队在模型训练中的经验与挑战。文章指出,未来的重心将从单纯训练模型“思考”转向训练智能体“边想边做…...
Graphormer效果对比评测:vs GCN、GAT、GIN在分子回归任务上的表现
Graphormer效果对比评测:vs GCN、GAT、GIN在分子回归任务上的表现 1. 引言 在药物发现和材料科学领域,准确预测分子属性是一个关键挑战。传统方法依赖昂贵的实验或复杂的量子化学计算,而图神经网络(GNN)提供了一种更高效的替代方案。本文将…...
告别版本冲突:利用快马平台高效管理多jdk环境,提升开发效率
作为一名Java开发者,我经常遇到这样的困扰:接手不同项目时,每个项目可能要求使用不同版本的JDK。手动切换环境变量、反复安装卸载JDK版本,不仅浪费时间,还容易出错。最近我发现了一个高效的解决方案——利用InsCode(快…...
技术赋能B端拓客:号码核验行业的迭代升级与价值深耕,
在数字经济持续深耕的当下,B端市场的竞争逻辑已发生根本性转变,“粗放拓客”逐渐被“精准高效”取代,企业对拓客全流程的效率与成本管控提出了更高要求。号码核验作为B端拓客的前置核心环节,其作用远不止于简单的空号筛查…...
