week8

week8

[RoarCTF2019]babyRSA

import sympy
import random
'''
def myGetPrime():
    A= getPrime(513)#十进制下155位的数字
    print(A)
    B=A-random.randint(1e3,1e5)#10的n次方
    print(B)
    return sympy.nextPrime((B!)%A)
p=myGetPrime()
#A1=21856963452461630437348278434191434000066076750419027493852463513469865262064340836613831066602300959772632397773487317560339056658299954464169264467234407
#B1=21856963452461630437348278434191434000066076750419027493852463513469865262064340836613831066602300959772632397773487317560339056658299954464169264467140596

q=myGetPrime()
#A2=16466113115839228119767887899308820025749260933863446888224167169857612178664139545726340867406790754560227516013796269941438076818194617030304851858418927
#B2=16466113115839228119767887899308820025749260933863446888224167169857612178664139545726340867406790754560227516013796269941438076818194617030304851858351026

r=myGetPrime()

n=p*q*r
#n=85492663786275292159831603391083876175149354309327673008716627650718160585639723100793347534649628330416631255660901307533909900431413447524262332232659153047067908693481947121069070451562822417357656432171870951184673132554213690123308042697361969986360375060954702920656364144154145812838558365334172935931441424096270206140691814662318562696925767991937369782627908408239087358033165410020690152067715711112732252038588432896758405898709010342467882264362733
c=pow(flag,e,n)
#e=0x1001
#c=75700883021669577739329316795450706204502635802310731477156998834710820770245219468703245302009998932067080383977560299708060476222089630209972629755965140317526034680452483360917378812244365884527186056341888615564335560765053550155758362271622330017433403027261127561225585912484777829588501213961110690451987625502701331485141639684356427316905122995759825241133872734362716041819819948645662803292418802204430874521342108413623635150475963121220095236776428
#so,what is the flag?

'''
from Crypto.Util.number import *
A1=21856963452461630437348278434191434000066076750419027493852463513469865262064340836613831066602300959772632397773487317560339056658299954464169264467234407
B1=21856963452461630437348278434191434000066076750419027493852463513469865262064340836613831066602300959772632397773487317560339056658299954464169264467140596
A2=16466113115839228119767887899308820025749260933863446888224167169857612178664139545726340867406790754560227516013796269941438076818194617030304851858418927
B2=16466113115839228119767887899308820025749260933863446888224167169857612178664139545726340867406790754560227516013796269941438076818194617030304851858351026
n=85492663786275292159831603391083876175149354309327673008716627650718160585639723100793347534649628330416631255660901307533909900431413447524262332232659153047067908693481947121069070451562822417357656432171870951184673132554213690123308042697361969986360375060954702920656364144154145812838558365334172935931441424096270206140691814662318562696925767991937369782627908408239087358033165410020690152067715711112732252038588432896758405898709010342467882264362733
e=0x1001
c=75700883021669577739329316795450706204502635802310731477156998834710820770245219468703245302009998932067080383977560299708060476222089630209972629755965140317526034680452483360917378812244365884527186056341888615564335560765053550155758362271622330017433403027261127561225585912484777829588501213961110690451987625502701331485141639684356427316905122995759825241133872734362716041819819948645662803292418802204430874521342108413623635150475963121220095236776428
def decrept(a,b):
    c=1
    for i in range(b+1,a):
        c=(c*inverse(i,a))%a
    c=(-c)%a
    #c=c*(a-1)%a
    return sympy.nextprime(c)
p=decrept(A1,B1)
q=decrept(A2,B2)
r=n//p//q
fn=(p-1)*(q-1)*(r-1)
d=inverse(e,fn)
m=pow(c,d,n)
print(long_to_bytes(m))
#RoarCTF{wm-CongrAtu1ation4-1t4-ju4t-A-bAby-R4A}

这道题目是威尔逊定理的运用,让我回顾了一下这个定理。

[RoarCTF2019]RSA

A=(((y%x)**5)%(x%y))**2019+y**316+(y+1)/x
p=next_prime(z*x*y)
q=next_prime(z)
A =  2683349182678714524247469512793476009861014781004924905484127480308161377768192868061561886577048646432382128960881487463427414176114486885830693959404989743229103516924432512724195654425703453612710310587164417035878308390676612592848750287387318129424195208623440294647817367740878211949147526287091298307480502897462279102572556822231669438279317474828479089719046386411971105448723910594710418093977044179949800373224354729179833393219827789389078869290217569511230868967647963089430594258815146362187250855166897553056073744582946148472068334167445499314471518357535261186318756327890016183228412253724
n =  117930806043507374325982291823027285148807239117987369609583515353889814856088099671454394340816761242974462268435911765045576377767711593100416932019831889059333166946263184861287975722954992219766493089630810876984781113645362450398009234556085330943125568377741065242183073882558834603430862598066786475299918395341014877416901185392905676043795425126968745185649565106322336954427505104906770493155723995382318346714944184577894150229037758434597242564815299174950147754426950251419204917376517360505024549691723683358170823416757973059354784142601436519500811159036795034676360028928301979780528294114933347127
c =  41971850275428383625653350824107291609587853887037624239544762751558838294718672159979929266922528917912189124713273673948051464226519605803745171340724343705832198554680196798623263806617998072496026019940476324971696928551159371970207365741517064295956376809297272541800647747885170905737868568000101029143923792003486793278197051326716680212726111099439262589341050943913401067673851885114314709706016622157285023272496793595281054074260451116213815934843317894898883215362289599366101018081513215120728297131352439066930452281829446586562062242527329672575620261776042653626411730955819001674118193293313612128

