技术 · 2024年7月23日

模逆元小记

# 模逆元

已知在有限元256中: ((a*17)+133)mod256 对于密文进行逆向解密 ((a-133)/17)mod256会导致数据丢失

因此引入模逆元


学习时碰到一个问题:b=(a×k)+c mod m 为什么可以通过a≡b′× X mod  m推导出a来。

这里的 a 是原始数据,k 是一个常数因子,c 是一个常数偏移,m 是模数(通常是一个素数形式,以保证逆元的存在),而 b 是加密后的结果。

脑子笨想了好久 然后发现还得是写公式推导。

已知 b k c m 求a

“`

由模逆元得到x

kx≡1 mod m

首先,从 b 中减去 c:b′=b−c

然后,将结果乘以 k 的模逆元 x:a≡ b′ * x mod m

这样,我们就可以得到原始的 a,因为:

a≡(b−c)*xmod m

a≡(a*k+c−c)*xmod m //此处注意 通过推导可知b≡(a*k+c)mod m

a≡(a*k)*xmod m //到这里就很明显啦 kx≡1 mod m带入

a≡a*(kx)mod m

由于 kx≡1mod m,我们有:

a≡a*1mod m

a≡amod m

从而有a=(b-c)*x mod m

而在c语言中char自动mod 256 顾在代码中所有mod 256都被省略掉了

“`

寻找模逆元exp

```

def extended_gcd(a, b):

"""使用扩展欧几里得算法计算最大公约数和贝祖等式系数。"""

if a == 0:

return b, 0, 1

else:

gcd, x1, y1 = extended_gcd(b % a, a)

x = y1 - (b // a) * x1

y = x1

return gcd, x, y

def mod_inverse(a, m):

"""计算a模m的模逆元。"""

gcd, x, _ = extended_gcd(a, m)

if gcd != 1:

raise ValueError("Modular inverse does not exist.")

else:

return x % m

# 寻找17模256的逆元

a = 17

m = 256

inverse = mod_inverse(a, m)

print(f"The modular inverse of {a} mod {m} is: {inverse}")
苏ICP备2024067700号 | 苏公网安备32098202000238号