仿射密码实验——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分钟的片段,将感兴趣的通道数据进行对应叠加平均,得到一个总平均…...
多自由度冗余空间机械臂位姿一体化规划与控制【附代码】
✨ 长期致力于空间机械臂、对偶四元数、位姿一体化、路径规划、跟踪控制研究工作,擅长数据搜集与处理、建模仿真、程序编写、仿真设计。 ✅ 专业定制毕设、代码 ✅ 如需沟通交流,点击《获取方式》 (1)基于对偶四元数的冗余机械臂运…...
关于psthon问题
我想问问各位 我python可以查到 但是我的bit文件查不到python怎么回事...
关联规则挖掘在Calabi-Yau流形Hodge数分析中的应用与复现
1. 项目概述:当数据挖掘遇见高维几何在理论物理和代数几何的交叉领域,Calabi-Yau流形一直扮演着核心角色。这些具有特殊拓扑结构的空间,不仅是弦理论中额外维度紧化的关键候选者,其本身丰富的数学性质也吸引着无数研究者。然而&am…...
WarcraftHelper终极指南:魔兽争霸3兼容性问题一站式解决方案
WarcraftHelper终极指南:魔兽争霸3兼容性问题一站式解决方案 【免费下载链接】WarcraftHelper Warcraft III Helper , support 1.20e, 1.24e, 1.26a, 1.27a, 1.27b 项目地址: https://gitcode.com/gh_mirrors/wa/WarcraftHelper 还在为《魔兽争霸3》在现代电…...
论文润色深度测评:GPT-5.5 + Gemini 3.1 Pro:教你学会1+1>2的论文润色方法
各位同仁好,我是七哥。一个在高校里从事人工智能相关领域研究,钻研用大模型AI实操的学术人。可以和七哥交流学术写作或Gemini、GPT、Claude等大模型学术实操相关问题,多多交流,相互成就,共同进步。 2026年的科研圈,AI工具的选择已经从有没有变成了强不强,七哥评测了GPT…...
如何在浏览器中一键解密所有加密音乐文件:Unlock-Music完全指南
如何在浏览器中一键解密所有加密音乐文件:Unlock-Music完全指南 【免费下载链接】unlock-music 在浏览器中解锁加密的音乐文件。原仓库: 1. https://github.com/unlock-music/unlock-music ;2. https://git.unlock-music.dev/um/web 项目地…...
【数据结构与算法】数据结构基础——栈和队列
目录栈和队列1. 栈1.1 栈的概念1.2 栈的实现方式分析1.3 栈的实现1.3.1 栈的初始化与销毁1.3.2 入栈与出栈1.3.3 栈的判空与有效元素个数1.3.4 栈顶元素1.4 栈的扩展1.4.1 两栈共享空间2. 队列2.1 队列的概念2.2 队列的实现方式分析2.3 队列的实现2.3.1 队列的初始化与销毁2.3.…...
如何用OpenHRMS打造企业级人力资源管理系统:30+模块完全指南
如何用OpenHRMS打造企业级人力资源管理系统:30模块完全指南 【免费下载链接】OpenHRMS 项目地址: https://gitcode.com/gh_mirrors/op/OpenHRMS 还在为繁琐的人力资源管理头疼吗?🤔 面对员工考勤、薪酬计算、绩效评估等复杂流程&…...
告别硬编码!在UE5 GAS中实现动态技能键位绑定:从DataAsset配置到运行时热更新的完整流程
告别硬编码!在UE5 GAS中实现动态技能键位绑定:从DataAsset配置到运行时热更新的完整流程在当代RPG游戏开发中,技能系统的灵活性和可配置性往往决定了项目的迭代效率。传统硬编码的键位绑定方式不仅增加了程序与策划的沟通成本,更在…...
Windows 11终极优化指南:Win11Debloat一键清理系统提升51%性能
Windows 11终极优化指南:Win11Debloat一键清理系统提升51%性能 【免费下载链接】Win11Debloat A simple, lightweight PowerShell script that allows you to remove pre-installed apps, disable telemetry, as well as perform various other changes to declutte…...
