LitCTF2023-Crypto

  1. easy_math(中级)
  2. Where is P
  3. baby_xor

技术不到位,没能耐ak,记录几道题,简单的不提了

easy_math(中级)

from Crypto.Util.number import *
from secret import flag

m = bytes_to_long(flag)
e = 65537
p = getPrime(512)
q = getPrime(128)
n = p*q
hint = p**3-q**5
c = pow(m,e,n)
print(f'n = {n}')
print(f'c = {c}')
print(f'hint = {hint}')

关键在利用sympy库解方程组,只能说我用的少,之前做题也没遇到过。。。知识储备太少了。

p,q = symbols('p q')
eq1 = Eq(p*q, n)
eq2 = Eq(p**3 - q**5, hint)
sol = solve((eq1, eq2), (p, q))
print(sol)
#p = 7321664971326604351487965655099805117568571010588695608389113791312918573783115429227542573780838065461696504325762281209452761930184231131129306271846427
#q = 304683618109085947723284393392507415311

其它的不bb。

Where is P

from Crypto.Util.number import *
m=bytes_to_long(b'XXXX')
e=65537
p=getPrime(1024)
q=getPrime(1024)
n=p*q
print(p)
c=pow(m,e,n)
P=p>>340
print(P)
a=pow(P,3,n)
print("n=",n)
print("c=",c)
print("a=",a)

$a=pow(P,3,n)$,好家伙换了层皮我就不认识了,不就是低指数解密嘛😂,我当时竟然在分析位数想直接开方。

解出P就是构造copper解p了不多bb。这道题放这里提个醒。

baby_xor

from Crypto.Util.number import *
from secret import flag

m = bytes_to_long(flag)
assert len(flag)==32
p = getPrime(512)
q = getPrime(512)
n = p*q
e = 65537
c1 = p^m
c2 = pow(m,e,n)
print(f'n = {n}')
print(f'c1 = {c1}')
print(f'c2 = {c2}')

当时我是按照flag的长度大概找到了m的最大位数,大致255位,差不多为p位数的一半,所以m与p异或,高位部分不变,所以通过c1知道p的高256位左右,但还不够,接着我想到flag的格式,前面肯定是LitCTF{,加上这部分55位,就满足了构造copper的条件。但当时结果解不出来,搞不懂。

flag = b'LitCTF{'
print(bytes_to_long(flag))
m = 21508046296729211#55位
m = m << 200
p = c1^^m#sage里异或
phigh = p >> 200
kbits = 512 - phigh.nbits()
p4 = phigh << kbits
PR.<x> = PolynomialRing(Zmod(n))
f = x + p4
roots = f.small_roots(X=2^kbits, beta=0.4)
if roots:
    p = p4 + int(roots[0])
    print(p)
#11201139662236758800406931253538295757259990870588609533820056210585752522925662842097418194280333596411677923137891577493678147771013147838272857867768049

p出了就直接解了。

其它的题就不记录了(长本事了doge)。


转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 1666739907@qq.com
github