仿射密码解密(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= '')

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值