仿射密码实验——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")

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

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

相关文章

回归预测 | MATLAB实SVM支持向量机多输入单输出回归预测

效果一览 基本介绍 回归预测 | MATLAB实SVM支持向量机多输入单输出回归预测 …………训练集误差指标………… 1.均方差(MSE)&#xff1a;166116.6814 2.根均方差(RMSE)&#xff1a;407.5741 3.平均绝对误差&#xff08;MAE&#xff09;&#xff1a;302.5888 4.平均相对百分误…

Oracle 批量投入数据方法总结

目录 零. 待投入数据的表结构一. INSERT INTO ... SELECT投入数据1.1 普通的方式投入数据1.2 并行插入&#xff08;Parallel Insert&#xff09;投入数据 二. PL/SQL 循环投入数据2.1 脚本介绍2.2 效果 三. &#x1f4aa;PL/SQL FORALL 批量操作&#x1f4aa;3.1 脚本介绍3.2 效…

Git学习笔记

Git学习笔记 目录 版本控制 本地版本控制 集中版本控制 分布式版本控制 基本使用方式 Git Config Git Remote Git Add Objects Refs Annotation Tag 追溯历史版本 修改历史版本 Git GC Git Clone & Pull & Fetch Git Push 常见问题 不同的工作流 集…

【Block总结】掩码窗口自注意力 (M-WSA)

摘要 论文链接&#xff1a;https://arxiv.org/pdf/2404.07846 论文标题&#xff1a;Transformer-Based Blind-Spot Network for Self-Supervised Image Denoising Masked Window-Based Self-Attention (M-WSA) 是一种新颖的自注意力机制&#xff0c;旨在解决传统自注意力方法在…

卷积神经05-GAN对抗神经网络

卷积神经05-GAN对抗神经网络 使用Python3.9CUDA11.8Pytorch实现一个CNN优化版的对抗神经网络 简单的GAN图片生成 CNN优化后的图片生成 优化模型代码对比 0-核心逻辑脉络 1&#xff09;Anacanda使用CUDAPytorch2&#xff09;使用本地MNIST进行手写图片训练3&#xff09;…

怎么在iPhone手机上使用便签进行记录?

宝子们&#xff0c;在这个快节奏的时代&#xff0c;灵感的火花总是一闪而过&#xff0c;待办事项也常常让人应接不暇。好在咱们的 iPhone手机便签超给力&#xff0c;能满足各种记录需求&#xff01;今天就来给大家分享一下&#xff0c;如何在 iPhone 手机上巧用便签&#xff0c…

基于微信小程序的摄影竞赛系统设计与实现(LW+源码+讲解)

专注于大学生项目实战开发,讲解,毕业答疑辅导&#xff0c;欢迎高校老师/同行前辈交流合作✌。 技术范围&#xff1a;SpringBoot、Vue、SSM、HLMT、小程序、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、安卓app、大数据、物联网、机器学习等设计与开发。 主要内容&#xff1a;…

【从零开始使用系列】StyleGAN2:开源图像生成网络——环境搭建与基础使用篇(附大量测试图)

StyleGAN2 是英伟达团队 NVIDIA 提出的生成对抗网络&#xff08;GAN&#xff09;的一种改进版本。 它通过创新的网络架构&#xff0c;能够生成细节丰富、逼真的图像&#xff0c;特别在高频细节&#xff08;如皮肤纹理、光照等&#xff09;的表现上表现卓越。与传统 GAN 相比&am…

redis(2:数据结构)

1.String 2.key的层级格式 3.Hash 4.List 5.Set 6.SortedSet

LabVIEW 程序中的 R6025 错误

R6025错误 通常是 运行时库 错误&#xff0c;特别是与 C 运行时库 相关。这种错误通常会在程序运行时出现&#xff0c;尤其是在使用 C 编译的程序或依赖 C 运行时库的程序时。 ​ 可能的原因&#xff1a; 内存访问冲突&#xff1a; R6025 错误通常是由于程序在运行时访问无效内…

