文章目录
- 题1
- 题2
- 题3
- 题4
一些较简单的题目。里面有些小点,稍不留意跑起来也挺费时。
题1
leak
题目描述:
#!/usr/bin/env python
# -*- coding: utf-8 -*-
from Crypto.Util.number import *
from secret import FLAG
m = bytes_to_long(FLAG)
def getpq(nbit):
p = getPrime(nbit)
q = getPrime(nbit)
if p > q:
return p, q
else:
return q, p
p, q = getpq(512)
P = (p - q) & ((1 << 130) - 1)
n = p * q
leak_p = p >> 256
c = pow((1 + P * n), m, n ** 3)
print('n =', n)
print('leak_p =', leak_p)
print("c =", c)
n = 135133139540786818977969958456509467902948924003478556140490841984247464940261764739984274397650928404945721248284577232814352745333641188749824519153271662051302477973525156608141358709265683759057060630360909926255299541198485901065352661702656282587105799982740927802530997159098015074633017964344230291287
leak_p = 115314121469787984258489158421056136177545051135641551928888818017665807264468
c = 1836794759996264077871820946090708779709415760553736759453665641907562256633157424959089180650539327925671892742819931875681606982615287882656254828326465758462357812873839261469783652663796071814218493268788421243190729887313099383264588659922912876424206670310928514588754069909128149471326084547056385690037197908766053620702238356084124023146075698878494434053246157524775269473152458661801907641122308756667762880284617915774590075511686821816948174618196839335059944389423693187930672934293905608970421003536691336581450927887931599275461176935079227494931457562345640133982771901848553204154760760399724074615092290799119053032875792219794072963200108352944441876206386518960615891547166767499506114294860833404421893612197040731184031783165365621722947731966143226777081983415797778111715332055871302609049501876860012070502369090417942239749695034267695710324328867728296996779
题目分析:
高位攻击爆破
8
位得
p
,
之后得到
P
l
e
a
k
=
(
1
+
P
∗
n
)
m
%
n
3
=
C
m
2
∗
(
P
∗
n
)
2
+
C
m
1
∗
(
P
∗
n
)
+
1
l
e
a
k
%
n
2
=
m
∗
P
∗
n
l
e
a
k
,
n
,
P
均已知,
m
也便出来了
高位攻击爆破8位得p,之后得到P\\ leak = (1 + P * n) ^ m \ \% \ n^3 \\ = C_m^{2} * (P * n)^2 + C_m^1 * (P * n) + 1\\ leak \ \%\ n^2 = m * P * n\\ leak,n,P均已知,m也便出来了\\
高位攻击爆破8位得p,之后得到Pleak=(1+P∗n)m % n3=Cm2∗(P∗n)2+Cm1∗(P∗n)+1leak % n2=m∗P∗nleak,n,P均已知,m也便出来了
n = 135133139540786818977969958456509467902948924003478556140490841984247464940261764739984274397650928404945721248284577232814352745333641188749824519153271662051302477973525156608141358709265683759057060630360909926255299541198485901065352661702656282587105799982740927802530997159098015074633017964344230291287
leak_p = 115314121469787984258489158421056136177545051135641551928888818017665807264468
c = 1836794759996264077871820946090708779709415760553736759453665641907562256633157424959089180650539327925671892742819931875681606982615287882656254828326465758462357812873839261469783652663796071814218493268788421243190729887313099383264588659922912876424206670310928514588754069909128149471326084547056385690037197908766053620702238356084124023146075698878494434053246157524775269473152458661801907641122308756667762880284617915774590075511686821816948174618196839335059944389423693187930672934293905608970421003536691336581450927887931599275461176935079227494931457562345640133982771901848553204154760760399724074615092290799119053032875792219794072963200108352944441876206386518960615891547166767499506114294860833404421893612197040731184031783165365621722947731966143226777081983415797778111715332055871302609049501876860012070502369090417942239749695034267695710324328867728296996779
P.<x> = PolynomialRing(Zmod(n))
leak_p <<= 8
for i in range(2 ** 8,1,-1):
print(i)
high_p = leak_p + i
f = (high_p << 248) + x
root = f.small_roots(2 ** 248,0.4,0.01)
if root:
print((high_p << 248) + int(root[0]))
p = 13352463043552409670211183534740157814546713901105410408023687926498813469217507846107364405269402732967687839808637375591530105677153038557366731161035343
q = n // p
P = (p - q) & ((1 << 130) - 1)
P_m_n = c % (n ** 2) - 1
m = (P_m_n // n // P)
print(long_to_bytes(m))
# DASCTF{365d0d2cda3a3836a19bf1f46760d875}
题2
题目描述:
from Crypto.Util.number import *
from secret import flag
def genprime():
while True:
r = getRandomNBitInteger(64)
p = r ** 6 + 8 * r ** 4 - 41 * r ** 3 + 14 * r ** 2 - 116 * r + 31387 # 384bits
q = r ** 5 - 9 * r ** 4 + 17 * r ** 3 - 311 * r ** 2 - 16 * r + 14029 # 320bits,n = 704bits
if isPrime(p) and isPrime(q):
return p, q
def enc(flag, n):
m = bytes_to_long(flag)
return pow(m, 31387, n)
p, q = genprime()
n = p * q
c = enc(flag, n)
print(n)
print(c)
n = 73553176031506251642448229714220151174734540964434813056145000616720019024269982417494553771890010861489245572362590935764438928110836109730139595790550323300572059713433794357690270439325805603980903813396260703
c = 6035303231100318215656164353047198868742763055193754611914191674005776329646395050293747516587004104241717689072827492745628156828285466831779549229513115371571798719567117034735830671759951028004405762435531685
e = 31387
题目分析:
n
=
p
∗
q
=
r
11
+
.
.
.
r
≈
n
1
/
11
,
在
n
1
/
11
附近爆破出
r
,至此得到
p
,
q
,
得
f
l
a
g
n = p * q = r^{11} + ... \\ r \approx n^{1 / 11},在n^{1 / 11}附近爆破出r,至此得到p,q,得flag
n=p∗q=r11+...r≈n1/11,在n1/11附近爆破出r,至此得到p,q,得flag
from gmpy2 import *
from Crypto.Util.number import *
n = 73553176031506251642448229714220151174734540964434813056145000616720019024269982417494553771890010861489245572362590935764438928110836109730139595790550323300572059713433794357690270439325805603980903813396260703
c = 6035303231100318215656164353047198868742763055193754611914191674005776329646395050293747516587004104241717689072827492745628156828285466831779549229513115371571798719567117034735830671759951028004405762435531685
e = 31387
r_prox = iroot(n,11)[0]
for r in range(r_prox-2000,r_prox + 2000):
p = r ** 6 + 8 * r ** 4 - 41 * r ** 3 + 14 * r ** 2 - 116 * r + 31387 # 384bits
q = r ** 5 - 9 * r ** 4 + 17 * r ** 3 - 311 * r ** 2 - 16 * r + 14029 # 320bits,n = 704bits
if p * q == n:
d = invert(e,(p-1)*(q-1))
print(long_to_bytes(pow(c,d,n)))
# CnHongKe{m0re_fuN_RSA!!!}
题3
题目描述:
from flag import FLAG
from Crypto.Util.number import *
import gmpy2
import random
while True:
p = int(gmpy2.next_prime(random.randint(10**399, 10**400-1)))
q = int(str(p)[200:]+str(p)[:200])
if gmpy2.is_prime(q):
break
m = bytes_to_long(FLAG)
n = p*q
e = 65537
c = pow(m,e,n)
with open("enc","wb") as f:
f.write(str(c))
f.write("\n")
f.write(str(n))
#182812482972168423884795132699225934365072979206288632257180603530046820174392675977209758378734399146216742345585898385168866887000708558119959898992294085847474548306743585711154035585848291290988967352517174312220756638881837930962458861193652684492265539096477345065113556380573776423787885892688197584678128636231428194711357642971544417113415626331810909274966752557628893585198569815939514862013512237657828262360291726912615575646318630641527418369988268899879152029186728850816178597399494254385226049249357897840618728804680238123954207656671747782543031545429711152272581734051959578453680011676521727918037340906791388178004979453256050227967701258768070039292546964652071924183467364467145178290753361477912582242961929982420950384199259355122986865808523351306098081481072454093823090
#438980397031315392229453908048509540832246041631432878509579665664182747463100230160823865621798053164989325086085003940181731721089701380743698761443812523024144817205902380903062054138730658451286904347536210833160924917347633148983052015550354913154312162901555870494273903714349869746793861874257201085777893961715468950661641778512110325457371446203379767458862059193946434683324578530163650541637261158037041205642428802942295011562277084687025213626698849526240663754073508102229066475773893638716845176469070938803298515155140240970836387785401085919369741520890271902332951669953411373633688944162470994856654604872287103746922041844065053274059990595496159866206551119361036237431289830985174384522423364811997241255005514248198447925396378192915553898993758660041223393168707380580012437
题目分析:
设
a
b
_
h
i
g
h
为
p
的前半段,
a
b
_
l
o
w
为
p
的后半
即
a
b
_
h
i
g
h
=
p
/
/
1
0
200
,
a
b
_
l
o
w
=
p
%
1
0
200
令
a
b
=
a
b
_
h
i
g
h
∗
a
b
_
l
o
w
p
=
a
b
_
h
i
g
h
∗
1
0
200
+
a
b
_
l
o
w
q
=
a
b
_
l
o
w
∗
1
0
200
+
a
b
_
h
i
g
h
⇒
n
=
a
b
∗
1
0
400
+
(
a
b
_
h
i
g
h
2
+
a
b
_
l
o
w
2
)
∗
1
0
200
+
a
b
设ab\_high为p的前半段,ab\_low为p的后半\\ 即ab\_high = p // 10^{200}, ab\_low = p \% 10^{200}\\ 令ab = ab\_high * ab\_low\\ p = ab\_high * 10^{200} + ab\_low\\ q = ab\_low * 10^{200} + ab\_high\\ \Rightarrow n = ab * 10 ^{400} + (ab\_high^{2} + ab\_low^{2}) * 10^ {200} + ab\\
设ab_high为p的前半段,ab_low为p的后半即ab_high=p//10200,ab_low=p%10200令ab=ab_high∗ab_lowp=ab_high∗10200+ab_lowq=ab_low∗10200+ab_high⇒n=ab∗10400+(ab_high2+ab_low2)∗10200+ab
得到:
通过对n移位等操作可以得到ab高位和低位,考虑到可能有进位,取高199位,之后爆破一位即可得到完整ab,ab知道便可得到
a
b
_
h
i
g
h
2
+
a
b
_
l
o
w
2
ab\_high^2 + ab\_low^2
ab_high2+ab_low2,如此a,b也能分别求出来了
from gmpy2 import *
from Crypto.Util.number import *
c=182812482972168423884795132699225934365072979206288632257180603530046820174392675977209758378734399146216742345585898385168866887000708558119959898992294085847474548306743585711154035585848291290988967352517174312220756638881837930962458861193652684492265539096477345065113556380573776423787885892688197584678128636231428194711357642971544417113415626331810909274966752557628893585198569815939514862013512237657828262360291726912615575646318630641527418369988268899879152029186728850816178597399494254385226049249357897840618728804680238123954207656671747782543031545429711152272581734051959578453680011676521727918037340906791388178004979453256050227967701258768070039292546964652071924183467364467145178290753361477912582242961929982420950384199259355122986865808523351306098081481072454093823090
n=438980397031315392229453908048509540832246041631432878509579665664182747463100230160823865621798053164989325086085003940181731721089701380743698761443812523024144817205902380903062054138730658451286904347536210833160924917347633148983052015550354913154312162901555870494273903714349869746793861874257201085777893961715468950661641778512110325457371446203379767458862059193946434683324578530163650541637261158037041205642428802942295011562277084687025213626698849526240663754073508102229066475773893638716845176469070938803298515155140240970836387785401085919369741520890271902332951669953411373633688944162470994856654604872287103746922041844065053274059990595496159866206551119361036237431289830985174384522423364811997241255005514248198447925396378192915553898993758660041223393168707380580012437
e=65537
ab_high = n // (10 ** 601) #
ab_low = n % (10 ** 200)
ab = ab_high * (10 ** 200) + ab_low
for i in range(10):
print(i)
ab = ab_high * 10 ** 201 + i * 10 ** 200 + ab_low
a2b2 = (n - ab * (10 ** 400 + 1)) // 10 ** 200
a_add_b = iroot(abs(a2b2 + 2 * ab),2)
if a_add_b[1]:
a_sub_b = iroot(abs(a2b2 - 2 * ab),2)[0]
a = (a_add_b[0] + a_sub_b) // 2
b = ab // a
p = a * (10 ** 200) + b
q = b * (10 ** 200) + a
d = invert(e,(p-1)*(q-1))
print(long_to_bytes(pow(c,d,n)))
# CMISCCTF{easy_math_game_hhhhhhh}
题4
题目描述:
import gmpy2
from Crypto.Util.number import bytes_to_long
from fractions import Fraction
flag = "***"
assert gmpy.is_prime(p) * gmpy.is_prime(q) > 0
assert Fraction(p, p + 1) + Fraction(q + 1, q) == Fraction(2 * s - X, s + Y)
print('p / (p + 1) + (q + 1) / q) == (2 * s - %s) / (s + %s)' % (X, Y))
n = p * q
c = pow(bytes_to_long(bytes(flag, "utf-8")), 0x10001, n) # 转字节
print('n =', n)
print('c =', c)
'''
p / (p + 1) + (q + 1) / q) == (2 * s - 153801856029563198525204130558738800846256680799373350925981555360388985602786501362501554433635610131437376183630577217917787342621398264625389914280509) / (s + 8086061902465799210233863613232941060876437002894022994953293934963170056653232109405937694010696299303888742108631749969054117542816358078039478109426)
n = 161010103536746712075112156042553283066813155993777943981946663919051986586388748662616958741697621238654724628406094469789970509959159343108847331259823125490271091357244742345403096394500947202321339572876147277506789731024810289354756781901338337411136794489136638411531539112369520980466458615878975406339
c = 15380535750650959213679345560658190067564859611922563753882617419201718847747207949211621591882732604480600745000879508274349808435529637573773711729853565120321608048340424321537282281161623712479117497156437792084977778826238039385697230676340978078264209760724043776058017336241110097549146883806481148999
'''
题目分析:
p
p
+
1
+
q
+
1
1
=
2
s
−
X
s
+
Y
2
n
+
p
+
q
+
1
n
+
q
=
2
s
−
X
s
+
Y
假设
2
s
−
X
=
2
n
+
p
+
q
+
1
s
+
Y
=
n
+
q
又
n
=
p
∗
q
三个等式解方程得
p
,
q
,
最后得
f
l
a
g
\frac{p}{p+1}+\frac{q+1}{1}=\frac{2s-X}{s+Y}\\ \ \\ \frac{2n+p+q+1}{n+q}=\frac{2s-X}{s+Y}\\ \ \\ 假设2s-X=2n+p+q+1\\ s+Y=n+q\\ 又 n = p * q\\ 三个等式解方程得p,q,最后得flag\\
p+1p+1q+1=s+Y2s−X n+q2n+p+q+1=s+Y2s−X 假设2s−X=2n+p+q+1s+Y=n+q又n=p∗q三个等式解方程得p,q,最后得flag
from z3 import *
from gmpy2 import *
from Crypto.Util.number import *
n = 161010103536746712075112156042553283066813155993777943981946663919051986586388748662616958741697621238654724628406094469789970509959159343108847331259823125490271091357244742345403096394500947202321339572876147277506789731024810289354756781901338337411136794489136638411531539112369520980466458615878975406339
c = 15380535750650959213679345560658190067564859611922563753882617419201718847747207949211621591882732604480600745000879508274349808435529637573773711729853565120321608048340424321537282281161623712479117497156437792084977778826238039385697230676340978078264209760724043776058017336241110097549146883806481148999
x = 153801856029563198525204130558738800846256680799373350925981555360388985602786501362501554433635610131437376183630577217917787342621398264625389914280509
y = 8086061902465799210233863613232941060876437002894022994953293934963170056653232109405937694010696299303888742108631749969054117542816358078039478109426
ss = Solver()
p,q,s = Ints('p q s')
ss.add(2 * n + p + q + 1 == 2 * s - x)
ss.add(n + q == s + y)
ss.add(n == p * q)
if ss.check() == sat:
print(ss.model())
p = 12774247264858490260286489817359549241755117653791190036750069541210299769639605520977166141575653832360695781409025914510310324035255606840902393222949771
q = 12604273285023995463340817959574344558787108098986028639834181397979984443923512555395852711753996829630650627741178073792454428457548575860120924352450409
s = 161010103536746712075112156042553283066813155993777943981946663919051986586388748662616958741697621238654724628406094469789970509959159343108847331259823112877911744430783479794351273206923447354336803583953484448372097816077196309188969276642688889403610864534620155124825996688886945889074240416915144846504
e = 65537
d = invert(e,(p - 1)*(q - 1))
print(long_to_bytes(pow(c,d,n)))
# flag{2a5a9c6fe94da5ef7edeffebb506b29a}
考点:
p已知一半位数爆破8位,开根,拼接,解方程
唉,最近好忙,开学了事好多啊,一些要深入的知识点也还没看。作业还没做,去苟作业了。