仿射密码解密(Affine Cipher)

2024-01-06 13:08

本文主要是介绍仿射密码解密(Affine Cipher),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

仿射密码解密(Affine Cipher)

仿射密码是一种表单代换密码,字母表的每个字母相应的值使用一个简单的数学函数对应一个数值,再把对应数值转换成字母。

ABCDEFGHIJKLMNOPQRSTUVWXYZ
012345678910111213141516171819202122232425

加密函数:E(x) = (ax + b) (mod m),其中 a与b互质,m是编码系统中字母的个数(通常都是26)。

解密函数:D(x) = a^{-1} (x - b) (mod m),其中 a^{-1} 是 a 在Z_{m}群的乘法逆元。

下面就要介绍一下什么叫做乘法逆元:emmmmmm,好吧,我也不会,没看懂。

这是网上关于使用欧几里得算法求解乘法逆元——Python的代码:(我是一个勤劳的搬运工,不要夸我^_^)

  1. #欧几里德算法求最大公约数
  2. def get_gcd(a, b):
  3. k = a // b
  4. remainder = a % b
  5. while remainder != 0:
  6. a = b
  7. b = remainder
  8. k = a // b
  9. remainder = a % b
  10. return b
  11. #改进欧几里得算法求线性方程的x与y
  12. def get_(a, b):
  13. if b == 0:
  14. return 1, 0
  15. else:
  16. k = a // b
  17. remainder = a % b
  18. x1, y1 = get_(b, remainder)
  19. x, y = y1, x1 - k * y1
  20. return x, y
  21. a = input('a:')
  22. b = input('b:')
  23. a, b = int(a), int(b)
  24. #将初始b的绝对值进行保存
  25. if b < 0:
  26. m = abs(b)
  27. else:
  28. m = b
  29. flag = get_gcd(a, b)
  30. #判断最大公约数是否为1,若不是则没有逆元
  31. if flag == 1:
  32. x, y = get_(a, b)
  33. x0 = x % m #对于Python '%'就是求模运算,因此不需要'+m'
  34. print("所求的逆元:",x0) #x0就是所求的逆元
  35. else:
  36. print("Do not have!")

比如求5关于模26的乘法逆元

 

下面举个例子,求解仿射密码(搬运工上线...):

我们以 E(x)=(5x+8) mod 26函数为例子进行介绍,加密字符串为 AFFINECIPHER,这里我们直接采用字母表26个字母作为编码系统

密文就是IHHWVCSWFRCP。

解密过程:

  1. 先求解5关于模26的乘法逆元,为21
  2. 解密函数就是D(x) = 21(x - 8) mod 26 
  3. 解密如下

 下面是关于求仿射密码的python3脚本(自己写的,有错请指正):

  1. #仿射密码解密
  2. #改进欧几里得算法求线性方程的x与y
  3. def get(a, b):
  4. if b == 0:
  5. return 1, 0
  6. else:
  7. k = a //b
  8. remainder = a % b
  9. x1, y1 = get(b, remainder)
  10. x, y =y1, x1 - k * y1
  11. return x, y
  12. s = input("请输入解密字符:").upper()
  13. a = int(input("请输入a:"))
  14. b = int(input("请输入b:"))
  15. #求a关于26的乘法逆元
  16. x, y = get(a, 26)
  17. a1 = x % 26
  18. l= len(s)
  19. for i in range(l):
  20. cipher = a1 * (ord(s[i])- 65 - b) % 26
  21. res=chr(cipher + 65)
  22. print(res, end='')

这篇关于仿射密码解密(Affine Cipher)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/576454

相关文章

MySQL9.0默认路径安装下重置root密码

《MySQL9.0默认路径安装下重置root密码》本文主要介绍了MySQL9.0默认路径安装下重置root密码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们... 目录问题描述环境描述解决方法正常模式下修改密码报错原因问题描述mysqlChina编程采用默认安装路径,

MySQL修改密码的四种实现方式

《MySQL修改密码的四种实现方式》文章主要介绍了如何使用命令行工具修改MySQL密码,包括使用`setpassword`命令和`mysqladmin`命令,此外,还详细描述了忘记密码时的处理方法,包... 目录mysql修改密码四种方式一、set password命令二、使用mysqladmin三、修改u

电脑密码怎么设置? 一文读懂电脑密码的详细指南

《电脑密码怎么设置?一文读懂电脑密码的详细指南》为了保护个人隐私和数据安全,设置电脑密码显得尤为重要,那么,如何在电脑上设置密码呢?详细请看下文介绍... 设置电脑密码是保护个人隐私、数据安全以及系统安全的重要措施,下面以Windows 11系统为例,跟大家分享一下设置电脑密码的具体办php法。Windo

数据库oracle用户密码过期查询及解决方案

《数据库oracle用户密码过期查询及解决方案》:本文主要介绍如何处理ORACLE数据库用户密码过期和修改密码期限的问题,包括创建用户、赋予权限、修改密码、解锁用户和设置密码期限,文中通过代码介绍... 目录前言一、创建用户、赋予权限、修改密码、解锁用户和设置期限二、查询用户密码期限和过期后的修改1.查询用

Java中的密码加密方式

《Java中的密码加密方式》文章介绍了Java中使用MD5算法对密码进行加密的方法,以及如何通过加盐和多重加密来提高密码的安全性,MD5是一种不可逆的哈希算法,适合用于存储密码,因为其输出的摘要长度固... 目录Java的密码加密方式密码加密一般的应用方式是总结Java的密码加密方式密码加密【这里采用的

mysql重置root密码的完整步骤(适用于5.7和8.0)

《mysql重置root密码的完整步骤(适用于5.7和8.0)》:本文主要介绍mysql重置root密码的完整步骤,文中描述了如何停止MySQL服务、以管理员身份打开命令行、替换配置文件路径、修改... 目录第一步:先停止mysql服务,一定要停止!方式一:通过命令行关闭mysql服务方式二:通过服务项关闭

【测试】输入正确用户名和密码,点击登录没有响应的可能性原因

目录 一、前端问题 1. 界面交互问题 2. 输入数据校验问题 二、网络问题 1. 网络连接中断 2. 代理设置问题 三、后端问题 1. 服务器故障 2. 数据库问题 3. 权限问题: 四、其他问题 1. 缓存问题 2. 第三方服务问题 3. 配置问题 一、前端问题 1. 界面交互问题 登录按钮的点击事件未正确绑定,导致点击后无法触发登录操作。 页面可能存在

Java 后端接口入参 - 联合前端VUE 使用AES完成入参出参加密解密

加密效果: 解密后的数据就是正常数据: 后端:使用的是spring-cloud框架,在gateway模块进行操作 <dependency><groupId>com.google.guava</groupId><artifactId>guava</artifactId><version>30.0-jre</version></dependency> 编写一个AES加密

【C#生态园】解密C# Web框架:选对框架,事半功倍

探秘C# Web开发利器:六款高性能框架与库详细解读 前言 在当今的软件开发领域,C#作为一种多用途编程语言,被广泛应用于各种类型的应用程序开发。特别是在Web开发领域,有许多优秀的C# Web框架和库,本文将对其中一些备受关注的框架进行介绍和比较,帮助读者更好地选择适合其项目需求的工具。 欢迎订阅专栏:C#生态园 文章目录 探秘C# Web开发利器:六款高性能框架与库详细解