仿射密码是一种替换密码。它是一个字母对一个字母的。它的加密函数是:
其中a和m互质,m是字母的数目。解密函数是:
其中加密函数中的,即y 对应解密函数中的
同理,加密函数中的 对应解密函数中的
是 a 关于模m的乘法逆元
故有:
乘法逆元,数学算法步骤:
若存在
则称 b 是a 的 模 n 的乘法逆元,同理,a 是 b 的 模 n 的乘法逆元
若在已知:a,n的情况下,求 a 的逆元
则 设,
令
引入 Q = max_int ()
引入
使
查看 取值,若
,则此时
即为所求逆元;若
数值为负数,则将
后的数值即为所求逆元
例:求 67 mod 119 的逆元 ?
则 设
令
引入 _
引入
使
此时 ,故需要继续循环算下去
_
此时
此时 ,故需要继续循环算下去
Q = max _
此时
额 此时 ,继续循环。。。
_
此时
y3 = 1,y2 = 16;故此时y2 的值即为所求逆元解
67 mod 119 的逆元为 16
可逆推 16 mod 119 的逆元,求得:y3=1 时,y2 = -52,则逆元为 y2 + n = -52 + 119 = 67
即16 mod 119 的逆元为 67
(也可以借助函数,试错,得到)
# (a * An) % m = 1
# 求a关于模m的逆元An
def niyuan(a, m):
for An in range(m):
#print(An)
if a * An % m == 1:
print("%d 是a关于m的逆元" % (An))
return An
一般情况下,当a与m互素时,a关于模m的乘法逆元可解;如果不互质,则无解
且若m为质数,则从1到m-1的任意数都与m互质,即在1到m-1之间都恰好有一个关于模m的乘法逆元
则在已知a,b,m的情况下,可以利用加密函数来对明文加密,明文字母加密后的字母对应表:
# ascii 0-25 + 65 对应字母 m + 65
# a * i + b mod m +65
# 函数:已知a,b,m 对字母加密的对照表
def encrype(a, b,m):
for i in range(m):
print(chr(i + 65) + ": " + chr(((a * i + b) % m) + 65))
已知,b,m的情况下,可以利用解密函数来对密文解密,密文字母解密后与明文的对应表
# ascii 0-25 + 65 对应字母 m + 65
# An *( i - b) mod m + 65
# 函数:已知An,b,m 对字母解密的对照表
def decrype(An,b,m):
for i in range(m):
print(chr(i + 65) + ": " + chr((An*(i - b) % m) + 65))
本文介绍了仿射密码的加密和解密原理,重点讲解了乘法逆元在解密过程中的关键作用。通过数学算法步骤展示了如何找到一个数关于模的乘法逆元,并通过示例解释了如何使用该算法求解逆元。最后,讨论了互质条件对存在乘法逆元的影响,以及在密码学中如何利用这些概念进行加密和解密。
1158

被折叠的 条评论
为什么被折叠?



