乘法逆元定义:群G中任意一个元素a,都在G中有唯一的逆元a',具有性质aa'=a'a=e,其中e为群的单位元。
举例:
例如: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$
One comment
厉害~
都这么厉害!
可否留个QQ~