Rabin加密算法

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=x2x=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 ax2modmx2a modm 称 a 为 x 模 m 时的平方,称 x 为 a 模 m 时的平方根。

0x01 安全保证

Rabin算法安全性基于求合数的模平方根的难度,该问题等价于因子分子的难度。

0x02 生成密钥

Rabin密码系统的密钥生成如下:

  1. 选取两个大的不同素数 p p p q q q,两个都同余3模4
  2. 计算 n = p ∗ q n = p*q n=pq

( p , q ) (p,q) (p,q)作为私钥, n = p ∗ q n = p*q n=pq 作为公钥。

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 cm2modn

0x04 解密过程

明文 m m m可以通过取 c c c模 n 时的平方根获得:

  1. 根据费马小定理计算 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
  2. 使用扩展的欧几里得算法来查找 y p y_p yp y q y_q yq:
    • y p ∗ p + y q ∗ q = 1 y_p * p + y_q * q = 1 ypp+yqq=1
  3. 根据孙子定理求得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=(yppmq+yqqmp)modn
    • r 2 = n − r 1 r_{2}=n-r_{1} r2=nr1
    • 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=(yppmqyqqmp)modn
    • r 4 = n − r 3 r_{4}=n-r_{3} r4=nr3

这四个值之一是原始明文 m m m,但是如果没有其他信息,就无法确定这四个是正确的。

0x05 参考

  • 6
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
Rabin算法是一种非对称加密算法,其加解密过程与RSA算法类似。下面是Python实现Rabin算法的加解密过程: 1. 生成公私钥对 ```python import random from math import gcd def generate_key_pair(): # 生成两个随机质数p和q p = generate_prime_number() q = generate_prime_number() # 计算n和phi(n) n = p * q phi_n = (p - 1) * (q - 1) # 选择一个随机数e,要求e与phi(n)互质 e = random.randint(2, phi_n - 1) while gcd(e, phi_n) != 1: e = random.randint(2, phi_n - 1) # 计算d,使得d为e模phi(n)的逆元 d = mod_inverse(e, phi_n) # 返回公私钥对 return ((n, e), (n, d)) def generate_prime_number(): # 生成一个随机数,检查是否为质数 while True: p = random.randint(2**15, 2**16) if is_prime(p): return p def is_prime(n): # 判断一个数是否为质数 if n <= 1: return False elif n <= 3: return True elif n % 2 == 0 or n % 3 == 0: return False i = 5 while i * i <= n: if n % i == 0 or n % (i + 2) == 0: return False i += 6 return True def mod_inverse(a, m): # 计算a模m的逆元 for x in range(1, m): if (a * x) % m == 1: return x return -1 ``` 2. 加密数据 ```python def encrypt(plaintext, public_key): # 将明文转换为整数 plaintext_int = int.from_bytes(plaintext.encode(), 'big') # 获取公钥n和e n, e = public_key # 加密数据 ciphertext_int = pow(plaintext_int, 2, n) # 返回密文 return ciphertext_int.to_bytes((ciphertext_int.bit_length() + 7) // 8, 'big') ``` 3. 解密数据 ```python def decrypt(ciphertext, private_key): # 获取私钥n和d n, d = private_key # 解密数据 plaintext_int = pow(ciphertext, (p + 1) // 4, p) # 对p取模 plaintext_int += pow(ciphertext, (q + 1) // 4, q) * n % p # 对q取模 plaintext_int %= n # 合并结果 # 将整数转换为明文 plaintext = plaintext_int.to_bytes((plaintext_int.bit_length() + 7) // 8, 'big').decode() # 返回明文 return plaintext ``` 注意:Rabin算法的安全性存在争议,不建议在生产环境中使用。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值