buuctf-RSA1

buuctf-RSA1

最近被问到这道题,现在网上的答案可能有点问题,因为大多数看这道题的都是新人,在这里写一个新的wp。

题目:

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

在这里插入图片描述

网上答案基本都是同一种形式,核心代码为:m = (((m1-m2)*I)%p)*q+m2。其实推导是没问题的,但是真正起作用的只有m2,因为m1 = m2,所以后面的推到没有任何意义。

m1、m2或者说mp、mq就是m。

wp:

根据费马小定理:
在这里插入图片描述

RSA解密原理:
在这里插入图片描述

根据上面对于dp的定义:
在这里插入图片描述

所以我们可以得到结论:
在这里插入图片描述

from Crypto.Util.number import *

c = 24722305403887382073567316467649080662631552905960229399079107995602154418176056335800638887527614164073530437657085079676157350205351945222989351316076486573599576041978339872265925062764318536089007310270278526159678937431903862892400747915525118983959970607934142974736675784325993445942031372107342103852
p = 8637633767257008567099653486541091171320491509433615447539162437911244175885667806398411790524083553445158113502227745206205327690939504032994699902053229 
dp = 6500795702216834621109042351193261530650043841056252930930949663358625016881832840728066026150264693076109354874099841380454881716097778307268116910582929

m = pow(c, dp, p)
print(long_to_bytes(m))

c = 24722305403887382073567316467649080662631552905960229399079107995602154418176056335800638887527614164073530437657085079676157350205351945222989351316076486573599576041978339872265925062764318536089007310270278526159678937431903862892400747915525118983959970607934142974736675784325993445942031372107342103852
q = 12640674973996472769176047937170883420927050821480010581593137135372473880595613737337630629752577346147039284030082593490776630572584959954205336880228469
dq = 783472263673553449019532580386470672380574033551303889137911760438881683674556098098256795673512201963002175438762767516968043599582527539160811120550041 

m = pow(c, dq, q)
print(long_to_bytes(m))

以上是wp。

推广到一般情况:

如果m > p 或者 m > q的情况又如何呢?这里自己写了一道差不多的题目,m满足上述情况。

task.py:

from Crypto.Util.number import *
p = getPrime(512)
q = getPrime(512)
e = getPrime(256)
	
print(f"p = %d" %p)
print(f"q = %d" %q)
print(f"e = %d" %e)

flag = b'Hello_world_I_am_coming_soon_Please_Waiting_for_me_Thank_you_very_Much!'
d = inverse(e, (p - 1) * (q - 1))

dp = d % (p - 1)
dq = d % (q - 1)

print(f"dp = %d" %dp)
print(f"dq = %d" %dq)

m = bytes_to_long(flag)
n = p * q
c = pow(m, e, n)

print(f"c = %d" %c)

'''
p = 6926931481661163158206322888609703633942281936041380098286251687188506967049414186037659658699187264906821810864635760898979690990756966551278021578998291
q = 12998690832506339440015053745748265344656526216265161654959849049366323002124065092154594716191578843135977811678682838871858697526858995984329380419980913
e = 71128804286988599007039290915038713271044413888167730003577897256139934935941
dp = 6148889404402536590508011446935790843614514839697585326158290024496841220326631544116014497689044476534601498480223872263477602191884044930126752836047231
dq = 9493121201048858715333174956142964789148065600348765586344609365888884217574018356225202124154002902916927219527185254432280397558121173773344086749082285
c = 78375263660593211120584078796453000342814240208394759659717637470351553783389111880446991272503062126743438797053252454888827540106185629197886465642880244388047960613996334135707469056334135130788403395848687900303886160920202526479321695441298525541071076842525224671835263271188257203429419770213288719223
'''

根据上述理论:

在这里插入图片描述

这里就可以用中国剩余定理(CRT)来解答了。

简单来说,如果除数互相互素,我们知道除数的集合及其余数的集合,那我们可以利用中国剩余定理来求出被除数。这里我们知道余数的集合是{mp,mq},除数的集合是{p, q},被除数就是m。

