当前位置: 首页 > news >正文

仿射密码实验——Python实现(完整解析版)

文章目录

  • 前言
  • 实验内容
  • 实验操作步骤
    • 1.编写主程序
    • 2.编写加密模块
    • 3.编写解密模块
    • 4.编写文件加解密模块
  • 实验结果
  • 实验心得
  • 实验源码
    • scirpt.py
    • usefile.py


前言

实验目的
1)初步了解古典密码
2)掌握仿射密码的实现

实验方法
根据下图仿射密码(变换)加解密的描述,用所熟悉的语言,完成实验内容、描述实验操作步骤、实验结果与实验心得。

实验环境
计算机语言:Python
开发环境:Pycharm


原理
在这里插入图片描述

实验内容

  1. 编程实现仿射密码,要求有加密步骤和解密步骤。若输入参数a,b不合法,则报错。
  2. 提供两种解密方法,一是掌握密钥破解,而是无密钥的暴力破解
  3. 使用两种加解密的操作,一是命令行的输入输出,而是文件的读取写入生成
  4. 加解密过程中应考虑大小写

实验操作步骤

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&#xff09;初步了解古典密码 2&#xff09;掌握仿射密码的实现 实验方法 根据下图仿射密码&#xff08;变换…...

【Qt 常用控件】按钮类(QPushButton、QRadioButton、QCheckBox)

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

Amazon Relational Database Service (RDS)

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

linux分配磁盘空间命令

使用命令lsblk查询linux磁盘空间时&#xff0c;发现空间并没有被分配完 如图&#xff0c;600G&#xff0c;但实际分配了一共199G&#xff0c;剩余500G&#xff0c;我们需要通过命令进行剩余存储的分配。 思路&#xff1a;创建新的分区->更新内核分区表->初始化新分区作…...

21_Spring Boot缓存注解介绍

前面我们通过使用@EnableCaching、@Cacheable注解实现了Spring Boot默认的基于注解的缓存管理,除此之外,还有更多的缓存注解以及注解属性可以配置优化缓存管理。下面我们针对Spring Boot中的缓存注解及相关属性进行详细讲解。 1.@EnableCaching注解 @EnableCaching是由Spri…...

【linux】grep、awk、sed实战练习(1)-template

一、grep常见用法 1.1.从文件中查找关键字符串 # 比如&#xff1a;查找/etc/nginx/nginx.conf文件包含"listen"的行 [rootecs_server test]# grep "listen" -n /etc/nginx/nginx.conf 52: listen 8088; 87: listen 8096; # 比如&#xff1a;查…...

UDP报文格式

UDP是传输层的一个重要协议&#xff0c;他的特性有面向数据报、无连接、不可靠传输、全双工。 下面是UDP报文格式&#xff1a; 1&#xff0c;报头 UDP的报头长度位8个字节&#xff0c;包含源端口、目的端口、长度和校验和&#xff0c;其中每个属性均为两个字节。报头格式为二…...

联想Android面试题及参考答案

请介绍一下 Android 的架构,并谈谈对 Linux 的了解。 Android 架构主要分为四层,从下往上依次是 Linux 内核层、系统运行库层、应用框架层和应用层。 Linux 内核层是 Android 系统的基础。它提供了底层的硬件驱动程序,包括显示驱动、摄像头驱动、音频驱动等多种硬件设备的驱…...

Android CustomTextField

在 Compose 中开发用户界面时&#xff0c;需要处理输入框和键盘的交互&#xff0c;例如在键盘弹出时调整布局位置&#xff0c;避免遮挡重要内容。本篇博客将通过一个完整的示例展示如何实现这一功能。 功能概述 本例实现了一个简单的输入框。当输入框获得焦点或输入文字时&…...

网络设备安全保证计划 (NESAS) - 供应商视角 笔记

NESAS 对供应商的意义 提升产品安全性: NESAS 为供应商提供了一套全球认可的安全评估标准&#xff0c;帮助其识别和解决产品中的安全漏洞。通过 NESAS 评估&#xff0c;供应商可以证明其产品符合行业最高安全标准&#xff0c;增强客户信任。增强市场竞争力: 通过 NESAS 认证的…...

强化学习-蒙特卡洛方法

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

IIO(Industrial I/O)驱动介绍