这道题目的第一行让我完全看不明白,直接看wp了。其实他的作用是让我们爆破出x,y。首先我们假设xy都是大于0的数字,否则我这道题目完全无从下手了。

首先根据一个同余的原则,就是一个数取了某个数的余数之后不可能比原来的数大。所以第一部分肯定不会大于y,第3部分大概率不会大于y+1(总不能x不是个整数吧,计算机里面好像对浮点数都不怎么友好)

如此看来,第二项应该是远大于其余两项,直接讲A开316次方得到一个八十几的数字,y肯定要小于这个,x的范围好像更小。我们干脆把条件放宽松一点,就当做都在1-200范围内算了。

在得到x*y之后,我们要求p和q,在已知z比较大的情况下,我们可以估算出
z 2 < p ∗ q / 166 < q 2 z^2<p*q/166<q^2 z2<pq/166<q2
所以由我的exp可以准确的得到q,也就能得到p。

第三步,求e,这一步我选择了直接爆破,然后寄了。

检验方式确实是弄出答案看里面有没有flag的格式。

这一步我看wp选择了nextprime而不是+=1.

“我就知道,你有问题!”(bushi)

只能说是种经验吧,但尽管如此,我的垃圾电脑还是跑路5分钟有多。

如下是exp

from gmpy2 import *
import sympy
from Crypto.Util.number import *
A =  2683349182678714524247469512793476009861014781004924905484127480308161377768192868061561886577048646432382128960881487463427414176114486885830693959404989743229103516924432512724195654425703453612710310587164417035878308390676612592848750287387318129424195208623440294647817367740878211949147526287091298307480502897462279102572556822231669438279317474828479089719046386411971105448723910594710418093977044179949800373224354729179833393219827789389078869290217569511230868967647963089430594258815146362187250855166897553056073744582946148472068334167445499314471518357535261186318756327890016183228412253724
n =  117930806043507374325982291823027285148807239117987369609583515353889814856088099671454394340816761242974462268435911765045576377767711593100416932019831889059333166946263184861287975722954992219766493089630810876984781113645362450398009234556085330943125568377741065242183073882558834603430862598066786475299918395341014877416901185392905676043795425126968745185649565106322336954427505104906770493155723995382318346714944184577894150229037758434597242564815299174950147754426950251419204917376517360505024549691723683358170823416757973059354784142601436519500811159036795034676360028928301979780528294114933347127
c =  41971850275428383625653350824107291609587853887037624239544762751558838294718672159979929266922528917912189124713273673948051464226519605803745171340724343705832198554680196798623263806617998072496026019940476324971696928551159371970207365741517064295956376809297272541800647747885170905737868568000101029143923792003486793278197051326716680212726111099439262589341050943913401067673851885114314709706016622157285023272496793595281054074260451116213815934843317894898883215362289599366101018081513215120728297131352439066930452281829446586562062242527329672575620261776042653626411730955819001674118193293313612128
for x in range(1,200):
	for y in range(1,200):
		if x%y==0:
			continue
		if A==(((y%x)**5)%(x%y))**2019+y**316+(y+1)//x:
			print(x,y,x*y)
n1=n//166
q=sympy.nextprime(iroot(n1,2)[0])
assert n%q==0
p=n//q
fn=(p-1)*(q-1)
#print(p,q)
e=2
while True:
	d=inverse(e,fn)
	m=pow(c,d,n)
	flag=long_to_bytes(m)
	e=sympy.nextprime(e)
	if b'RoarCTF{' in flag:
		print(flag)
		break
		
'''		
2 83 166
b'RoarCTF{wm-l1l1ll1l1l1l111ll}'
[Finished in 343.9s]
'''

[网鼎杯 2020 青龙组]you_raise_me_up

#!/usr/bin/env python
# -*- coding: utf-8 -*-
from Crypto.Util.number import *
import random
'''
n = 2 ** 512
m = random.randint(2, n-1) | 1
c = pow(m, bytes_to_long(flag), n)
print 'm = ' + str(m)
print 'c = ' + str(c)
'''
m = 391190709124527428959489662565274039318305952172936859403855079581402770986890308469084735451207885386318986881041563704825943945069343345307381099559075
c = 6665851394203214245856789450723658632520816791621796775909766895233000234023642878786025644953797995373211308485605397024123180085924117610802485972584499
import sympy.ntheory
n = 2 ** 512
flag_dec = sympy.ntheory.discrete_log(n,c,m)
print(long_to_bytes(flag_dec))

不得不说我这个直接在题目下面写解的习惯好像不是很好。

这道题目没啥意思,是一道离散对数的题目。这个wp里面提到了一个sympy库里面的discrete_log函数。

他不在sympy的库里面,但是在其下属的ntheory中。

这个函数的作用就是求离散对数,应该是比较暴力的算法,x=discrete_log(n,c,m)的参数顺序比较奇怪。
m x ≡ c , m o d n m^x≡c,mod n mxc,modn
自己感受一下。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值