Crypto --- halfenc wp

题目

from secret import flag
from Crypto.Util.number import long_to_bytes as l2b, bytes_to_long as b2l
from Crypto.Util.number import *


l = len(flag)
flag1 = b2l(flag[:l//2])
flag2 = b2l(flag[l//2:])

a, b = getPrime(1024), getPrime(1024)
C = a * b

c1 = flag1 ^ a
c2 = pow(flag2, 2, b)

print('c1 ', c1)
print('c2 ', c2)
print('C  ', C )

# c1  157449651601296649483325075658493791532881002698092279048459036450493413930912551935558039389463125381045647124014886862134739755203180184194019765992485694977941907702258231680934717838655651039985715667003505474247424715675773658619826217306296258884284231222755654537083523371771934823858161680459104540128
# c2  5095344477505153532473569738590974303255623645675497803556252219381937922039495544806509321
# C   16327399979538938065425627121938710541904767036111192807118978185802672839745807778511266965243133039287025116055341375973910685030924594006782621354835306582567901820541591246527468773161892553399248423766327141848489769447427618683164696928318358451254533747280041943283689587732331803718760505732388699649416666565690790691997037919051864209139757408059576578992675267907496436994991887557805956505940931238921997416398850919916421818718215169399203420307617093246406851885298278113980167862962784945591737075670993391568798856498520833705820403718410019375841238254740901259220548035942626718916000525487869227429

过程分析

观察到c2为302bit,远小于1024位数,由此可以知道m也比较小,所以可以直接开平方得到flag2,长度是151bit,则flag1也是151bit。flag1与a异或,影响的是后151位,前面的高位不影响,那么a1 = c1>>151。此时,相当于一个p高位copper问题求解,直接上sage求p即可。

解题脚本

#sage
n = 16327399979538938065425627121938710541904767036111192807118978185802672839745807778511266965243133039287025116055341375973910685030924594006782621354835306582567901820541591246527468773161892553399248423766327141848489769447427618683164696928318358451254533747280041943283689587732331803718760505732388699649416666565690790691997037919051864209139757408059576578992675267907496436994991887557805956505940931238921997416398850919916421818718215169399203420307617093246406851885298278113980167862962784945591737075670993391568798856498520833705820403718410019375841238254740901259220548035942626718916000525487869227429
c1 = 157449651601296649483325075658493791532881002698092279048459036450493413930912551935558039389463125381045647124014886862134739755203180184194019765992485694977941907702258231680934717838655651039985715667003505474247424715675773658619826217306296258884284231222755654537083523371771934823858161680459104540128
a1 = c1>>151
pbits = 1024
kbits = pbits - a1.nbits()
a1 = a1 << kbits
PR.<x> = PolynomialRing(Zmod(n))
f = x + a1
x0 = f.small_roots(X=2^kbits, beta=0.4)[0]
p = a1+x0
print (f"p={p}")

解得p如下

p = 157449651601296649483325075658493791532881002698092279048459036450493413930912551935558039389463125381045647124014886862134739755203180184194019765992485694977941907702258231680934717838655651039985715667003505474247424715675773658619826217306296258884284231222757654253843124059363532714335785345380061110739

之后相继解出flag1和flag2

from Crypto.Util.number import  *
c = 16327399979538938065425627121938710541904767036111192807118978185802672839745807778511266965243133039287025116055341375973910685030924594006782621354835306582567901820541591246527468773161892553399248423766327141848489769447427618683164696928318358451254533747280041943283689587732331803718760505732388699649416666565690790691997037919051864209139757408059576578992675267907496436994991887557805956505940931238921997416398850919916421818718215169399203420307617093246406851885298278113980167862962784945591737075670993391568798856498520833705820403718410019375841238254740901259220548035942626718916000525487869227429
c1 = 157449651601296649483325075658493791532881002698092279048459036450493413930912551935558039389463125381045647124014886862134739755203180184194019765992485694977941907702258231680934717838655651039985715667003505474247424715675773658619826217306296258884284231222755654537083523371771934823858161680459104540128
c2 = 5095344477505153532473569738590974303255623645675497803556252219381937922039495544806509321
p = 157449651601296649483325075658493791532881002698092279048459036450493413930912551935558039389463125381045647124014886862134739755203180184194019765992485694977941907702258231680934717838655651039985715667003505474247424715675773658619826217306296258884284231222757654253843124059363532714335785345380061110739
q = 103699181379480909410082746059703285060698301562239789026414142508323388585941780303768127270088294547266377195367361125971882464809317912665468204663052088087798132240649185721073622908820076662684840908799677597703936657832947289708464891056564156864361952242117878732296021299390051839197039504088689228711
flag1 = c1^p
flag2 =  gmpy2.iroot(c2,2)[0]
print(long_to_bytes(flag1)+long_to_bytes(flag2))

flag:

flag{4612e8ad1be143e8b642c3dbfddf1523}


如果你的朋友过得比你好,好很多,好到让你望尘莫及,一辈子追不上,那么你心里头会不会一点点别扭?
3tefanie丶zhou:我只会更开心!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值