文章目录 IIO&#xff08;Industrial I/O&#xff09;驱动是Linux内核中用于工业I/O设备的子系统&#xff0c;主要用于处理传感器数据采集和转换。以下是其关键点&#xff1a; 功能 数据采集&#xff1a;从传感器读取数据。数据处理&#xff1a;对原始数据进行滤波、校准等操作…...

画流程图 代码生成流程图 流程图自动运行

一&#xff1a;在线平台 典藏 drawio&#xff1a;完全免费&#xff1b;可拆入代码生成&#xff1b;使用方法 Kimi drawio生成流程图&#xff1a;Kimi里面生成Mermaid格式——>生成代码并复制——>进入drawio里面点插入"号"——>高级——>Mermaid——…...

Maven 配置本地仓库

步骤 1&#xff1a;修改 Maven 的 settings.xml 文件 找到你的 Maven 配置文件 settings.xml。 Windows: C:\Users\<你的用户名>\.m2\settings.xmlLinux/macOS: ~/.m2/settings.xml 打开 settings.xml 文件&#xff0c;找到 <localRepository> 标签。如果没有该标…...

计算机网络常见协议

目录 OSPF(Open Shortest Path First) NAT(Network Address Translation) ICMP (Internet Control Message Protocol) HTTPS&#xff08;SSL/TLS加密&#xff09; 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技术领域和毕业项目实战✌ &#x1f345;文末附源码…...

Ansible实战:如何正确选择 command 和shell模块?

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

机器学习:监督学习与非监督学习

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

近红外简单ROI分析matlab(NIRS_SPM)

本次笔记主要想验证上篇近红外分析是否正确&#xff0c;因为叠加平均有不同的计算方法&#xff0c;一种是直接将每个通道的5分钟实时长单独进行叠加平均&#xff0c;另一种是将通道划分为1分钟的片段&#xff0c;将感兴趣的通道数据进行对应叠加平均&#xff0c;得到一个总平均…...

多自由度冗余空间机械臂位姿一体化规划与控制【附代码】

✨ 长期致力于空间机械臂、对偶四元数、位姿一体化、路径规划、跟踪控制研究工作&#xff0c;擅长数据搜集与处理、建模仿真、程序编写、仿真设计。 ✅ 专业定制毕设、代码 ✅ 如需沟通交流&#xff0c;点击《获取方式》 &#xff08;1&#xff09;基于对偶四元数的冗余机械臂运…...

关于psthon问题

我想问问各位 我python可以查到 但是我的bit文件查不到python怎么回事...

关联规则挖掘在Calabi-Yau流形Hodge数分析中的应用与复现

1. 项目概述&#xff1a;当数据挖掘遇见高维几何在理论物理和代数几何的交叉领域&#xff0c;Calabi-Yau流形一直扮演着核心角色。这些具有特殊拓扑结构的空间&#xff0c;不仅是弦理论中额外维度紧化的关键候选者&#xff0c;其本身丰富的数学性质也吸引着无数研究者。然而&am…...

WarcraftHelper终极指南:魔兽争霸3兼容性问题一站式解决方案

WarcraftHelper终极指南&#xff1a;魔兽争霸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完全指南

如何在浏览器中一键解密所有加密音乐文件&#xff1a;Unlock-Music完全指南 【免费下载链接】unlock-music 在浏览器中解锁加密的音乐文件。原仓库&#xff1a; 1. https://github.com/unlock-music/unlock-music &#xff1b;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打造企业级人力资源管理系统&#xff1a;30模块完全指南 【免费下载链接】OpenHRMS 项目地址: https://gitcode.com/gh_mirrors/op/OpenHRMS 还在为繁琐的人力资源管理头疼吗&#xff1f;&#x1f914; 面对员工考勤、薪酬计算、绩效评估等复杂流程&…...

告别硬编码!在UE5 GAS中实现动态技能键位绑定:从DataAsset配置到运行时热更新的完整流程

告别硬编码&#xff01;在UE5 GAS中实现动态技能键位绑定&#xff1a;从DataAsset配置到运行时热更新的完整流程在当代RPG游戏开发中&#xff0c;技能系统的灵活性和可配置性往往决定了项目的迭代效率。传统硬编码的键位绑定方式不仅增加了程序与策划的沟通成本&#xff0c;更在…...

Windows 11终极优化指南:Win11Debloat一键清理系统提升51%性能

Windows 11终极优化指南&#xff1a;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…...