举例:

例如:4关于1模7的乘法逆元为多少?
4X≡1 mod 7
这个方程等价于求一个X和K,满足
4X=7K+1
其中X和K都是整数。
若ax≡1 mod f, 则称a关于1模f的乘法逆元为x。也可表示为ax≡1(mod f)。
当a与f互素时,a关于模f的乘法逆元有解。如果不互素,则无解。如果f为素数,则从1到f-1的任意数都与f互素,即在1到f-1之间都恰好有一个关于模f的乘法逆元。

例如,求5关于模14的乘法逆元:
14=5x2+4
5=4x1+1
说明5与14互素,存在5关于14的乘法逆元。
1=5-4=5-(14-5x2)=5x3-14
因此,5关于模14的乘法逆元为3。

其求法可用欧几里德算法

Extended Euclid (d,f) //算法求d关于模f的乘法逆元d-1 ,即 d* d-1 mod f = 1
1 。(X1,X2,X3) := (1,0,f); (Y1,Y2,Y3) := (0,1,d)
2。 if (Y3=0) then return d-1 = null //无逆元
3。 if (Y3=1) then return d-1 = Y2 //Y2为逆元
4。 Q := X3 div Y3 //整除
5。 (T1,T2,T3) := (X1 - QY1,X2 - QY2,X3 - Q*Y3)
6 。(X1,X2,X3) := (Y1,Y2,Y3)
7。 (Y1,Y2,Y3) := (T1,T2,T3)
8。 goto 2

常用于加密算法中,如仿射算法。求此算法还可以使用费马小定理,只不过局限性比较大,要求模数是素数,a^(p-1)≡1(mod p),p要求是素数,那么a^(p-2)就是a的乘法逆元。

def EX_GCD(a, b, arr):  # 扩展欧几里得
    if b == 0:
        arr[0] = 1
        arr[1] = 0
        return a
    g = EX_GCD(b, a % b, arr)
    t = arr[0]
    arr[0] = arr[1]
    arr[1] = t - int(a / b) * arr[1]
    return g


def ModReverse(a, n):  # ax=1(mod n) 求a模n的乘法逆x
    arr = [0, 1, ]
    gcd = EX_GCD(a, n, arr)
    if gcd == 1:
        return (arr[0] % n + n) % n
    else:
        return -1


a = 7**79
b = 263
arr = [0, 1, ]
print(a, '模', b, '的乘法逆:', ModReverse(a, b))
print(a, '和', b, '的最大公约数:', EX_GCD(a, b, arr))
print(arr[1], '×', b, '+', arr[0], '×', a, '= 1')

ElGamal算法,是一种较为常见的加密算法,它是基于1985年提出的公钥密码体制和椭圆曲线加密体系。既能用于数据加密也能用于数字签名,其安全性依赖于计算有限域上离散对数这一难题。

加密算法:
公开全局量
q ----- 素数
a ----- a<q,且a是q的素根
Alice生成的密钥
选择私钥$X_A$ -----$X_A<q-1$
计算$Y_A$ ----- $Y_A=a^{X_A} mod q$
公开密钥 ----- $PU=\{q,a,Y_A\}$
私钥 ----- $X_A$
Bob用Alice的公钥加密
明文 ----- $M<q$
随机选择整数$k$ ----- $k<q$
计算$K$ ----- $K=(Y_A)^k mod q$
计算$C_1$ ----- $C_1=a^k mod q$
计算$C_2$ ----- $C_2=KM mod q$
密文 ----- $(C_1,C_2)$
用Alice的私钥解密
密文 ----- $(C_1,C_2)$
计算$K$ ----- $K=(C_1)^{X_A} mod q$
明文 ----- $M=(C_2*K^{—1}) mod q$
Last modification:January 7, 2021
喜欢就加个鸡腿吧!