cryptohack wp day
Posted Cryglz
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了cryptohack wp day相关的知识,希望对你有一定的参考价值。
第九题(Manyprime)
题目给了ct,e,n,分解n,发现如题目所说有多个素数,可以使用yafu分解,我这里直接使用factordb库(能直接生成列表,方便)。
代码如下:
n = 580642391898843192929563856870897799650883152718761762932292482252152591279871421569162037190419036435041797739880389529593674485555792234900969402019055601781662044515999210032698275981631376651117318677368742867687180140048715627160641771118040372573575479330830092989800730105573700557717146251860588802509310534792310748898504394966263819959963273509119791037525504422606634640173277598774814099540555569257179715908642917355365791447508751401889724095964924513196281345665480688029639999472649549163147599540142367575413885729653166517595719991872223011969856259344396899748662101941230745601719730556631637
e = 65537
ct = 320721490534624434149993723527322977960556510750628354856260732098109692581338409999983376131354918370047625150454728718467998870322344980985635149656977787964380651868131740312053755501594999166365821315043312308622388016666802478485476059625888033017198083472976011719998333985531756978678758897472845358167730221506573817798467100023754709109274265835201757369829744113233607359526441007577850111228850004361838028842815813724076511058179239339760639518034583306154826603816927757236549096339501503316601078891287408682099750164720032975016814187899399273719181407940397071512493967454225665490162619270814464
from factordb.factordb import FactorDB
from functools import reduce
# f = FactorDB(n) #这里先分解然后直接生成素数
# print(f.get_factor_list())
# print(f.connect())
# print(f.get_factor_list())
p_q=[9282105380008121879, 9303850685953812323, 9389357739583927789, 10336650220878499841, 10638241655447339831, 11282698189561966721, 11328768673634243077, 11403460639036243901, 11473665579512371723, 11492065299277279799, 11530534813954192171, 11665347949879312361, 12132158321859677597, 12834461276877415051, 12955403765595949597, 12973972336777979701, 13099895578757581201, 13572286589428162097, 14100640260554622013, 14178869592193599187, 14278240802299816541, 14523070016044624039, 14963354250199553339, 15364597561881860737, 15669758663523555763, 15824122791679574573, 15998365463074268941, 16656402470578844539, 16898740504023346457, 17138336856793050757, 17174065872156629921, 17281246625998849649]
phi =reduce(lambda x,y:x*(y-1),[1]+p_q)
print(phi)
d = pow(e,-1,phi)
flag = pow(ct,d,n)
print(bytes.fromhex(hex(flag)[2:]))
第十题(Salty)
这道题给了一大堆代码,但我们看到e=1,所以m=c,直接解c,发现能解。
c = 44981230718212183604274785925793145442655465025264554046028251311164494127485
print(bytes.fromhex(hex(c)[2:]))
但可能还会有另外的情况,就是m可能会比n大,这是m = kt+c,我们可以通过爆破k来知道m:
k = 0
while 1:
m =k*n +c
s = libnum.n2s(m)
if(\'crypto\' in str(s)):
print((\'flag=\',s))
break
k=k+1
第十一题(Modulus Inutilis)
加密过程和上题差不多,就是把e=1改为了e=3,典型的低加密指数攻击
解题思路就是c开三次方,M^e < n 时,C = M^e ,所以对C开方就能得到M。
当M^e > n 时,此时用爆破的方法,假设我们 M^e / n 商 k 余数为c,所以M^e = kn + C,对K进行爆破,只要k满足 kn + C能够开方就可以解出M
代码如下:
from gmpy2 import iroot
import libnum
n = 17258212916191948536348548470938004244269544560039009244721959293554822498047075403658429865201816363311805874117705688359853941515579440852166618074161313773416434156467811969628473425365608002907061241714688204565170146117869742910273064909154666642642308154422770994836108669814632309362483307560217924183202838588431342622551598499747369771295105890359290073146330677383341121242366368309126850094371525078749496850520075015636716490087482193603562501577348571256210991732071282478547626856068209192987351212490642903450263288650415552403935705444809043563866466823492258216747445926536608548665086042098252335883
c= 243251053617903760309941844835411292373350655973075480264001352919865180151222189820473358411037759381328642957324889519192337152355302808400638052620580409813222660643570085177957
k = 0
while 1:
res=iroot(c+k*n,3)
if(res[1]==True):
print(libnum.n2s(int(res[0])))
break
k=k+1
第十二题(Diffie-Hellman Starter 1)
from sympy import mod_inverse
p = 991
g = 209
d = mod_inverse(g, p)
print(d)
python 函数递归 day15
函数自己内部调用自己
无线循环会报错,所以需要一个明确的结束条件
def calc(n): print(n) calc(n) calc(10)
def calc(n): print(n) if int(n/2) == 0: return n return calc(int(n/2)) calc(10)
问路例题
person = [‘wl‘,‘wp‘,‘jp‘,‘yby‘,‘tyn‘] import time def askway(person): print(‘-‘*60) if len(person) == 0: return ‘根本没人知道‘ p = person.pop(0) # 列表一次弹出一个 if p == ‘yby‘: return ‘%s说:下个路口见‘%p print(‘hi boy%s,敢问路在何方‘%p) print(‘%s回答道:我不知道,我帮你问问%s```‘%(p,person)) time.sleep(3) res = askway(person) return res res = askway(person) print(res)
以上是关于cryptohack wp day的主要内容,如果未能解决你的问题,请参考以下文章