Rabin加密算法学习记录

首先给出题目坏蛋是雷宾,来自BUUCTF:

这道题之前写过,雷宾加密算法,但忘记的差不多了,当时也没怎么学,今天深入学习并记录一下。

加密过程

Rabin加密是非对称加密,和RSA相似,感觉是RSA里的一个特例。在Rabin加密中e = 2,根据RSA加密过程,可以知道加密公式为:c = m^{2} mod n。

解密过程

就不推导了,剽取大佬的成果,学习学习

m_{p} = c^{1/4\left ( p+1 \right )} mod p

m_{q} = c^{1/4\left ( q+1 \right )} mod q

y_{p} * p + y_{q} * q = 1

以及4个明文公式:

m1 = (y_{p} * p * m_{q} + y_{q} * q * m_{p}) mod n

m2 = n - r

m3 =  (y_{p} * p * m_{q} - y_{q} * q * m_{p}) mod n

m4 = n - s

通过扩展欧几里得算法解y_{p} * p + y_{q} * q = 1,得到y_{p}y_{q},其它的都能直接解了。

对于此题给了Pk = 523798549,即公钥n = 523798549,密文c = 162853095,以及二进制校验码110001,应该是用于在最后4个明文中筛选用的。

解题过程

首先分解n得到p、q,然后依次计算m_{p} 、m_{q} 、y_{p}y_{q} 、m1、m2、m3、m4,打印4个明文的二进制形式,查看后6位,与二进制校验码对应,选择正确的,去掉后6位,得到正确的明文m,最后md5加密就得到了最终的flag,整体代码如下:

from gmpy2 import *
from Crypto.Util.number import *
import hashlib

n = 523798549
c = 162853095
jy = 110001
p = 10663
q = 49123

mp = pow(c,(p+1)//4,p)
mq = pow(c,(q+1)//4,q)

yp = gcdext(p,q)[1]
yq = gcdext(p,q)[2]
m1 = (yp*p*mq + yq*q*mp) % n
m2 = n - m1
m3 = (yp*p*mq - yq*q*mp) % n
m4 = n - m3

print(bin(m1),bin(m2),bin(m3),bin(m4))
m = int('0b10010011100100100101010',2)
#m = 4835626
print(hashlib.md5(str(m).encode()).hexdigest())
Rabin加密算法是一种非对称加密算法,它是基于大数分解难题的加密算法,其加密过程与RSA算法类似,但解密过程却与RSA不同,需要通过求解模数的因子来实现解密。以下是Rabin加密算法的实现步骤: 1. 选择两个大质数p和q,并计算模数N=p*q。 2. 将明文转化为数字M,使得M小于模数N。 3. 将M的平方对模数N取余,得到C=M^2 mod N,即为密文。 4. 使用数学方法求解模数N的两个因子p和q,然后就可以得到明文M。 解密过程相对于RSA算法更加困难,因为需要通过大数分解来求解模数的两个因子p和q。这也是Rabin加密算法的缺点之一。 以下是一个简单的Python实现Rabin加密算法的代码: ``` import random # 生成大质数 def generate_prime(): while True: p = random.randint(100000, 999999) if is_prime(p): return p # 判断是否为质数 def is_prime(n): if n <= 1: return False for i in range(2, int(n ** 0.5) + 1): if n % i == 0: return False return True # 计算最大公约数 def gcd(a, b): while b != 0: a, b = b, a % b return a # 求解模数的两个因子 def factorize(N): x = int(N ** 0.5) y = x r = 1 while r != 0: x = (x + y) % N y = (y ** 2 + r) % N r = (r + 1) % N d = gcd(abs(x - y), N) if d != 1 and d != N: return d, N // d # 加密函数 def encrypt(M): p = generate_prime() q = generate_prime() N = p * q C = (M ** 2) % N return C, N # 解密函数 def decrypt(C, N): p, q = factorize(N) mp = pow(C, (p + 1) // 4, p) mq = pow(C, (q + 1) // 4, q) yq, xp = gcd(p, q) x1 = (yq * p * mq + xp * q * mp) % N x2 = N - x1 return x1, x2 # 测试 M = 1234567890 C, N = encrypt(M) print("加密后的密文:", C) M1, M2 = decrypt(C, N) print("解密后的明文:", M1) ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值