Rabin算法是一种基于模平方和模平方根的非对称加密算法,该算法由Michael O. Rabin于1979年1月发布。Rabin密码体制是对RSA的一种修正,它有以下两个特点:
- 它不是以一一对应的单向陷门函数为基础,对同一密文,可能有两个以上对应的明文;
- 破译该体制等价于对大整数的分解。
RSA中选取的公钥 e 满足 1 < e < φ ( n ) 1<e<\varphi(n) 1<e<φ(n),且 g c d ( e , φ ( n ) ) = 1 gcd(e, \varphi(n)) =1 gcd(e,φ(n))=1。Rabin密码体制则取e=2。
补充: a = x 2 ⟺ x = a 2 a=x^{2} \Longleftrightarrow x=\sqrt[2]{a} a=x2⟺x=2a 称 a 为 x 的算术平方,称 x 为 a 的算术平方根。 a ≡ x 2 m o d m ⟺ x ≡ a 2 m o d m a \equiv x^{2} \bmod m {\Longleftrightarrow} x \equiv \sqrt[2]{a} \bmod m a≡x2modm⟺x≡2amodm 称 a 为 x 模 m 时的平方,称 x 为 a 模 m 时的平方根。
0x01 安全保证
Rabin算法安全性基于求合数的模平方根的难度,该问题等价于因子分子的难度。
0x02 生成密钥
Rabin密码系统的密钥生成如下:
- 选取两个大的不同素数 p p p 与 q q q,两个都同余3模4
- 计算 n = p ∗ q n = p*q n=p∗q
( p , q ) (p,q) (p,q)作为私钥, n = p ∗ q n = p*q n=p∗q 作为公钥。
0x03 加密过程
对于明文 m ( m < n ) m(m<n) m(m<n)和密文 c c c,定义以下加密过程(公钥加密过程): c ≡ m 2 m o d n c\equiv m^2\bmod n c≡m2modn
0x04 解密过程
明文 m m m可以通过取 c c c模 n 时的平方根获得:
- 根据费马小定理计算
m
m
m在模
p
p
p和
q
q
q时的平方根
m
p
m_p
mp和
m
q
m_q
mq:
- m p = c 1 4 ( p + 1 ) m o d p m_{p}=c^{\frac{1}{4}(p+1)} \bmod p mp=c41(p+1)modp
- m q = c 1 4 ( q + 1 ) m o d q m_{q}=c^{\frac{1}{4}(q+1)} \bmod q mq=c41(q+1)modq
- 使用扩展的欧几里得算法来查找
y
p
y_p
yp和
y
q
y_q
yq:
- y p ∗ p + y q ∗ q = 1 y_p * p + y_q * q = 1 yp∗p+yq∗q=1
- 根据孙子定理求得4个模 n 时的平方根:
- r 1 = ( y p ⋅ p ⋅ m q + y q ⋅ q ⋅ m p ) m o d n r_{1}=\left(y_{p} \cdot p \cdot m_{q}+y_{q} \cdot q \cdot m_{p}\right) \bmod n r1=(yp⋅p⋅mq+yq⋅q⋅mp)modn
- r 2 = n − r 1 r_{2}=n-r_{1} r2=n−r1
- r 3 = ( y p ⋅ p ⋅ m q − y q ⋅ q ⋅ m p ) m o d n r_{3}=\left(y_{p} \cdot p \cdot m_{q}-y_{q} \cdot q \cdot m_{p}\right) \bmod n r3=(yp⋅p⋅mq−yq⋅q⋅mp)modn
- r 4 = n − r 3 r_{4}=n-r_{3} r4=n−r3
这四个值之一是原始明文 m m m,但是如果没有其他信息,就无法确定这四个是正确的。