仿射密码

古典密码,且属于单表加密。

加密算法

  • 仿射密码公式
    c = m×k + b mod 26

    • c是密文,m是明文,m作为26字母中的明文,因此计算出来的密文要模26
    • 仿射密码是对单个字母加密,因此加密文本的时候会采用循环加密
  • k
    k在放射密码中作为乘数

    • k要与b要互素
    • 因为k要做乘数,所以必须要和26互素,否则加密失败
  • b
    b在放射密码中作为加数

    • b要与k互素
key_k = 9
key_b = 7
cipher = [] #存放对应的密文数字
p = 26
mess = 'abc'
for ch in mess: # 首先将所有信息转化为大写字母, 非字母的不进入存储
if ord('A') <= ord(ch) <= ord('Z') \
or ord('a') <= ord(ch) <= ord('z'):
temp_num = ((ord(ch.upper()) - ord('A')) * key_k + key_b) % p
cipher.append(temp_num)
print(cipher)
mess = ''
#将转化出来的密文数字转为加密后的密文字母并打印出来
for i in cipher:
mess+=chr(i+ord('A'))
print(mess)

解密算法


x = 0
y = 0 #计算模运算
def ext_gcd(a, b):
global x
global y
if (b == 0):
x = 1
y = 0
return a
res = ext_gcd(b, a % b)
x1 = x
x = y
y = x1 - a // b * y
return res # //线性方程 ax + by = m,当m是gcd(a.b)的倍数时有解 #求解线性方程解
def linearEquation(a, b, m):
global x
global y
d = ext_gcd(a, b)
if (m % d != 0):
print("无解")
return
else:
n = m // d
x *= n;
y *= n; return x, y
  • 仿射密码解密全过程
    (这里用到了上面两个函数,记得拷贝上面的代码再用下面的)


key_k = 9
key_b = 7
cipher = 'HQZ'
p = 26
deCipher = []
temp = 0
dit = linearEquation(key_k, p, math.gcd(key_k, p))
key_k_1 = dit[0]
print('k的逆:', key_k_1)
for ch in cipher:
if ord('A') <= ord(ch) <= ord('Z') \
or ord('a') <= ord(ch) <= ord('z'):
temp = ((ord(ch.upper()) - ord('A') - key_b) * key_k_1) % p
deCipher.append(temp)
message = ''
# 输出
for i in deCipher:
message += chr(i + ord('A'))
print(message)

