MoeCTF 2024-Crypto

现代密码学入门指北

  • RSA Tool 2中处理
  • moectf{the_way_to_crypto}

Signin

  • 手写脚本处理得到pq,用pow(),或者RSA Tool 2得到明文
from Crypto.Util.number import*

# (p-1)*(q-2)
pq = 18047017539289114275195019384090026530425758236625347121394903879980914618669633902668100353788910470141976640337675700570573127020693081175961988571621759711122062452192526924744760561788625702044632350319245961013430665853071569777307047934247268954386678746085438134169871118814865536503043639618655569687154230787854196153067547938936776488741864214499155892870610823979739278296501074632962069426593691194105670021035337609896886690049677222778251559566664735419100459953672218523709852732976706321086266274840999100037702428847290063111455101343033924136386513077951516363739936487970952511422443500922412450462
# (p-1)*(q-2)
qp = 18047017539289114275195019384090026530425758236625347121394903879980914618669633902668100353788910470141976640337675700570573127020693081175961988571621759711122062452192526924744760561788625702044632350319245961013430665853071569777307047934247268954386678746085438134169871118814865536503043639618655569687077087914198877794354459669808240133383828356379423767736753506794441545506312066344576298453957064590180141648690226266236642320508613544047037110363523129966437840660693885863331837516125853621802358973786440314619135781324447765480391038912783714312479080029167695447650048419230865326299964671353746764860
# p+q
p_q = 279533706577501791569740668595544511920056954944184570513187478007551195831693428589898548339751066551225424790534556602157835468618845221423643972870671556362200734472399328046960316064864571163851111207448753697980178391430044714097464866523838747053135392202848167518870720149808055682621080992998747265496
e = 65537
n = 18047017539289114275195019384090026530425758236625347121394903879980914618669633902668100353788910470141976640337675700570573127020693081175961988571621759711122062452192526924744760561788625702044632350319245961013430665853071569777307047934247268954386678746085438134169871118814865536503043639618655569687534959910892789661065614807265825078942931717855566686073463382398417205648946713373617006449901977718981043020664616841303517708207413215548110294271101267236070252015782044263961319221848136717220979435486850254298686692230935985442120369913666939804135884857831857184001072678312992442792825575636200505903
c = 5654386228732582062836480859915557858019553457231956237167652323191768422394980061906028416785155458721240012614551996577092521454960121688179565370052222983096211611352630963027300416387011219744891121506834201808533675072141450111382372702075488292867077512403293072053681315714857246273046785264966933854754543533442866929316042885151966997466549713023923528666038905359773392516627983694351534177829247262148749867874156066768643169675380054673701641774814655290118723774060082161615682005335103074445205806731112430609256580951996554318845128022415956933291151825345962528562570998777860222407032989708801549746
p = n - pq - p_q + 2
q = n - qp - p_q + 2
d = inverse(e,(p-1)*(q-1))
m = pow(c,d,n)
print(m)
print(hex(m))
  • 输出十六进制转字符
  • moectf{Just_4_signin_ch4ll3ng3_for_y0u}

ez_hash

  • 观察发现是由10位数字组成的字符串,前四位为2100
  • 写脚本碰撞sha256
from hashlib import sha256
for i in range(1000000):
    secret = b'2100' + f'{i:06}'.encode()
    hash_value = sha256(secret).hexdigest()
    if hash_value == '3a5137149f705e4da1bf6742e62c018e3f7a1784ceebcb0030656a2b42f50b6a':
        print(secret)
  • 得到moectf{2100360168}

Big and small

  • 发现e = 3,而n很大
  • 根据$$c = m^e\ mod\ n \Rightarrow m=(c+k\cdot n)^\left.\frac{1}{e} \right.$$
  • 于是可以手写脚本来得到明文
import gmpy2

e = 3
c = 150409620528288093947185249913242033500530715593845912018225648212915478065982806112747164334970339684262757
n = 20279309983698966932589436610174513524888616098014944133902125993694471293062261713076591251054086174169670848598415548609375570643330808663804049384020949389856831520202461767497906977295453545771698220639545101966866003886108320987081153619862170206953817850993602202650467676163476075276351519648193219850062278314841385459627485588891326899019745457679891867632849975694274064320723175687748633644074614068978098629566677125696150343248924059801632081514235975357906763251498042129457546586971828204136347260818828746304688911632041538714834683709493303900837361850396599138626509382069186433843547745480160634787

for i in range(10):
    a,b = gmpy2.iroot(c+i*n,3)
    if b:
        print(a)
        print(hex(a))
  • 十六进制转文本
  • flag{xt>is>s>b}

baby_equation

  • 根据python文件中的判定条件进行推导

$$(a^2 + 1)\cdot (b^2 + 1) – 2(a – b)\cdot (ab – 1)=4(k+ab)$$

$$\Rightarrow a^2b^2+a^2+b^2+1-2(a – b)\cdot (ab – 1)=4k +4ab$$

$$\Rightarrow (ab-1)^2+(a-b)^2-2(a – b)\cdot (ab – 1)=4k$$

$$\Rightarrow (ab-1-a+b)^2=4k$$

$$\Rightarrow ((a+1)(b-1))^2=4k$$

  • (服了,不会解了

暂无评论

发送评论 编辑评论

|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