加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

求乘法逆元(模逆运算)

(2017-04-26 13:42:36)
分类: 笔记
对于0~25这二十六个数字,如果整数a与26互质,那么存在结论
26个数字乘以a并对26取模(乘以a除以26取余数)可以对应的(0~25)中26个不同数字,前后形成唯一映射
这是乘法加密算法
如果知道取模后的值怎么对应到数乘取模之前的值,就是怎么解密
答案是求乘法逆元(模逆运算)
python程序:
#to find mod inverse of a and b
import gcd
def findmodinverse(a,b):
if gcd.gcd(a,b)!=1:
return None
u1,u2,u3=1,0,a
v1,v2,v3=0,1,b
while v3!=0:
q=u3//v3
v1,v2,v3,u1,u2,u3=(u1-q*v1),(u2-q*v2),(u3-q*v3),v1,v2,v3
return u1%b
其中gcd表示求最大公因数,就是if语句就是在判断是否互质,如果a和b不满足互质算法就没有意义
其中a表示相乘的因子,b表示取余的因子
算法并不好理解,但是可以求出模逆的值。
这个值乘以加密后的数再对b取模,可以得到加密前的数



print(i*7%26*findmodinverse(7,26)%26)
上面的语句叫i等于任意0到25之间整数,返回值一定是i本身
我猜想这一点也可以解释为什么有些程序语言以0为开头而不是以1开头

0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有