exp:

from Crypto.Util.number import *
from gmpy2 import *
#中国剩余定理CRT
#aList是余数,mList是n的集合。
def CRT(aList, mList):
    M = 1
    for i in mList:
        M = M * i   #计算M = ∏ mi
    #print(M)
    x = 0
    for i in range(len(mList)):
        Mi = M // mList[i]   #计算Mi
        Mi_inverse = invert(Mi, mList[i]) #计算Mi的逆元
        x += aList[i] * Mi * Mi_inverse #构造x各项
    x = x % M
    return x

p = 6926931481661163158206322888609703633942281936041380098286251687188506967049414186037659658699187264906821810864635760898979690990756966551278021578998291
q = 12998690832506339440015053745748265344656526216265161654959849049366323002124065092154594716191578843135977811678682838871858697526858995984329380419980913
e = 71128804286988599007039290915038713271044413888167730003577897256139934935941
dp = 6148889404402536590508011446935790843614514839697585326158290024496841220326631544116014497689044476534601498480223872263477602191884044930126752836047231
dq = 9493121201048858715333174956142964789148065600348765586344609365888884217574018356225202124154002902916927219527185254432280397558121173773344086749082285
c = 78375263660593211120584078796453000342814240208394759659717637470351553783389111880446991272503062126743438797053252454888827540106185629197886465642880244388047960613996334135707469056334135130788403395848687900303886160920202526479321695441298525541071076842525224671835263271188257203429419770213288719223


m1 = pow(c, dp, p)
m2 = pow(c, dq, q)

print(long_to_bytes(m1))
print(long_to_bytes(m2))

print("=======================================")
m = CRT([m1, m2], [p, q])
test = long_to_bytes(m)
print(test)

d = inverse(e, (p - 1) * (q - 1))
print(long_to_bytes(pow(c, d, p * q)))
### BUUCTF RSA1 密码学挑战的解题思路 对于BUUCTF平台上的RSA1密码学挑战,解决此类问题通常涉及理解RSA加密算法的工作原理以及可能存在的弱点。在处理这类题目时,重点在于分析给定的信息并利用已知漏洞来破解密钥。 #### 了解RSA基本概念 RSA是一种基于大整数因子分解难题构建的安全体系结构,在公钥加密领域广泛应用。其安全性依赖于两个大素数p和q乘积n=p*q难以被因式分解这一事实[^2]。 #### 常见攻击方法 针对RSA系统的常见攻击方式包括但不限于暴力破解尝试所有可能性(当密钥长度较短时可行),但更有效的策略通常是寻找实现中的缺陷或错误配置。例如: - **低指数广播攻击**:如果相同的明文消息m使用相同的小e值发送到多个接收者,则可以通过中国剩余定理恢复原始消息。 - **共模攻击**:当不同用户共享同一个模块N但是各自有不同的私钥d_i时,可以利用这一点来进行攻击。 - **部分私钥泄露**:即使只有少量位数的私钥d被暴露出来也可能导致整个系统崩溃。 考虑到上述提到的内容,并结合具体题目给出的数据特点,以下是具体的解题方向: #### 解决方案建议 假设题目提供了如下参数: - e: 公开指数 - n: 模数 - c: 加密后的密文 ##### 判断是否存在弱化情况 检查提供的`e`是否过小(如3)。如果是这样,那么可能存在低指数广播攻击的可能性。 ##### 尝试提取更多有用信息 查看是否有其他提示可以帮助简化计算过程,比如额外的消息副本或者其他形式的帮助信息。 ##### 使用工具辅助求解 借助开源库PyCryptoDome或其他类似软件包加速实验进程。Python代码片段展示如何加载必要的组件: ```python from Crypto.PublicKey import RSA from sympy.ntheory.factor_ import factorint ``` 通过这些指导原则,应该能够为进一步探索提供坚实的基础。当然,实际操作还需要根据具体情况调整策略。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值