密码学—仿射密码Python程序的更多相关文章

  1. 仿射密码Python实现

    算法分析 仿射密码结合了移位密码和乘数密码的特点,是移位密码和乘数密码的组合. 仿射密码的加密算法就是一个线性变化,即对明文字符x,对应的密文字符为y=ax+b(mod26)其中,a, b属于Z26且 ...

  2. 使用Python解密仿射密码

    新学期有一门密码学课,课上老师布置了一道密码学题,题目如下: 解密由仿射密码加密的密文“DBUHU SPANO SMPUS STMIU SBAKN OSMPU SS” 想解密这个密文,首先必须要知道仿 ...

  3. 仿射密码-fanfie--affine

    仿射密码 仿射密码 是一种专情密码,一对一替换 ~~ 加密函数是 e(x) = ax + b (mod m) 其中a和m 互质,m是字母的数目. 解码函数是 d(x) = a^-1(x - b) (m ...

  4. Python:使用Kivy将python程序打包为apk文件

    1.概述 Kivy是一套Python下的跨平台开源应用开发框架,官网,我们可以用 它来将Python程序打包为安卓的apk安装文件.以下是在windows环境中使用. 安装和配置的过程中会下载很多东西 ...

  5. 想拥有自己的Python程序包,你只需15步

    来源商业新知网,原标题:15步,你就能拥有自己的Python程序包 全文共 3192 字,预计学习时长 6 分钟 每个软件开发员和数据科学家都难免要做程序包.本文推荐一篇 Python开源程序包的制作 ...

  6. Windows系统中设置Python程序定时运行方法

    Windows系统中设置Python程序定时运行方法 一.环境 win7 + Python3.6 二.步骤 1,在Windows开始菜单中搜索“计划任务”,并且点击打开“计划任务”: 2.点击“创建基 ...

  7. Python学习笔记一:第一个Python程序,变量,字符编码与二进制,用户交互程序

    第一个python程序 Windows:设置环境变量,X:\pthonxxx,xxx是版本号 在命令提示符下 输入python,进入解释器 >>>print(“Hello World ...

  8. 如何把自己写的python程序给别人用

    这里讲的给别人用,不是指将你的代码开源,也不是指给另一个程序员用..... 前段时间写了个程序,输入URP学生系统的账号和密码,输出课表.绩点之类的信息,想给同学用,但是总不能叫别人也去装python ...

  9. 远程编写+调试服务器上的Python程序

    原帖参见(需自备梯子):https://webcache.googleusercontent.com/search?q=cache:1htdR2EXj5wJ:https://www.digitaloc ...

  10. 有待总结的KMP算法 sdut oj 2463 学密码学一定得学程序

    学密码学一定得学程序 Time Limit: 1000ms   Memory limit: 65536K  有疑问?点这里^_^ 题目描述 曾经,ZYJ同学非常喜欢密码 学.有一天,他发现了一个很长很 ...

随机推荐

  1. 使用OHOS SDK构建zziplib

    参照OHOS IDE和SDK的安装方法配置好开发环境. 从gitee下载源码,当前最新的提交记录ID为6699e0fe8a0307b16dcc055eda04452e13abe63a. 执行如下命令: ...

  2. 密码学系列之:SAFER

    密码学系列之:SAFER 简介 分组密码是一个非常优秀的加密结构,很多常用加的加密算法使用的都是分组算法,比如DES.SAFER表示的也是一种分组密码算法.一起来看看吧. SAFER简介 SAFER的 ...

  3. 探索生成式AI的未来:Chat与Agent的较量与融合

    近年来,生成式人工智能(AI)不仅在技术界引起了广泛关注,更成为了推动多个行业革新的关键力量.这种技术之所以备受瞩目,不仅在于其独特的创造性和高效性,还在于它对未来商业模式和社会结构可能产生的深远影响 ...

  4. 【FAQ】HarmonyOS SDK 闭源开放能力 —Push Kit(2)

    1.问题描述: 开发服务端推送,客户端能收到离线推送,但是推送收到的通知只能从手机顶部下拉看到,无法收到一个顶部的弹框.请问是什么原因? 解决方案: 可能原因一: 消息提醒的方式与消息类别有关,比如: ...

  5. Qt多语言动态切换

    有个软件,里面做了13种语言,销售要求实现重新设置软件语言后,不需要重启软件,就可以看到软件显示出对应的语言.   软件中所有需要翻译的地方都是用的 tr(QString) 来做的,并且软件是多个窗口 ...

  6. 阿里开源的32B大模型到底强在哪里?

    阿里巴巴最近开源了一个320亿参数的大语言模型Qwen1.5-32B,网上都说很强很强,那么它到底强在哪里呢? 更高的性价比 Qwen1.5-32B中的B是billion的意思,也就是10亿,32B就 ...

  7. openGauss数据库xlog目录满问题处理

    openGauss 数据库 xlog 目录满问题处理 openGauss 数据库 xlog 满通常为以下几个原因: 1.主备状态不正常,存在网络问题,集群内有宕机的节点 2.xlog 保留数量过多 3 ...

  8. 基于tapd的git commit规范

    现状 开发团队中,总是有人提交代码时的commit内容乱写一通,或者不明确不完整.当回溯代码的时候,很难通过commit内容定位历史记录,只能一条一条查看,找不到就要去问历史参与开发的其他同事,沟通成 ...

  9. vue watch的this 到底是什么?

    正文 watch: { value: (newV, oldV) => { this.a = newV; } } 加入该vue对象中,data 有: { data:{ a:5 } } 那么请问,如 ...

  10. 力扣153(java&python)-寻找旋转排序数组中的最小值(中等)

    题目: 已知一个长度为 n 的数组,预先按照升序排列,经由 1 到 n 次 旋转 后,得到输入数组.例如,原数组 nums = [0,1,2,4,5,6,7] 在变化后可能得到:若旋转 4 次,则可以 ...