RSA攻击之Rabin密码体制

Rabin密码体制

最近在做Jarvis OJ 上的hard RSA,谈到Rabin密码,就顺便研究了一番。

目录

  1. Rabin简介

  2. 二次剩余定理

  3. 欧拉准则

  4. Rabin的加密与解密

1.简介

在这里插入图片描述
Michael.O.Rabin是Rabin密码体制的创始人。

1931年出生于以色列,父亲是犹太人,自幼喜欢数学,二战时被迫从军,后来返回大学继续修学。毕业后因出色的成绩在各个大学当助教,后来在希伯来大学(犹太民族的第一所大学)当教授。

1959年和Dana Scott联合发表了一篇论文“有限自动机及其决策问题”,因为这篇论文他在1976年被授予图灵奖。后来他开始研究NP问题。

1975年与Gary Miller 一起发明了著名的Miller-Rabin素性测试算法。

1979年发明了Rabin密码体制,这是当时第一个其安全性被证明等价于整数分解的困难性的非对称密码。

1987年Rabin和Richard Karp发明了Rabin-Karp字串查找算法。Rabin后来的研究都集中于计算机安全方面,可以说他为计算机安全做出了极大的贡献。


2.二次剩余定理

简要定义:p是素数,a不是p的倍数且与一个平方数模p同余,则称a是模p的二次剩余,记作a∈QR。

例:22 ≡ 4 mod 13 ,a=4,p=13,称a是模13的二次剩余。不只有22,还有32,42

同理,我们把不等于0也不是模p的二次剩余的数称为非二次剩余。记作a∈NR.

雅可比符号/勒让德符号:前提是p为奇素数

( a p ) = { 1 , a Q R 1 , a N R \left( \dfrac {a}{p}\right) =\begin{cases}1,a\in QR\\ -1,a\in NR\end{cases}
小拓展:有个计算公式 ( a p ) ( b p ) = ( a b p ) \left( \dfrac {a}{p}\right) \cdot \left( \dfrac {b}{p}\right) =\left( \dfrac {ab}{p}\right)


3.欧拉准则

直接给出公式:设p为奇素数
a p 1 2 ( a p ) m o d p a^{\dfrac {p-1}{2}}\equiv \left( \dfrac {a}{p}\right) modp
(上面是a的(p-1)/2次方)
证明该论断的方法和证明该准则的方法较像(都是通过费马小定理),因此下面只给出证明该准则的方法:

第一步:当a∈QR

存在b使得 b2≡a mod p
根据费马小定理可知:bp-1≡1 mod p
可得:
a p 1 2 ( b 2 ) p 1 2 b p 1 1 m o d p a^{\dfrac {p-1}{2}}\equiv \left( b^{2}\right) ^{\dfrac {p-1}{2}}\equiv b^{p-1}\equiv 1 modp
第二步:当a∈NR
同样使用费马小定理,知:ap-1≡1 mod p
分解后可得:ap-1-1=kp
即:
在这里插入图片描述
因为a∈NR,因此p一定不会整除于a(p-1)/2-1,所以

化简得:

Q.E.D.


4.Rabin的加密与解密

与RSA类似但这个函数不是单射,一个密文能解出4个明文。

取两个大素数p与q,使得p≡q≡3(mod 4)(保证为奇素数)
加密:c=m2(mod n)
解密:步骤相当复杂,以下为推理过程:
(偷懒可直接看最后的代码)
m2≡c mod n
相当于求解m2≡c mod p,m2≡c mod p
对于m2≡c mod p来说,c是模p 的二次剩余,


代入得:

开方得:
(1)
(2)
此时m1,m2异号

对于m2≡c mod p同理可得:
(3)
(4)
然后用四次中国剩余定理:
(1)与(3)
(1)与(4)
(2)与(3)
(2)与(4)
分别得到m1,m2,m3,m4
明文为四个里的其中一个。

下面是Jarvis OJ里hard RSA的python解密代码:

import gmpy2
n =0xc2636ae5c3d8e43ffb97ab09028f1aac6c0bf6cd3d70ebca281bffe97fbe30dd
p=319576316814478949870590164193048041239
q=275127860351348928173285174381581152299
d =0x1806799bd44ce649122b78b43060c786f8b77fb1593e0842da063ba0d8728bf1
e =2
c = int(open('flag.enc','rb').read().encode('hex'),16)

c1=pow(c,(p+1)/4,p)
c2=pow(c,(q+1)/4,q)
cp1=p-c1
cp2=q-c2
t1=gmpy2.invert(p,q)#p的模q逆元
t2=gmpy2.invert(q,p)#q的模p逆元

m1=(q*c1*t2+p*c2*t1)%n
m2=(q*c1*t2+p*cp2*t1)%n # or m2=n-m1
m3=(q*cp1*t2+p*c2*t1)%n
m4=(q*cp1*t2+p*cp2*t1)%n # or m4=n-m3

for i in(m1,m2,m3,m4):
    m = '%x' % i
    if len(m)%2==1:
        m='0'+m #padding
    print(m.decode('hex'))   
发布了8 篇原创文章 · 获赞 13 · 访问量 2620

猜你喜欢

转载自blog.csdn.net/jcbx_/article/details/101066670