仿射密码 -- 逆元

本文介绍了仿射密码的加密和解密原理,重点讲解了乘法逆元在解密过程中的关键作用。通过数学算法步骤展示了如何找到一个数关于模的乘法逆元,并通过示例解释了如何使用该算法求解逆元。最后,讨论了互质条件对存在乘法逆元的影响,以及在密码学中如何利用这些概念进行加密和解密。

仿射密码是一种替换密码。它是一个字母对一个字母的。它的加密函数是:

E(x) = ax + b\: (mod \, \, \, \, m)

其中a和m互质,m是字母的数目。解密函数是:

D(x) = a^{-1}(x-b)\:\: \: \: (mod \: \: \: \: m)

其中加密函数中的E(x),即y 对应解密函数中的x

同理,加密函数中的x 对应解密函数中的D(x)  

 a^{-1 } 是 a 关于模m的乘法逆元

 故有:(a^{-1} * a) \: \: \: mod\, \, \, \, m = 1

乘法逆元,数学算法步骤:

若存在 a*b \: \: \: mod \, \, \, n =1

则称 b 是a 的 模 n 的乘法逆元,同理,a 是 b 的 模 n 的乘法逆元

若在已知:a,n的情况下,求 a 的逆元

则 设x_{1} ,x_{2},x_{3 }y_{1} ,y_{2},y_{3}

令   x_{1} ,x_{2},x_{3 } = 1,0,n

       y_{1} ,y_{2},y_{3}=0,1,a  

        引入 Q = max_int (x_{3}/y_{3})

        引入 t_{1} = x_{1} - Q*y_{1}

                t_{2} = x_{2} - Q*y_{2}

                t_{3} = x_{3} - Q*y_{3}

        使   x_{1} ,x_{2},x_{3 } =y_{1} ,y_{2},y_{3 }

              y_{1} ,y_{2},y_{3 } =t_{1} ,t_{2},t_{3 }

查看 y_{3 } 取值,若 y_{3 }=1,则此时 y_{2} 即为所求逆元;若 y_{2} 数值为负数,则将 y_{2} + n 后的数值即为所求逆元

例:求 67 mod 119 的逆元 ?

则 设 x_{1} ,x_{2},x_{3 }\: \: \: y_{1} ,y_{2},y_{3}

令     x_{1} ,x_{2},x_{3 } = 1,0,n = 1,0,119

        y_{1} ,y_{2},y_{3}=0,1,a=0,1,67

        引入 Q = max_int(x_{3}/y_{3}) = 119/67=1

        引入 t_{1} = x_{1} - Q*y_{1} = 1-1*0=1

                t_{2} = x_{2} - Q*y_{2}=0-1*1=-1

                t_{3} = x_{3} - Q*y_{3}=119-1*67=52

        使    x_{1} ,x_{2},x_{3 } =y_{1} ,y_{2},y_{3 }=0,1,67

                y_{1} ,y_{2},y_{3 } =t_{1} ,t_{2},t_{3 }=1,-1,52

此时 y_{3 }=52,故需要继续循环算下去

                x_{1} ,x_{2},x_{3 } =0,1,67

                y_{1} ,y_{2},y_{3 } =1,-1,52

               Q = max_int(x_{3}/y_{3}) = 67/52=1

                t_{1} = x_{1} - Q*y_{1} = 0-1*1=-1

                t_{2} = x_{2} - Q*y_{2}=1-1*\left ( - \right )1=2

                t_{3} = x_{3} - Q*y_{3}=67-1*52=15

                此时 x_{1} ,x_{2},x_{3 } =y_{1} ,y_{2},y_{3 }=1,-1,52

                         y_{1} ,y_{2},y_{3 } =t_{1} ,t_{2},t_{3 }=-1,2,15

        此时 y_{3 }=15,故需要继续循环算下去

                         x_{1} ,x_{2},x_{3 } =1,-1,52

                        y_{1} ,y_{2},y_{3 } =-1,2,15

                       Q = max _int(x_{3}/y_{3}) = 52/15=3

                        t_{1} = x_{1} - Q*y_{1} = 1-3*(-1)=4

                        t_{2} = x_{2} - Q*y_{2}=-1-3*2=-7

                        t_{3} = x_{3} - Q*y_{3}=52-3*15=7

                        此时 x_{1} ,x_{2},x_{3 } =y_{1} ,y_{2},y_{3 }=-1,2,15

                                y_{1} ,y_{2},y_{3 } =t_{1} ,t_{2},t_{3 }=4,-7,7

                额 此时 y_{3 }=7,继续循环。。。

                                x_{1} ,x_{2},x_{3 } =-1,2,15

                                y_{1} ,y_{2},y_{3 } =4,-7,7

                                Q = max_int(x_{3}/y_{3}) = 15/7=2

                                t_{1} = x_{1} - Q*y_{1} = -1-2*(4)=-9

                                t_{2} = x_{2} - Q*y_{2}=2-2*(-7)=16

                                t_{3} = x_{3} - Q*y_{3}=15-2*7=1

                                此时 x_{1} ,x_{2},x_{3 } =y_{1} ,y_{2},y_{3 }=4,-7,7

                                        y_{1} ,y_{2},y_{3 } =t_{1} ,t_{2},t_{3 }=-9,16,1

                        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^{-1 }

# (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))

已知a^{-1},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))

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值