仿射密码实验

您所在的位置:网站首页 python字符加密2编程 仿射密码实验

仿射密码实验

2023-12-12 16:42| 来源: 网络整理| 查看: 265

文章目录 前言实验内容实验操作步骤1.编写主程序2.编写加密模块3.编写解密模块4.编写文件加解密模块 实验结果实验心得实验源码scirpt.pyusefile.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 re la = [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 % b a = b b = tem return 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 = 1 while (a * ny) % b != 1: ny += 1 return ny # 解密 def decrypt(c, k, b): mw = [] for i in range(len(c)): tem = ord(c[i]) - 65 - b if tem


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3