Rabin加密

说实话,其中很多思路也没搞懂,先附个自己写的部分推论,很神奇的论证,但自己yp,yq的论证是很完美的

Rabin加密是一种基于模平方和模平方根的非对称加密算法。

举个例子:a=x^2 mod m    称a为x模m时的平方,x为a模m时的平方根。

加密过程

设私钥p q为两个素数,且p,q满足:p≡q≡3mod4 公钥n=p*q,对于明文m和密文c,定义一下加密过程:c=m^2 mod n

解密过程

一般先通过其他方法分解得到 p,q
,然后解密。带入解密函数会返回四个数,这其中只有一个是我们想要的明文,需要通过其他方式验证(一般需要根据验证码来对应)。
附推论,(markdown)

点击查看代码
Rabin加密过程

$$
\\ m_p \equiv c^{\frac{p+1}{4}}\mod(p)
\\ m_q \equiv c^{\frac{q+1}{4}}\mod(q)
\\\
\\由贝祖定理
\\存在y_p,y_q使得
\\y_p*p+y_q*q = (p,q)
\\p,q为素数
\\则 y_p*p+y_q*q = 1
\\yp*p \equiv 1 \mod(q)
\\yq*q \equiv 1 \mod(p)
\\yp = invert(p, q)
\\yq = invert(q, p)
\\\
\\四个明文解分别为
\\	a = (yp * p * mq + yq * q * mp) \mod(n)
\\	b = n - a
\\	c = (yp * p * mq - yq * q * mp) \mod(n)
\\	d = n - c
$$
脚本也是lz佬的
点击查看代码
import gmpy2

def rabin_decrypt(c, p, q, e=2):
	n = p * q
	mp = pow(c, (p + 1) // 4, p)
	mq = pow(c, (q + 1) // 4, q)
	yp = gmpy2.invert(p, q)
	yq = gmpy2.invert(q, p)
	r = (yp * p * mq + yq * q * mp) % n
	rr = n - r
	s = (yp * p * mq - yq * q * mp) % n
	ss = n - s
	return (r, rr, s, ss)
 
c = 
p = 
q = 
m = rabin_decrypt(c,p,q)
for i in range(4):
	try:
		print(bytes.fromhex(hex(m[i])[2:]))
	except:
		pass

buu上有道题叫雷宾是坏蛋,可以去做一做,注意结尾需要把四个明文的二进制码输出,找校验位
posted @ 2024-04-17 22:39  附体欢欢  阅读(205)  评论(0编辑  收藏  举报