BUU-Crypto-RSA1

RSA1

题目描述:注意:得到的 flag 请包上 flag{} 提交
解题步骤:已知题目中给了p,q,dp,dq,c

p = 8637633767257008567099653486541091171320491509433615447539162437911244175885667806398411790524083553445158113502227745206205327690939504032994699902053229 
q = 12640674973996472769176047937170883420927050821480010581593137135372473880595613737337630629752577346147039284030082593490776630572584959954205336880228469 
dp = 6500795702216834621109042351193261530650043841056252930930949663358625016881832840728066026150264693076109354874099841380454881716097778307268116910582929 
dq = 783472263673553449019532580386470672380574033551303889137911760438881683674556098098256795673512201963002175438762767516968043599582527539160811120550041 
c = 24722305403887382073567316467649080662631552905960229399079107995602154418176056335800638887527614164073530437657085079676157350205351945222989351316076486573599576041978339872265925062764318536089007310270278526159678937431903862892400747915525118983959970607934142974736675784325993445942031372107342103852

一个比较经典的类型,已知p,q,dp,dq,c,求m
所需要求的值:
(1)计算q逆模q1;
(2)计算m1为c的dp次方再对p求模
(3)计算m2为c的dq次方再对q求模
(4)m = ((((m2 - m1) * p1) % q) * p + m2) % n;
exp:

import gmpy2
import libnum

p = 8637633767257008567099653486541091171320491509433615447539162437911244175885667806398411790524083553445158113502227745206205327690939504032994699902053229
q = 12640674973996472769176047937170883420927050821480010581593137135372473880595613737337630629752577346147039284030082593490776630572584959954205336880228469
dp = 6500795702216834621109042351193261530650043841056252930930949663358625016881832840728066026150264693076109354874099841380454881716097778307268116910582929
dq = 783472263673553449019532580386470672380574033551303889137911760438881683674556098098256795673512201963002175438762767516968043599582527539160811120550041
c = 24722305403887382073567316467649080662631552905960229399079107995602154418176056335800638887527614164073530437657085079676157350205351945222989351316076486573599576041978339872265925062764318536089007310270278526159678937431903862892400747915525118983959970607934142974736675784325993445942031372107342103852
n = p * q
m1 = pow(c, dp, p)
m2 = pow(c, dq, q)
p1 = gmpy2.invert(q, p)
m = ((((m2 - m1) * p1) % q) * p + m2) % n
print libnum.n2s(m)

运行结果为:noxCTF{W31c0m3_70_Ch1n470wn}
在这里插入图片描述
flag{W31c0m3_70_Ch1n470wn}

### BUU CTF Generate Prime 解题思路 在处理涉及素数生成的CTF挑战时,理解如何高效地生成大素数至关重要。通常情况下,在加密应用尤其是RSA中使用的素数长度非常长(比如1024位以上),这使得暴力破解变得不切实际。 对于`Generate Prime`类型的题目,常见的解题方法包括: #### 使用已知库函数 许多编程语言提供了内置的方法来快速检测和生成强伪随机素数。Python中的`pycryptodome`库就是一个很好的例子[^3]: ```python from Crypto.Util.number import getPrime bit_length = 512 # 定义所需素数的比特长度 prime_number = getPrime(bit_length) print(f"Generated prime number with {bit_length} bits is:\n{hex(prime_number)}") ``` 这种方法利用了成熟的算法实现,能够有效避免一些低级错误并提高效率。 #### 自定义素性测试 如果比赛环境不允许使用第三方库,则可以考虑编写自己的Miller-Rabin素性测试程序来进行验证。此过程可能较为复杂但也同样可行: ```python import random def miller_rabin(n, k=40): if n == 2 or n == 3: return True if n <= 1 or n % 2 == 0: return False r, s = 0, n - 1 while s % 2 == 0: r += 1 s //= 2 for _ in range(k): a = random.randrange(2, n - 1) x = pow(a, s, n) if x == 1 or x == n - 1: continue for _ in range(r - 1): x = pow(x, 2, n) if x == n - 1: break else: return False return True def generate_prime_candidate(length_bits): p = random.getrandbits(length_bits) p |= (1 << length_bits - 1) | 1 # 设置最高位和最低位为1以确保奇数且接近目标大小 return p def find_large_prime(bitsize): candidate = generate_prime_candidate(bitsize) while not miller_rabin(candidate): candidate = generate_prime_candidate(bitsize) return candidate if __name__ == "__main__": bit_size = int(input("Enter the desired size of primes in bits: ")) large_prime = find_large_prime(bit_size) print(f"A probable prime found after testing several candidates is\n{large_prime}") ``` 这段代码实现了基本的大整数素性检验逻辑,并通过不断尝试直到找到合适的候选者为止。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

七堇墨年

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值