前端【2】html添加样式、CSS选择器

一、为html添加样式的三种方法 1、内部样式 2、外部样式 3、行内样式 二、css的使用--css选择器 1、css基本选择器 元素选择器 属性选择器 id选择器 class/类选择器 通配符选择器 2、群组选择器-多方面筛选 3、关系选择器 后代选择器【包含选择器】 子元素选择器…

【Elasticsearch】全文搜索与相关性排序

&#x1f9d1; 博主简介&#xff1a;CSDN博客专家&#xff0c;历代文学网&#xff08;PC端可以访问&#xff1a;https://literature.sinhy.com/#/?__c1000&#xff0c;移动端可微信小程序搜索“历代文学”&#xff09;总架构师&#xff0c;15年工作经验&#xff0c;精通Java编…

【算法】枚举

枚举 普通枚举1.铺地毯2.回文日期3.扫雷 二进制枚举1.子集2.费解的开关3.Even Parity 顾名思义&#xff0c;就是把所有情况全都罗列出来&#xff0c;然后找出符合题目要求的那一个。因此&#xff0c;枚举是一种纯暴力的算法。一般情况下&#xff0c;枚举策略都是会超时的。此时…

51单片机——DS18B20温度传感器

由于DS18B20数字温度传感器是单总线接口&#xff0c;所以需要使用51单片机的一个IO口模拟单总线时序与DS18B20通信&#xff0c;将检测的环境温度读取出来 1、DS18B20模块电路 传感器接口的单总线管脚接至单片机P3.7IO口上 2、DS18B20介绍 2.1 DS18B20外观实物图 管脚1为GN…

云手机技术怎么实现的?

前言 随着亚矩阵云手机在跨境电商、海外社媒矩阵搭建、出海运营、海外广告投放、国内新媒体矩阵运营、品牌应用矩阵运营等领域内的普及和使用&#xff0c;云手机的理念已经被越来越多人所接受和认同。今天我们就一起来浅析一下&#xff0c;到底云手机的技术是怎么实现的&#…

HTML中link的用法

一点寒芒先到&#xff0c;随后&#xff0c;抢出如龙&#xff01; 对于本人而言&#xff0c;这篇笔记内容有些扩展了&#xff0c;有些还未学到的也用上了&#xff0c;但是大概可以使用的明白&#xff0c;坚持下去&#xff0c;相信一定可以建设一个稳固的根基。 该文章为个人成…

闪豆多平台视频批量下载器

1. 视频链接获取与解析 首先&#xff0c;在哔哩哔哩网页中随意点击一个视频&#xff0c;比如你最近迷上了一个UP主的美食制作视频&#xff0c;想要下载下来慢慢学。点击视频后&#xff0c;复制视频页面的链接。复制完成后&#xff0c;不要急着关闭浏览器&#xff0c;因为接下来…

Vulnhub DC-8靶机攻击实战(一)

导语   Vulnhub DC-8靶机教程来了,好久没有更新打靶的教程了,这次我们在来更新一期关于Vulnhub DC-8的打靶训练,如下所示。 安装并且启动靶机 安装并且启动靶机,如下所示。 开始信息采集 进入到Kali中,通过如下的命令来查找到靶机的IP地址。 arp-scan -l根据上面的结…

JWT在线解密/解码 - 加菲工具

JWT在线解密/解码 首先进入加菲工具 选择 “JWT 在线解密/解码” https://www.orcc.online 或者直接进入JWT 在线解密/解码 https://www.orcc.online/tools/jwt 进入功能页面 使用 输入对应的jwt内容&#xff0c;点击解码按钮即可

换了城市ip属地会变吗?为什么换了城市IP属地不变

当我们跨越城市的界限&#xff0c;从一个地方迁移到另一个地方时&#xff0c;许多日常使用的网络服务和应用程序都会感知到这种变化&#xff0c;其中一个显著的现象就是IP属地的变化。IP属地&#xff0c;即IP地址所在的地理位置信息&#xff0c;它通常与互联网服务提供商&#…