NSSCTF:

[SWPUCTF 2022 新生赛]小明文

附件中给出了e=3和c的值,但没有n

可以判断为小明文爆破,根据c+kn = m^e

通过对m开e次方根,如果得到整数,则我们得到对应的flag

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
import gmpy2
from Crypto.Util.number import getPrime,long_to_bytes


def deco(c,e,n):
k=0
while True:
m=c+n*k
result,flag=gmpy2.iroot(m,e)
if flag:
return result
k+=1
e=3
p = getPrime(1024)
q = getPrime(1024)
n = p * q
c = 128198926274489803523728445192921664

m=deco(c,e,n)
print(long_to_bytes(m))

[SWPUCTF 2022 新生赛]yafu分解

我们直接用yafu分解出q,p,解密后得到AFFPGS{snzv1l_ov9_gur_g0_Jr1p0zr}

然后通过凯撒或者Rot13解密得到NSSCTF{fami1y_bi9_the_t0_We1c0me}

1
2
3
4
5
6
7
8
9
10
11
12
13
14
import gmpy2
from Crypto.Util.number import long_to_bytes


e=65537
n=1851012829537540993346897265450988006921329733937556249710137670254755668838970157221
c=1165608868963663237838494928147497339359377331987999335624507621030816298293537918937
p=1358730637766188714476624560503309609820513
q=1362310363870711901033415700690289289304517
Phi=(p-1)*(q-1)
d=gmpy2.invert(e,Phi)
m=pow(c,d,n)

print(long_to_bytes(m))

[SWPUCTF 2022 新生赛]AES

pad部分是用来用空格补全到16位的,相应的解密时就需要用rstrip()来删除末尾空格

AES_en部分则是加密部分,先用CBC模式新建了一个AES_obj的实例,

AES_obj.encrypt(data.encode("utf-8")) 这一行代码使用了之前创建的AES对象 (AES_obj) 来加密输入的数据 (data)。让我们详细解释这个操作:

  1. data.encode("utf-8"): 将输入的数据 data 转换为UTF-8编码的字节序列。AES加密要求输入数据为字节序列,而不是字符串。
  2. AES_obj.encrypt(...): 这是AES对象的方法,用于对数据进行加密。它接受一个字节序列作为输入,并返回加密后的字节序列。在这里,输入是通过UTF-8编码的数据。

AES_en_str = base64.b64encode(AES_en_str)则是解码base64的

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
import base64
from Crypto.Cipher import AES

def aes_decrypt(key,iv,enc_data):
cipher=AES.new(key.encode('utf-8'),AES.MODE_CBC,iv.encode('utf-8'))
enc_data=base64.b64decode(enc_data)
dec_data=cipher.decrypt(enc_data).rstrip()
return dec_data.decode('utf-8')

iv = '1229002635654321'
key = 'nssctfneedcrypto'
enc_data='862EoKZMO3sqpNlzyvIW5G/8MFeAI/zgGXcgi5eNOL8='

decrypted_data=aes_decrypt(key,iv,enc_data)

print(decrypted_data)



[HUBUCTF 2022 新生赛]baby_encrypt

题目提示的是加法,推测为前缀和781612443113954655886887407898899451044114412011257135914071455155316031651170318041861191719652013207021272183228423832485254125932643269827992924

进行分割,为了方便解码,在一开始加一个0

构造序列为0 78 161 244 311 395 465 588 688 740 789 889 945 1044 1144 1201 1257 1359 1407 1455 1553 1603 1651 1703 1804 1861 1917 1965 2013 2070 2127 2183 2284 2383 2485 2541 2593 2643 2698 2799 2924 -1

然后前后做差后转字符

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include<bits/stdc++.h>
using namespace std;
string flag;
int main()
{
int pre=0,now=0;
while(cin>>now)
{
if(now==0)continue;
if(now==-1)break;
flag+=(char)(now-pre);
pre=now;
}
cout<<flag;
return 0;
}

[SWPUCTF 2022 新生赛]爆破MD5

附件中可见是MD5爆破

data='Boom_MD5****' flag=MD5(data) print(flag) #0618ac93d4631df725bceea74d0*****

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
import base64
from Crypto.Cipher import AES
import string
import hashlib

dic='0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ-_}{'
for a1 in dic:
for a2 in dic:
for a3 in dic:
for a4 in dic:
s='Boom_MD5'+a1+a2+a3+a4
m=hashlib.md5(s.encode('utf-8')).hexdigest()
if '0618ac93d4631df725bceea74d0' in m:
print(m)
exit(0)


[UUCTF 2022 新生赛]Easy_base64

base64加密后有个前后异或的加密,但除了开头第一个

1
2
3
4
5
6
7
8
9
10
11
12
13
import base64
from Crypto.Cipher import AES
import string
import hashlib

enc = [55 ,21 ,16, 50 ,105 ,71, 14, 27 ,41 ,30, 34 ,16, 50, 111 ,74 ,62, 5 ,18 ,54, 52, 106,85 ,31, 54 ,24, 111, 83, 11, 38, 1, 53, 17, 37, 17, 35, 47, 32, 52, 40, 2, 9, 59, 47, 54, 25, 111, 77, 16, 48, 26, 33, 9, 55, 108, 0]
flag = "Z"
for i in range(len(enc)):
flag += chr(ord(flag[i])^enc[i])
print(base64.b64decode(flag))



[UUCTF 2022 新生赛]unsafe_prime

从附件中可知n=p**3,其中p为质数

那么φ(n)= p^k^-p^k-1^

证明:显然对于从1到p^k^的所有数中,除了p^k-1^个p的倍数以外其他数都与p^k^互素,所以根据欧拉函数的定义:φ(p^k^)=p^k^-p^k-1^

1
2
3
4
5
6
7
8
9
10
import gmpy2
from Crypto.Util.number import long_to_bytes

e=65537
n = 1781066779141074297846071955037887396311182371062305797790413639302252321886055189043670187843106208315282055227397316083218930657040969292641990094428330517286511511741846106485971830443788363541411679523274683568732340113625424593194464460018629545968907529693143364870519531630721083893407011154181539445417439610805148961135948617691115328261432541033785402520757881586489819563221498111411690769065511011083021336493731421274742041131952523427183184133413677315203810963447656037908287875212013900845740870561508870574734100843624059414134156975073835607712519402938132401964708681236647568922173471703538744207491065165405594141287750705055447493380970194312139898574699147098202027540057477562090764694370368571887563631557761911842054442637038169316686266784299889397326811768646649462480349219937292894824766045607723468654723947999531346474969019631500665628522355198334827965770037487344994396753505248472283247731
c = 1402371150275079475353867962992356093684205278224746766691813462864343871795075217989508355749642716635931824907174189358797217546624305634264458802157933311315419673854405865092102322247505412453586251582022669511221048298234732642016439123525455296325766292112758881774720932499142635136210314142144509741404827421282969081272484330382868174392651681290127032351489627054643864671335712011990584326951285867375878235135547391155357814807654366986019707719726796289990920154227959213228064918435259919697047405788311280560319520593639968900649500117511665741073545430999580686455996145426173603547052710181735901020361145546892741579951501409108067297139928103329203429485237575169217432586580425019729120741661192297552519858305628835738911159460615968385837687234565509200392302553443089729906970894661310333276852803980265040679214814192141779678148895736682538612828771031493541256243879854624644771924477873876038496224
p=gmpy2.iroot(n,3)[0]
d=gmpy2.invert(e,p**3-p**2)
m=pow(c,d,n)
print(long_to_bytes(m))

[SWPUCTF 2023 秋季新生赛]EasyRSA

题目已经给出了p,q,e,c直接RSA解密即可

n=p*q

欧拉函数 Phi=φ(n)=(p-1)(q-1)

C^d^ mod N =M

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
import gmpy2
from Crypto.Util.number import long_to_bytes

p= 122912801126049869009003839542545176400185213365268209105714006257803073428638629824801261702125287814910668428403367391355051987389837804474055637991864563803834741161217607848968821280710324766558457056004037592628178078680121173634128054936108782807954132605887275556228703383455969903056759874047110115433
q= 120790113700754477830062212762518406876786376726996249661848284428829412089402183812692045970711341815805796005449714738748110749559462448861357011272792817313060401380148108517705435100103533857957024851181447994572972501120774586405811257420853542417275740953525627232008812587423053626515513859653865873671
e= 65537
c= 7094224488947659163318199615533819770556597977720767621640224798887506152292861133457571683713587909779712343346370719403811813233693263526316785431883833118583425528830238629831001255198236686372518770451273159769779374149881346761523688131115323441973953523582174059584087249568245044443295176738493785560215046375056269378223045128094953923926250055718405799885041115025529297362914403732661935017257507786348635366480744933193471899621592092711962814949533564454932121056035003021428158830645604347966849572981124877683317022116903132719663958775850982016292384237647664448371811915879714093710876989697939277005

n=p*q
Phi=(p-1)*(q-1)
d=gmpy2.invert(e,Phi)
m=gmpy2.powmod(c,d,n)
print(long_to_bytes(m))


[鹤城杯 2021]Crazy_Rsa_Tech

加密指数e很小,且只有一个

拿到了多组n和c,且模数n不同,但使用相同的加密指数e进行多次加密

==》低加密指数广播攻击

我们要用到的知识点是:中国剩余定理(CRT)

系统来说解法就是:

M1 = m2 * m3;M2 = m1 * m3 ;M3 = m1 * m2;……

设t1为M1的模m1逆元(t1*M1 ≡ 1 mod m1),t2,t3……

则 x=a * M1 * t1 + b * M2 * t2+ ……-k * m1 * m2 * m3*……(适当选择k使得x为最小值)

即 x= (a * M1 * t1 + b * M2 * t2 +……) mod ( m1 * m2 * m3 *……)

d,r,t=gmpy2.gcdext(n,m):

d为n和m的最大公约数,rt是满足n*r + m*t = d的一对贝祖系数,如果 nm 互质,那么 t 就是 m 相对于 n 的乘法逆元,而 r 则是 n 相对于 m 的乘法逆元

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
import gmpy2
from Crypto.Util.number import long_to_bytes
from functools import reduce

e=9
n_list=[
71189786319102608575263218254922479901008514616376166401353025325668690465852130559783959409002115897148828732231478529655075366072137059589917001875303598680931962384468363842379833044123189276199264340224973914079447846845897807085694711541719515881377391200011269924562049643835131619086349617062034608799, 92503831027754984321994282254005318198418454777812045042619263533423066848097985191386666241913483806726751133691867010696758828674382946375162423033994046273252417389169779506788545647848951018539441971140081528915876529645525880324658212147388232683347292192795975558548712504744297104487514691170935149949, 100993952830138414466948640139083231443558390127247779484027818354177479632421980458019929149817002579508423291678953554090956334137167905685261724759487245658147039684536216616744746196651390112540237050493468689520465897258378216693418610879245129435268327315158194612110422630337395790254881602124839071919, 59138293747457431012165762343997972673625934330232909935732464725128776212729547237438509546925172847581735769773563840639187946741161318153031173864953372796950422229629824699580131369991913883136821374596762214064774480548532035315344368010507644630655604478651898097886873485265848973185431559958627423847, 66827868958054485359731420968595906328820823695638132426084478524423658597714990545142120448668257273436546456116147999073797943388584861050133103137697812149742551913704341990467090049650721713913812069904136198912314243175309387952328961054617877059134151915723594900209641163321839502908705301293546584147, 120940513339890268554625391482989102665030083707530690312336379356969219966820079510946652021721814016286307318930536030308296265425674637215009052078834615196224917417698019787514831973471113022781129000531459800329018133248426080717653298100515701379374786486337920294380753805825328119757649844054966712377, 72186594495190221129349814154999705524005203343018940547856004977368023856950836974465616291478257156860734574686154136925776069045232149725101769594505766718123155028300703627531567850035682448632166309129911061492630709698934310123778699316856399909549674138453085885820110724923723830686564968967391721281, 69105037583161467265649176715175579387938714721653281201847973223975467813529036844308693237404592381480367515044829190066606146105800243199497182114398931410844901178842049915914390117503986044951461783780327749665912369177733246873697481544777183820939967036346862056795919812693669387731294595126647751951, 76194219445824867986050004226602973283400885106636660263597964027139613163638212828932901192009131346530898961165310615466747046710743013409318156266326090650584190382130795884514074647833949281109675170830565650006906028402714868781834693473191228256626654011772428115359653448111208831188721505467497494581
]
c_list=[
62580922178008480377006528793506649089253164524883696044759651305970802215270721223149734532870729533611357047595181907404222690394917605617029675103788705320032707977225447998111744887898039756375876685711148857676502670812333076878964148863713993853526715855758799502735753454247721711366497722251078739585, 46186240819076690248235492196228128599822002268014359444368898414937734806009161030424589993541799877081745454934484263188270879142125136786221625234555265815513136730416539407710862948861531339065039071959576035606192732936477944770308784472646015244527805057990939765708793705044236665364664490419874206900, 85756449024868529058704599481168414715291172247059370174556127800630896693021701121075838517372920466708826412897794900729896389468152213884232173410022054605870785910461728567377769960823103334874807744107855490558726013068890632637193410610478514663078901021307258078678427928255699031215654693270240640198, 14388767329946097216670270960679686032536707277732968784379505904021622612991917314721678940833050736745004078559116326396233622519356703639737886289595860359630019239654690312132039876082685046329079266785042428947147658321799501605837784127004536996628492065409017175037161261039765340032473048737319069656, 1143736792108232890306863524988028098730927600066491485326214420279375304665896453544100447027809433141790331191324806205845009336228331138326163746853197990596700523328423791764843694671580875538251166864957646807184041817863314204516355683663859246677105132100377322669627893863885482167305919925159944839, 2978800921927631161807562509445310353414810029862911925227583943849942080514132963605492727604495513988707849133045851539412276254555228149742924149242124724864770049898278052042163392380895275970574317984638058768854065506927848951716677514095183559625442889028813635385408810698294574175092159389388091981, 16200944263352278316040095503540249310705602580329203494665614035841657418101517016718103326928336623132935178377208651067093136976383774189554806135146237406248538919915426183225265103769259990252162411307338473817114996409705345401251435268136647166395894099897737607312110866874944619080871831772376466376, 31551601425575677138046998360378916515711528548963089502535903329268089950335615563205720969393649713416910860593823506545030969355111753902391336139384464585775439245735448030993755229554555004154084649002801255396359097917380427525820249562148313977941413268787799534165652742114031759562268691233834820996, 25288164985739570635307839193110091356864302148147148153228604718807817833935053919412276187989509493755136905193728864674684139319708358686431424793278248263545370628718355096523088238513079652226028236137381367215156975121794485995030822902933639803569133458328681148758392333073624280222354763268512333515
]


def CRT(items):
N = reduce(lambda x,y:x*y,(i[1] for i in items))
result=0
for a, n in items:
m = N//n
d,r,t=gmpy2.gcdext(n,m)
if d!=1:
raise Exception('Input not pairwise co-prime')
result += a*m*t
return result % N, N


data=list(zip(c_list,n_list))
x,n = CRT(data)
m=gmpy2.iroot(gmpy2.mpz(x),e)[0].digits()
print(long_to_bytes(int(m)))

[SWPUCTF 2023 秋季新生赛]小明文?

Franklin-Reiter相关信息攻击

  • 如果两个信息之间存在已知的固定差异,并且在相同的模数n下进行RSA加密,那么就有可能恢复出这两个消息
  • 简单点说就是m和m+a两个明文在相同的e和n下进行加密,那么m就可以破解

4d9cb6a54246a9e8e4019ae9b6be66a8

sagemath运行:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
n = 13026126941826887019162872735099540876106694302074884925200107036130428843197729140372377590706535217469477301361486550282890330093772372813532795303163348233096919179478061917423707929667355386062657434467799360617526194768968700908096844475960205671302377364202483195391706116078632202015938962280529309403244885363904094804118278167720593581764017089021116316636464533785051436622916960956665030100255641288863474938703
a = 280807370135687531454416708417179457159
b = 210598260561987226227971066630761929397
c1 = 5484670538103757119990644460454986219076673914082966464351809153114702100411054106785392646801736865489738145857425179185164710603704198643749378051371008266521829572436350080663825339915763509501690398283916091505443322384568973565599179112299853287766734493187659418383619877040013434926843623979979122417950089001830664273269598688130410251828579862218274297572192961909808728768317567218412746711665911495028223620671
c2 = 249587944874112168607313602465869274336587750392364868939732783502223999305089384749508572630699199927194600499968110646290832205640569694933539973256281796631433129626712361622584048439446364992886884217198680921278383770604919381329363647924261642857483728973331091285820401689502291336332199019252649615680893389557508558362194551939434128389351824194393680744241807605416750291337127085044177563509645273228457253193
e = 5

def franklin_reiter(n, a, b, c1, c2, e):
PR.<x> = PolynomialRing(Zmod(n))
g1 = (x)^e - c1
g2 = (a*x+b)^e - c2

def gcd(a,b):
while b:
a,b=b,a%b
return a.monic()
return -gcd(g1,g2)[0]

m=franklin_reiter(n, a, b, c1, c2, e)
print(m)

得到长整型结果然后转字符

1
2
3
from Crypto.Util.number import *
m=2806865643354785582447058473372538382961766115574914049099282462437697164397424611542516856194548817486973
print(long_to_bytes(m))

[SWPUCTF 2022 新生赛]Welcome to Modern Cryptography

提供了公钥和私钥,直接利用在线RSA解密即可

image-20240807193447652

[SWPUCTF 2023 秋季新生赛]dpdp

dp泄露,给了n,e,c,dp

公式推理

image-20240807203058349

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
from Crypto.Util.number import *
import gmpy2

def get_q(e, n,dp):
for x in range(1, e):
if(e*dp%x==1):
p=(e*dp-1)//x+1
if(n%p!=0):
continue
q=n//p
return q

n = 62950660589752377241535942010457460675378335694404721223426371627802159493655570041534480026979837056215567303530448462076388942749116962945931432723672826148999814815864738069663127706046027850586024555861960247057288826014343547293035737544457656904257388300461848219257240252715837662741274235378360898441
c = 26392919777656338278184497106215581599692023606797351841011065350738534402079717897589592521000832026751736045905247050532819571969784687491977953157313304550096179520376626220816081159472339787295872214912587497324709488986746768994907107727184468228540635002062232484115731701648311946527233449512543132274
dp = 7088497034630351463006975624795947102639056977565074157092915907376477955247769847204254053775159112398217033648894620506901638351932922911273150932128973
e = 65537
q = get_q(e, n, dp)
p = n//q
phi = (p-1)*(q-1)
d = gmpy2.invert(e, phi)
m = pow(c, d, n)
print(long_to_bytes(m))

[UUCTF 2022 新生赛]Impossible_RSA

  • 从已知条件可得到两个方程:
    1. n=p*q
    2. leak3=p+q

​ 根据这个即可解出p(或者q

  • 由于缺少了密文c,我们可以通过中国剩余定理得到,此处采用sage内置的crt()

  • 由于缺少了e,但给定了e的范围,且范围不是很大,可以爆破得到

以下部分中:

​ 1.注释部分利用sympy库的solve解出p(或q)

​ 2.c=[int(crt([leak1,leak2],[p,q])),int(crt([leak1,leak2],[q,p]))]由于无法确定第一步得到的是p还是q,所以将两个结果都要算出来

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
from Crypto.Util.number import *
from sage.all import *
from sympy import *
n = 21256406304024147327122699985764737895162788854942201173538004689536569610046157311527715126074775927977409773971656249943602454790380966869525211733301201659688694473703188427037879868522859419364680904585572399937639393418586498509580133474303442722716959873727260844993296681950092753897902540593927952622713860163782763263944291810729056735965535138964485886748344167499818148134252327820007439830749462775149754781930983094046362696040641091039506998835624218220892441813224657845627120344960554424765109502415773475619490661527184126374299883610442465428985757004551740482644952396990065188807827114495184096249
leak1 = 8842431959638543756327530752221031675897458993985909403335303147413741167900365489182674478419510549838159493192002672500346433589707076289344572454304647803237654059883974235710442126617587691632375039292283285577033977676131772115877520248352227419433136507412485140428972344000541898060766721412300525883
leak2 = 127414092867622693231378230621806169422569654246682818498761930473755998913688181327473434110121174292309611256339271412324673262030535400937563769685033472683498585742711576446343086462569783541192470920638935990937187809422965809986860709074542257475025562691683977493260026623616012846939417988284096473040
leak3 = 293130152177150437492580785085598394773458388719469800871702200331766258900690595210759869625006484354799804558552583572062231998451041105464048317708732987121458633718573774164071597186461239762511364549980544029915308083867329707804739776241438307060614946195675715671343671137725809499387682363101164970886

# p=Symbol('p')
# q=Symbol('q')
# ans=solve([p*q-n,p+q-leak3],[p,q])
# print(ans)
p=131567902193947737457053703919039608741727165458271604872166212865939087016959861850815713604059268499777293923208600279164674644010570874718551586480430092745439767701977059922316781232716126035386163833756203019774439784605127681828683292496816187253311811505880053923307168541440673933884409766487464694543
q=n//p
c=[int(crt([leak1,leak2],[p,q])),int(crt([leak1,leak2],[q,p]))]

for cc in c:
for e in range(2,500000):
try:
phi=(p-1)*(q-1)
d=inverse(e,phi)
m=pow(cc,d,n)
flag=long_to_bytes(m)
if b'ctf' in flag or b'flag' in flag or b'CTF' in flag:
print(flag)
except:pass


[UUCTF 2022 新生赛]简单的数学

1.c=(m*p+kn)^e mod n

2.根据二项式展开可知最后不含n的项仅有m*p

3.c=(m*p)^e mod n

4.m*p=c^d mod n

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
from Crypto.Util.number import *
from sympy import *
from gmpy2 import *

n = 25014963863951112347974440214066273048882503259160338255496299775995961351901571648895465031685356024238885233929337483853960374743565692563404769039019561050421788096283392820458449077490390195564801845037357811298274797645813808259301937466827199149702646030007667049110326436048932024335483846993690455310182909643176845321021209137548742937430940258997221937352498631551209822079559591857076641561863821325180714184637516327495056825200929458796589533188382551310078527193764723189551017851538326522660734366263229681834096022505151628784267513086843047784002223603418978827233728149657480292961095596638702578233
e = 65537
c = 21332979626247382647148222928588089621511790656630926013612529289276199934646065751526142377438330548167579869346422391777913473113228287023801928140946948279096562923728186040013041739656216576467903409087827269164764659636977412246373447194249307513950780025367450729199178539765363446611686879821064068711525543800807969264271445173422813211738947698740537888866771159352960700295474589207758542367193701819811125602611901272496121027126921035697692984486226677539547135753720071134145590716156803665486826826046693205511230289946748601632769198172373201803516681379607412290191420859001274915183415061321376410345

p=gmpy2.gcd(n,c)
q=n//p
Phi=(p-1)*(q-1)
d=gmpy2.invert(e,Phi)
m=pow(c,d,n)//p
print(long_to_bytes(m))

[SWPUCTF 2023 秋季新生赛]dpdpdpdp

将已知信息放入轩禹CTF_RSA工具中,dp先放入Private(D)中,在模式中选取仅dp泄露得到Prime(P,Q),在常规中计算Euler(φN),然后右键选取计算私钥D,然后计算明文,转为字符

![](https://a1ic3-blog.oss-cn-hangzhou.aliyuncs.com/img/屏幕截图 2024-08-09 134958.png)

[NUSTCTF 2022 新生赛]ezRSA

简单分析可知,p和q差距太大了,所以N~1~/N~2~接近q~1~/q~2~,考虑用连分数逼近N~1~/N~2~,得到q~1~和q~2~

尝试对N~1~/N~2~ 进行连分数展开并求其各项渐进分数,记为 t~i~/s~i~ 并验证 N~1~%t~k~==0 是否成立,如果成立,那么 q~1~=t~k~,q~2~=s~k~。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
from Crypto.Util.number import *
from sympy import *
from gmpy2 import *


N1 = 3289746385054724131365721020639496300945479666755005407239362220435929471663971559131973068094267242759747682915202602265269024546168034070348080432976135403371083936361236868186476392365554734516698695915807318328547349333450125215426536032220967810893464208090339137598724593917266763998037725309967496052803477931961681761135080900299333158097292389350335121611775110493009954911832572636099153354952171029044016319029661601727739828271424563980850243898202779669776639104067478441675153857040164775196713586656673764171877161326751846236980454659960530174960321852298270258312146241360929350418220172331956030775384681767932014061291168620965347842124549316096247113770711834360498936747471888481237404034471246978342020816271785925362208839937490625070051801028223342083281773366267363149243726101075926327550718757413133631119649782144511080448476370411156544146278468602957599519708203511203435394861053372096309444985117323976240925612725880016576029876493825989064619463226166401883310383733295274652092903872304933657343307118616812213637906513530016004460475073291823916649597185291734261926576108675712303422832460766980003743958182130150811173621769221262799069912858162405156365709344847558244669016188305691537672753134766406649385330682157984720023661279153645005631349488537261911860571171672813544726579872640486753312665928030263533489558821140031095492111373847722540582741061909831250761476687
N2 = 2292263744571677490370198515319050673022350367021940229132415885393214523108231545410288799524823682686607005535541881885794949322622162858593875970155712564868530006799557973311000615581843236548539733075504282834631939435260232339940338468890310925405870533590386398071667718507612723307978025099102004513584485422609923041107028535400446355591432930994813185411831860201820145983435091523773691560011687528125877698679841462745728326159525372061320952493949821495222248383893254880735838359120880431072244214361010867779059178282739912365087421904643477215607290679708352033106358356290644004853543174075195107627794359272018100648168661860452919746052205404895413998960327066611970768862624073581670828267510841602161728589913841163473811894218339948715205301321356774629578043062238684103507006315521103670400509643518854842374093509082331379305822049420033746124157212615698602544129110388591266923967512746018551734391176602223771675279723873630468099034521371667295520830509224068753383327420799595674898227670628881521095495898465890256628288779785408613688721508315026743250146090703141554141208186588758560579281631449476819201739513661261100456398775274335050320480934180632543242116316388750179657345282978014879818574111951053767465935985181195234991374892341383106554664200986728169474150302232887629401491764905429656980077385228539526682528035467486946883267941678859904770170914569949948781798383
c1 = 758346536265430423952822486066685295768780904671958564513706915003627653309986327906604310025557676880130150973194443591153899441660221125085406078577489990064034099758898680250346992154199616929381594288918352701155172644054184374384778201304104144436102359709180739955762513436889301607686277088230852661148556440251553059814853050711377102806879036793210874472411397851504602916797481132018776755416068149801594219844674499351889997208649442043923826505239289470153001663639688739092310857881616013610569511757767780350165048282465256454770748877584119349207769812826840607665168961680724232789109312681055375411182858820698025923104994832566402422884359019460479145829812817446509615552819113705033128233093081687704471007797878802184788802106948491309583791881593217988561342681568377126606055476508381741342859362339824940846336741346126512500348868154174463810299929429409815515908136711497765026252563374327541491024303290989175383501994515761077240391195396083766760326143468930305986070405962303571534654392917816088220966950447926277802817335097304148972911332832248113849846752219065263639980629213197260594242031101803801865240157341309018859709063723920616432168289755151080828619642932516426139982777613526680161145782566883722320235485389839997229666979487071672091138823743231576011381309205283462045931376953038071401274899229258796970036565931730655471667545203734032609058125128632555918726761
c2 = 2281163375114595112593683220870779643793045914138930809669934728297504812745368657964524831965320392164027435706363680996214578180045485041532876049868691323690200562004954003143194397255512951717400899604307009993030792644670830602941543918898535970779253703220162651022293286208338299826844988619345629892007235258389532666376623514170628541968337364745860334903754371727427376399211310359996960626733244649671665175464666807399652951289553389561033148215888827057495743582318390507639029065358587166019110069479019692411629179363742708597061223484237748437654542910240974030049076975739481960903748359283570086571360417832776823264202688497555419017227144724790205424467059280453940666789219388347170532415234759731375390229140544207931837445265744016932142504371200121886182154284965893665022781184321216382767703694597553489507371271887593799060901908513758134472760311502510753557029741715193386673389466599068008750012915225818076301655694045130332321314233483042503950958442501013310465239137942770667655164906193219286435485452257047415797293472629254376873962168035382262951696816840667369861437088409243033239980128747965838367176274122593955221422537124546203553941387134587884149412499272660959871746858550851448840531698152805786123875121854564754397297726121984646669253047201515221545545683432754661774694401343486893270795112334494874407955432598253951220055000392855162417030953645428808146502304
e = 65537

def transform(x,y): #使用辗转相除将分数x/y转为连分数的形式
res=[]
while y:
res.append(x//y)
x,y=y,x%y
return res

def continued_fraction(sub_res):
numerator,denominator=1,0
for i in sub_res[::-1]: #从sublist的后面往前循环
denominator,numerator=numerator,i*numerator+denominator
return denominator,numerator #得到渐进分数的分母和分子,并返回

#求解每个渐进分数
def sub_fraction(x,y):
res=transform(x,y)
res=list(map(continued_fraction,(res[0:i] for i in range(1,len(res))))) #将连分数的结果逐一截取以求渐进分数
return res

def wienerAttack(n1,n2):
for (q2,q1) in sub_fraction(n1,n2): #用一个for循环来注意试探n1/n2的连续函数的渐进分数,直到找到一个满足条件的渐进分数
if q1==0: #可能会出现连分数的第一个为0的情况,排除
continue
if n1%q1==0 and q1!=1: #成立条件
return (q1,q2)
print("该方法不适用")

q1,q2 = wienerAttack(N1,N2)
p1 = gmpy2.iroot(N1//q1,2)[0]
p2 = gmpy2.iroot(N1//q2,2)[0]
d1 = gmpy2.invert(e,p1*(p1-1)*(q1-1))
d2 = gmpy2.invert(e,p2*(p2-1)*(q2-1))
m1 = pow(c1,d1,N1)
m2 = pow(c2,d2,N2)
print(long_to_bytes(m1),end='')
print(long_to_bytes(m2))


[SWPUCTF 2023 秋季新生赛]polynomial

主要是利用sympy库解多项式方程

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
from Crypto.Util.number import *
from sympy import *
from gmpy2 import *


p = 158805288384650271811274620112885426807134870587281058486409657841571541118874370262125616758392586636436387032461169543181918821693975663497124408432536495676514953509756505781488235396628730376794651046582155886825258656047349260441547239700695773934518441411466809921946609164932234396841476405798428700843
a = 6782997653971692606019358747667066963688636909392719204001155907616272998599567932030340899158310591583056298423803386927289244122405887173827359025095219
b = 7373784501270128110088353737302182289453185058537147667058852830178883492374394182313086562761123093282613985656842374554466162992585768060168515936322837
c = 12604317328077074383094898759023155531982085126299017370476099122695860476733267706510100804874716354025394150676456477445303955715981977583036765619931291
d = 8651550199315105291497863570314512750737000678752642987669418859342691686702373116147125246177399639155277789016646392989483699799276013474039473014389069
e = 6819653219987864110332165353640553980353581969662542365282269257622467162685937603557862048653003559950780009596692439320585574228684924030626160305559221
y = 187626421635118933741196210961559541641107643327742932086152135660947241144749750951157691964883138108211067837818748515766812840026814947057023367814232867155997328882540000727585104081833734697954005690818776434169815240704563337
h = 36198427687223295973782557044383345640934859884880641150183916728479006412929786917944908958646498915497129126843345300628359

x = symbols('x') #定义变量x

equation = Eq(a*x**4 + b*x**3 + c*x**2 + d*x + e, y) #构造方程

solution = solve(equation, x) #解方程

for i in solution: #打印可能的x的值
print(i)

x = 12896387745855437651
m = h//x
print(long_to_bytes(m))


[SWPUCTF 2022 新生赛]DisceteDiscrete!

  • 附件中可见的并非RSA加密,因为c=x^m mod n,明文m在指数位置,且同时还存在模运算,

  • 为了求得m,则会进行基于同余运算和原根的一种对数运算,也就是**离散对数**

本题很简单,只需直接利用sage中的内置函数discrete_log()即可

1
2
3
4
5
6
7
n = 13407807929942597099574024998205846127479365820592393377723561443721764030073546976801874298166903427690031858186486050853753882811946569946433649006084096
x = 9795065994886226384204904966849239623474055462495495755216573935495433269421238891934740481621010281153676351284936882958509364458306524174275663183354347
c = 12124630419477800996787439916074125902945359931344392715324003381817849996550355767138542576383623513820157574593640624060741986552381770011023574637567067

m = discrete_log(c,mod(x,n))
print(m)
# print(long_to_bytes(m))

[HGAME 2022 week2]RSA Attack2:

task1 : 公像素数,task2:直接开根,task3:共模攻击

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
from Crypto.Util.number import *
from gmpy2 import *

# task1
e = 65537
n1 = 14611545605107950827581005165327694782823188603151768169731431418361306231114985037775917461433925308054396970809690804073985835376464629860609710292181368600618626590498491850404503443414241455487304448344892337877422465715709154238653505141605904184985311873763495761345722155289457889686019746663293720106874227323699288277794292208957172446523420596391114891559537811029473150123641624108103676516754449492805126642552751278309634846777636042114135990516245907517377320190091400729277307636724890592155256437996566160995456743018225013851937593886086129131351582958811003596445806061492952513851932238563627194553
c1 = 965075803554932988664271816439183802328812013694203741320763105376036912584995031647672348468111310423680858101990670067065306237596121664884353679987689532305437801346923070145524106271337770666947677115752724993307387122132705797012726237073550669419110046308257408484535063515678066777681017211510981429273346928022971149411064556225001287399141306136081722471075032423079692908380267160214143720516748000734987068685104675254411687005690312116824966036851568223828884335112144637268090397158532937141122654075952730052331573980701136378212002956719295192733955673315234274064519957670199895100508623561838510479
n2 = 20937478725109983803079185450449616567464596961348727453817249035110047585580142823551289577145958127121586792878509386085178452171112455890429474457797219202827030884262273061334752493496797935346631509806685589179618367453992749753318273834113016237120686880514110415113673431170488958730203963489455418967544128619234394915820392908422974075932751838012185542968842691824203206517795693893863945100661940988455695923511777306566419373394091907349431686646485516325575494902682337518438042711296437513221448397034813099279203955535025939120139680604495486980765910892438284945450733375156933863150808369796830892363
c2 = 11536506945313747180442473461658912307154460869003392732178457643224057969838224601059836860883718459986003106970375778443725748607085620938787714081321315817144414115589952237492448483438910378865359239575169326116668030463275817609827626048962304593324479546453471881099976644410889657248346038986836461779780183411686260756776711720577053319504691373550107525296560936467435283812493396486678178020292433365898032597027338876045182743492831814175673834198345337514065596396477709839868387265840430322983945906464646824470437783271607499089791869398590557314713094674208261761299894705772513440948139429011425948090

q = GCD(n1,n2)
p = n1//q
Phi = (p-1)*(q-1)
d = invert(e,Phi)
m = pow(c1,d,n1)
print(long_to_bytes(m))


# task2
e = 7
n = 14157878492255346300993349653813018105991884577529909522555551468374307942096214964604172734381913051273745228293930832314483466922529240958994897697475939867025561348042725919663546949015024693952641936481841552751484604123097148071800416608762258562797116583678332832015617217745966495992049762530373531163821979627361200921544223578170718741348242012164115593777700903954409103110092921578821048933346893212805071682235575813724113978341592885957767377587492202740185970828629767501662195356276862585025913615910839679860669917255271734413865211340126544199760628445054131661484184876679626946360753009512634349537
c = 10262871020519116406312674685238364023536657841034751572844570983750295909492149101500869806418603732181350082576447594766587572350246675445508931577670158295558641219582729345581697448231116318080456112516700717984731655900726388185866905989088504004805024490513718243036445638662260558477697146032055765285263446084259814560197549018044099935158351931885157616527235283229066145390964094929007056946332051364474528453970904251050605631514869007890625

m = iroot(c,e)[0]
print(long_to_bytes(m))

# task3
n = 18819509188106230363444813350468162056164434642729404632983082518225388069544777374544142317612858448345344137372222988033366528086236635213756227816610865045924357232188768913642158448603346330462535696121739622702200540344105464126695432011739181531217582949804939555720700457350512898322376591813135311921904580338340203569582681889243452495363849558955947124975293736509426400460083981078846138740050634906824438689712748324336878791622676974341814691041262280604277357889892211717124319329666052810029131172229930723477981468761369516771720250571713027972064974999802168017946274736383148001865929719248159075729
e1 = 2519901323
c1 = 3230779726225544872531441169009307072073754578761888387983403206364548451496736513905460381907928107310030086346589351105809028599650303539607581407627819797944337398601400510560992462455048451326593993595089800150342999021874734748066692962362650540036002073748766509347649818139304363914083879918929873577706323599628031618641793074018304521243460487551364823299685052518852685706687800209505277426869140051056996242882132616256695188870782634310362973153766698286258946896866396670872451803114280846709572779780558482223393759475999103607704510618332253710503857561025613632592682931552228150171423846203875344870
e2 = 3676335737
c2 = 940818595622279161439836719641707846790294650888799822335007385854166736459283129434769062995122371073636785371800857633841379139761091890426137981113087519934854663776695944489430385663011713917022574342380155718317794204988626116362865144125136624722782309455452257758808172415884403909840651554485364309237853885251876941477098008690389600544398998669635962495989736021020715396415375890720335697504837045188626103142204474942751410819466379437091569610294575687793060945525108986660851277475079994466474859114092643797418927645726430175928247476884879817034346652560116597965191204061051401916282814886688467861

gcd,r,s = gcdext(e1,e2)
m = pow(c1,r,n)*pow(c2,s,n)%n
print(long_to_bytes(m))

[HGAME 2022 week3]RSA attack 3:

连分数攻击

n和e的位数差不多

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#Sage
from Crypto.Util.number import*
from gmpy2 import *
from tqdm import*

n = ...
e = ...
c = ...

cf = continued_fraction(Integer(e)/Integer(n))
for i in tqdm(range(len(cf))):
d = cf.denominator(i)
k = cf.numerator(i)
if d.bit_length() == 64 and isPrime(d):
print(d)

d = 13094612077654083919
m = pow(c,d,n)
print(long_to_bytes(m))

[黑盾杯 2020]Factor:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#yafu分解得到三个质因数
from Crypto.Util.number import *
from gmpy2 import *

n = 3454083680130687060405946528826790951695785465926614724373
e = 3
c = 1347530713288996422676156069761604101177635382955634367208

p = 17100682436035561357
q = 11761833764528579549
r = 17172929050033177661
#但发现无法求逆元,应该是Phi有因子跟e不互素
n = 1
Phi = 1
for i in [p,q,r]:
if GCD(e,i-1) == 1:
n *= i
Phi *= i-1
d = invert(e,Phi)
m = pow(c,d,n)
print(long_to_bytes(m))

[FSCTF 2023]兔帽的奇妙冒险:

base64解密的结果加一个U2FsdGVkX18(rabbit 头)后rabbit解密

[LitCTF 2023]Euler:

c = pow(m,n-p-q+3,n) 其中, n=p * q, n-p-q+3=(p-1)*(q-1)+2

故有: **c = m^( (p-1)*(q-1)+2 )%n **

根据欧拉定理,m^( (p-1)*(q-1) ) = m^phi = 1%n 故有: c = m^2%n 因此,可以直接对c进行开方,爆破求解得到m。

1
2
3
4
5
6
7
8
9
10
11
from Crypto.Util.number import *
from gmpy2 import iroot
n = 115140122725890943990475192890188343698762004010330526468754961357872096040956340092062274481843042907652320664917728267982409212988849109825729150839069369465433531269728824368749655421846730162477193420534803525810831025762500375845466064264837531992986534097821734242082950392892529951104643690838773406549
c = 406480424882876909664869928877322864482740577681292497936198951316587691545267772748204383995815523935005725558478033908575228532559165174398668885819826720515607326399097899572022020453298441
for i in range(65537):
c1 = c+i*n
m,f = iroot(c1,2)
if f:
print(i)
print(long_to_bytes(m).decode())
exit()

[LitCTF 2023]e的学问:

e和phi不互素数,所以要先约去公约数t

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
from Crypto.Util.number import *
import gmpy2

e = 74
p = 86053582917386343422567174764040471033234388106968488834872953625339458483149
q = 72031998384560188060716696553519973198388628004850270102102972862328770104493
c = 3939634105073614197573473825268995321781553470182462454724181094897309933627076266632153551522332244941496491385911139566998817961371516587764621395810123
n = p*q

def decrypt(p,q,e,c):
n = p*q
phi = (p-1)*(q-1)
t = GCD(e,phi)
d = gmpy2.invert(e//t,phi)
m = pow(c,d,n)
msg = gmpy2.iroot(m,t) #由于约去了公约数t,此处要进一步处理
if msg[1] == 1:
print(long_to_bytes(msg[0]))


decrypt(p,q,e,c)

[LitCTF 2023]Virginia:

两段不同密钥的维吉尼亚,但密钥未知,利用Vigenere Solver爆破

image-20240901093439447

但发现最后还有一段是乱码,再次爆破image-20240901093529276

My password is not a regular Caesar password,and the enc flag=[86, 116, 128, 80, 98, 85, 139, 122, 134, 114, 125, 136, 117, 123, 129, 127, 128, 128, 142, 130, 140, 147, 127, 132, 131, 136, 151, 134, 152, 164] -Caesar

参考ASCII码表:

image-20240901094025392

根据比赛的flag头为LitCTF

发现第一个字符偏移为10,第二个为11,第三个为12……属于变异凯撒

1
2
3
4
5
enc=[86, 116, 128, 80, 98, 85, 139, 122, 134, 114, 125, 136, 117, 123, 129, 127, 128, 128, 142, 130, 140, 147, 127, 132, 131, 136, 151, 134, 152, 164]
b = ''
for i in range(len(enc)):
b+=chr(enc[i]-10-i)
print(b)

[LitCTF 2023]The same common divisor (高级):

n3 = n1 ^ n2 ,则 n2= n3 ^ n1

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
from Crypto.Util.number import*
import gmpy2

n1= 9852079772293301283705208653824307027320071498525390578148444258198605733768947108049676831872672654449631852459503049139275329796717506126689710613873813880735666507857022786447784753088176997374711523987152412069255685005264853118880922539048290400078105858759506186417678959028622484823376958194324034590514104266608644398160457382895380141070373685334979803658172378382884352616985632157233900719194944197689860219335238499593658894630966428723660931647038577670614850305719449893199713589368780231046895222526070730152875112477675102652862254926169713030701937231206405968412044029177246460558028793385980934233
n3= 4940268030889181135441311597961813780480775970170156650560367030148383674257975796516865571557828263935532335958510269356443566533284856608454193676600884849913964971291145182724888816164723930966472329604608512023988191536173112847915884014445539739070437180314205284883149421228744714989392788108329929896637182055266508625177260492776962915873036873839946591259443753924970795669864031580632650140641456386202636466624658715315856453572441182758855085077441336516178544978457053552156714181607801760605521338788424464551796638531143900048375037218585999440622490119344971822707261432953755569507740550277088437182
c1= 7066425618980522033304943700150361912772559890076173881522840300333719222157667104461410726444725540513601550570478331917063911791020088865705346188662290524599499769112250751103647749860198318955619903728724860941709527724500004142950768744200491448875522031555564384426372047270359602780292587644737898593450148108629904854675417943165292922990980758572264063039172969633878015560735737699147707712154627358077477591293746136250207139049702201052305840453700782016480965369600667516646007546442708862429431724013679189842300429421340122052682391471347471758814138218632022564279296594279507382548264409296929401260
c2= 854668035897095127498890630660344701894030345838998465420605524714323454298819946231147930930739944351187708040037822108105697983018529921300277486094149269105712677374751164879455815185393395371001495146490416978221501351569800028842842393448555836910486037183218754013655794027528039329299851644787006463456162952383099752894635657833907958930587328480492546831654755627949756658554724024525108575961076341962292900510328611128404001877137799465932130220386963518903892403159969133882215092783063943679288192557384595152566356483424061922742307738886179947575613661171671781544283180451958232826666741028590085269
e = 65537

n2 = n1^n3
p = GCD(n1,n2)
q1 = n1//p
Phi = (p-1)*(q1-1)
d = gmpy2.invert(e,Phi)
m = pow(c1,d,n1)
print(long_to_bytes(m))

[LitCTF 2023]Where is P?:

CopperSmith攻击:p高位泄露

pbits=1024 , kbits=340,

P^3^的大小跟n很接近,可以通过爆破得出P,

然后就是常规的CopperSmith攻击

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
#Sage
from Crypto.Util.number import *
from gmpy2 import *


n= 24479907029118467064460793139240403258697681144532146836881997837526487637306591893357774423547391867013441147680031968367449693796015901951120514250935018725570026327610524687128709707340727799633444550317834481416507364804274266363478822257132586592232042108076935945436358397787891169163821061005102693505011197453089873909085170776511350713452580692963748763166981047023704528272230392479728897831538235554137129584665886878574314566549330671483636900134584707867654841021494106881794644469229030140144595938886437242375435914268001721437309283611088568191856208951867342004280893021653793820874747638264412653721
c= 6566517934961780069851397787369134601399136324586682773286046135297104713708615112015588908759927424841719937322574766875308296258325687730658550956691921018605724308665345526807393669538103819281108643141723589363068859617542807984954436567078438099854340705208503317269397632214274507740533638883597409138972287275965697689862321166613821995226000320597560745749780942467497435742492468670016480112957715214640939272457886646483560443432985954141177463448896521810457886108311082101521263110578485768091003174683555938678346359150123350656418123918738868598042533211541966786594006129134087145798672161268647536724
a= 22184346235325197613876257964606959796734210361241668065837491428527234174610482874427139453643569493268653377061231169173874401139203757698022691973395609028489121048788465356158531144787135876251872262389742175830840373281181905217510352227396545981674450409488394636498629147806808635157820030290630290808150235068140864601098322473572121965126109735529553247807211711005936042322910065304489093415276688746634951081501428768318098925390576594162098506572668709475140964400043947851427774550253257759990959997691631511262768785787474750441024242552456956598974533625095249106992723798354594261566983135394923063605
e= 65537

k = 0
while True:
P_3 = a+k*n
if iroot(P_3, 3)[1] == 1:
break
k += 1
P = iroot(P_3, 3)[0]

P = 66302204855869216148926460265779698576660998574555407124043768605865908069722142097621926304390549253688814246272903647124801382742681337653915017783954290069842646020090511605930590064443141710086879668946
p_high = P<<340
PR.<x> = PolynomialRing(Zmod(n))
f = p_high + x
p_low = f.small_roots(X = 2^340, beta = 0.4)[0]
print(p_low+p_high)

p = 148500014720728755901835170447203030242113125689825190413979909224639701026120883281188694701625473553602289432755479244507504340127322979884849883842306663453018960250560834067472479033116264539127330613635903666209920113813160301513820286874124210921593865507657148933555053341577090100101684021531775022459
q = n//p
phi = (p-1)*(q-1)
d = invert(e, phi)
print(long_to_bytes(pow(c, d, n)))

[LitCTF 2023]babyLCG:

LCG板子题:

image-20240916194856818

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
from Crypto.Util.number import *
from gmpy2 import *
from sympy import *

result = [699175025435513913222265085178805479192132631113784770123757454808149151697608216361550466652878, 193316257467202036043918706856603526262215679149886976392930192639917920593706895122296071643390, 1624937780477561769577140419364339298985292198464188802403816662221142156714021229977403603922943, 659236391930254891621938248429619132720452597526316230221895367798170380093631947248925278766506, 111407194162820942281872438978366964960570302720229611594374532025973998885554449685055172110829, 1415787594624585063605356859393351333923892058922987749824214311091742328340293435914830175796909, 655057648553921580727111809001898496375489870757705297406250204329094679858718932270475755075698, 1683427135823894785654993254138434580152093609545092045940376086714124324274044014654085676620851, 492953986125248558013838257810313149490245209968714980288031443714890115686764222999717055064509, 70048773361068060773257074705619791938224397526269544533030294499007242937089146507674570192265]

t = []
for i in range(len(result)-1):
t.append(result[i]-result[i-1])

for i in range(len(result)-3):
p = GCD(t[i+1]*t[i-1]-t[i]**2, t[i-2]*t[i]-t[i-1]**2)
try:
a = invert(t[-2]-t[-3],p)*(t[-1]-t[-2]) % p
b = (result[-1]-a*result[-2]) % p
seed = (result[0]-b)*invert(a,p) % p
print(long_to_bytes(seed))
except:
continue

[AFCTF 2018]Single:

quipquip一把梭

[柏鹭杯 2021]试试大数据分解?:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
from xenny.ctf.crypto.modern.asymmetric.rsa.factor import attack
from base64 import b64decode
from Crypto.Util.number import *
import gmpy2
from Crypto.PublicKey.RSA import importKey

rsa = importKey(open('public.pem', 'rb').read())

p, q = attack(rsa.n)
assert p*q == rsa.n
d = gmpy2.invert(rsa.e, (p-1)*(q-1))
enc1 = b64decode(open('flag.enc1', 'rb').read())
m1 = long_to_bytes(pow(bytes_to_long(enc1), d, rsa.n))
enc2 = b64decode(open('flag.enc2', 'rb').read())
m2 = long_to_bytes(pow(bytes_to_long(enc2), d, rsa.n))
enc3 = b64decode(open('flag.enc3', 'rb').read())
m3 = long_to_bytes(pow(bytes_to_long(enc3), d, rsa.n))
enc4 = b64decode(open('flag.enc4', 'rb').read())
m4 = long_to_bytes(pow(bytes_to_long(enc4), d, rsa.n))
print(bytes.fromhex((m1[-22:]+m2[-22:]+m3[-22:]+m4[-20:]).decode()))

[红明谷CTF 2022]easy_ya:

coppersmith:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#Sage
from Crypto.Util.number import *
from gmpy2 import *

r = 7996728164495259362822258548434922741290100998149465194487628664864256950051236186227986990712837371289585870678059397413537714250530572338774305952904473
M = 4159518144549137412048572485195536187606187833861349516326031843059872501654790226936115271091120509781872925030241137272462161485445491493686121954785558
n = 131552964273731742744001439326470035414270864348139594004117959631286500198956302913377947920677525319260242121507196043323292374736595943942956194902814842206268870941485429339132421676367167621812260482624743821671183297023718573293452354284932348802548838847981916748951828826237112194142035380559020560287
e = 3
c = 46794664006708417132147941918719938365671485176293172014575392203162005813544444720181151046818648417346292288656741056411780813044749520725718927535262618317679844671500204720286218754536643881483749892207516758305694529993542296670281548111692443639662220578293714396224325591697834572209746048616144307282

c2 = powmod(M,3,n)
a = int((c-c2)*invert(r,n)%n)
PR.<x> = PolynomialRing(Zmod(n))
f = (M+x*r)^e -c
f = f.monic()
roots = f.small_roots()

m = M+roots[0]*r
print(long_to_bytes(int(m)))

[HITCTF 2021]Baby ECC:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#Sage
N = 2**256-2**32-2**9-2**8-2**7-2**6-2**4-1
E = EllipticCurve(GF(N), [0, 7])
xG = 0x79be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798
yG = 0x483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b8
G = (xG,yG)
cipher0 = (76950424233905085841024245566087362444302867365333079406072251240614685819574 , 85411751544372518735487392020328074286181156955764536032224435533596344295845)
cipher1 = (42965775717446397624794967106656352716523975639425128723916600655527177888618 , 32441185377964242317381212165164045554672930373070033784896067179784273837186)
cipher2 = (26540437977825986616280918476305280126789402372613847626897144336866973077426 , 1098483412130402123611878473773066229139054475941277138170271010492372383833)

c0 = E([cipher0[0],cipher0[1]])
c1 = E([cipher1[0],cipher1[1]])
c2 = E([cipher2[0],cipher2[1]])
c = E([xG,yG])
secret0 = c.discrete_log(c0)
secret1 = c.discrete_log(c1)
secret2 = c.discrete_log(c2)
n = [secret0,secret1,secret2]
flag = "NSSCTF{" + ''.join([hex(i)[2:] for i in n])+"}"
print(flag)

[鹤城杯 2021]BabyRSA:

coppersmith攻击:

题目给出了**p的高300位q的低265位**:

n = p~l~ * q~l~ (mod 2^265^)

pl = n*q~l~^-1^ (mod 2^265^)

==> q~l~ = q % (2^265^) = hint2

==> q~l~^-1^ = invert(hint2 , 2^265^)

则p的高300位和低265位之和为:

​ **pbar = p~h~ +p~l~ = (hint1<<724) + n * invert(hint2 , 2^265^) **

中间459位接下来通过coppersmith求解:

低265位为p~l~,由于直接构造 **f = pbar + x * 2^265^ **会导致无解

所以尝试相对于2^265^抬高2^6^ 以进行爆破(未知:459==>453)

因此,在coppersmith中,构造f的表达式中间项为x * 64 + 2^265^,

对应small_roots系数为 X = 2^453^

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
#Sage
from Crypto.Util.number import*
import gmpy2

hint1 = ...
hint2 = ...
n = ...
c = ...
e = 65537

mod = 1<<265
pl = n*gmpy2.invert(hint2, mod) % mod
pbar = (hint1<<724) + pl
PR.<x> = PolynomialRing(Zmod(n))

for i in range(64):
f = pbar + (x*mod*64) + (i<<265)
f = f.monic()
pp = f.small_roots(X = 2^453,beta = 0.4)
if pp:
break

p = int(pbar + (pp[0]<<271) + (i<<265))
q = n//p
Phi = (p-1)*(q-1)
d = gmpy2.invert(e, Phi)
m = pow(c, d, n)
print(long_to_bytes(m))

[广东强网杯 2021 团队组]RSA and BASE?:

e很大,跟n接近,先用wiener攻击得到base32加密后的结果

注意到此处的BASE都是不重复的,猜测是换表base32加密,但有四位未知,爆破

注意:加密字符表单的作用只是根据下标来映射而已,所以我们一一对应用题目新的表单来对应原生的base32加密下标。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
from Crypto.Util.number import *
from gmpy2 import *
from sympy import *
from RSAwienerHacker import *
import base64

n=56661243519426563299920058134092862370737397949947210394843021856477420959615132553610830104961645574615005956183703191006421508461009698780382360943562001485153455401650697532951591191737164547520951628336941289873198979641173541232117518791706826699650307105202062429672725308809988269372149027026719779368169
e=36269788044703267426177340992826172140174404390577736281478891381612294207666891529019937732720246602062358244751177942289155662197410594434293004130952671354973700999803850153697545606312859272554835232089533366743867361181786472126124169787094837977468259794816050397735724313560434944684790818009385459207329
c=137954301101369152742229874240507191901061563449586247819350394387527789763579249250710679911626270895090455502283455665178389917777053863730286065809459077858674885530015624798882224173066151402222862023045940035652321621761390317038440821354117827990307003831352154618952447402389360183594248381165728338233


d=hack_RSA(e,n)
flag=long_to_bytes(pow(c,d,n))
#print(flag)


base32 = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ234567' #传统表单
flag = 'TCMDIEOH2MJFBLKHT2J7BLYZ2WUE5NYR2HNG'#先去除'='
secret = ''
list = ['2','T','Z','Y']
tryr = []
for i in list:
for j in list:
if i!=j:
for k in list:
if k!=i and k!=j:
for l in list:
if l!=i and l!=j and l!=k:
tryr.append(i+j+k+l)
print(tryr)
for i in tryr:
cipherlist='GHI45FQRSCX'+i+'UVWJK67DELMNOPAB3'
print(cipherlist)
for m in flag:
g = cipherlist.index(m)
secret += base32[g]
secret += '===='
print(base64.b32decode(secret))
secret = ''


[安洵杯 2020]easyaes:

首先根据len(key) == 16可以知道key是128位的,而len(hint) == 32,所以在异或过程中会有一半的hint没有被异或,

而且根据hint = os.urandom(4)*8 则hint是4字节重复的,

==》通过hint ^ key可以泄露出key

aes = AES.new(key,AES.MODE_CBC,iv)

解释一下:

  • AES.new()创建一个新的AES实例
  • key是加解密过程中的密钥,应是一个字节数组,长度取决于所选的AES密钥长度
  • AES.MODE_CBC表示使用CBC模式,为一种加密迭代过程
  • iv为初始化向量,在CBC模式下用于加密第一个数据块

测试得到len(msg) == 64 ,根据key我们要每16个字节分一组,然后反转让低字节的放在前面

CBC模式下,每次的明文会先和前一个密文异或然后在根据密钥加密,所以解密过程也是一样,

每次密文要先和前一个得到的明文异或然后在根据密钥解密,而跟第一个密文异或的就是初始化向量,也就是我们的flag

在解密时我们采用最简单的一对一的ECB模式

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
from Crypto.Util.number import long_to_bytes
import binascii, sys
from Crypto.Util.strxor import strxor
from Crypto.Cipher import AES

# -----------get key---------
tmp = 56631233292325412205528754798133970783633216936302049893130220461139160682777
hint = int(str(hex(tmp))[2:10] * 8,16)
key = long_to_bytes(tmp ^ hint)

# ----------get iv-----------
msg = b'Welcome to this competition, I hope you can have fun today!!!!!!'
msgs = [msg[ii:(ii+16)] for ii in range(0,len(msg),16)]
msgs.reverse()
IV = binascii.unhexlify('3c976c92aff4095a23e885b195077b66')

def decrypto(key,IV,ms):
aes=AES.new(key,AES.MODE_ECB)
return strxor(aes.decrypt(IV),ms)

for ms in msgs:
IV=decrypto(key,IV,ms)
print(b'd0g3{' + IV+ b'}')

[HDCTF 2023]Math_Rsa:

解法一:

利用a = pow(p,2,r),Sagemath已知a,r ==> p

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#Sage
from Crypto.Util.number import*
import gmpy2

n = ...
r = ...
a = ...
c = ...
e = 65537

PR.<p> = PolynomialRing(Zmod(r))
f = (p^2) - a
ans = f.roots()
print(ans)

for i in ans:
if isPrime(int(n//i)):
p = i
q = n//i
break
Phi = (p-1)*(q-1)
d = gmpy2.invert(e, Phi)
m = pow(c, d, n)
print(long_to_bytes(m))

其中,PR.<p> = PolynomialRing(Zmod(r))

  1. Zmod(r):指定模,定义界限为r的环;Z表示整数;Zmod代表这是一个整数域中的r模环
  2. ZZ:整数环;QQ:有理数环;RR:实数环;CC:复数环
  3. PR:只是一个指针,指向PolynomialRing指定的那个环(可以使用任意字符)
  4. PolynomialRing:这个是说建立多项式环
  5. <p>: 指定一个变量,可以是任意字符
  6. f = (p^2) - a 则是定义一个函数f
  7. ans = f.roots()是求解f中所有满足函数的自变量

解法二:

根据a = pow(p,2,r)可知a是模r的二次剩余,且提示了r%4==3

image-20240902162642631

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
import gmpy2
from Crypto.Util.number import *

n = ...
r = ...
a = ...
c = ...

p = gmpy2.powmod(a, (r+1)//4, r)
print(p)
q = n//p

d = gmpy2.invert(65537,(p-1)*(q-1))
m = gmpy2.powmod(c,d,n)
print(long_to_bytes(m))

羊城杯 2021:

[羊城杯 2021]Bigrsa:

发现n1和n2共享素数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
from Crypto.Util.number import *
import gmpy2

n1 = ...
n2 = ...
e = ...
c = ...

gcd = GCD(n1, n2)
p = gcd
q1 = n1//gcd
q2 = n2//gcd

Phi1 = (p-1)*(q1-1)
Phi2 = (p-1)*(q2-1)

d1 = gmpy2.invert(e, Phi1)
d2 = gmpy2.invert(e, Phi2)

c1 = pow(c, d2, n2)
m = pow(c1, d1, n1)

print(long_to_bytes(m))

[羊城杯 2021]Easy_Rsa:

Common Prime RSA ,攻击方式是一种修改的phllard_rho

参考论文:

image-20240901173134716
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
from Crypto.Util.number import *
import gmpy2

n = ...
e = ...
c = ...

f = lambda x,n: (pow(x,n-1,n) + 3) % n

def phllard_rho(n):
while True:
a = getRandomRange(2, n)
b = f(a, n)
while True:
p = GCD(abs(a-b),n)
if p == n:
break
elif p > 1:
return (p,n//p)
else:
a = f(a, n)
b = f(f(b, n), n)

p,q = phllard_rho(n)
phi = (p-1)*(q-1)
d = gmpy2.invert(e, phi)
m = pow(c,d,n)
print(long_to_bytes(m))

LitCTF 2024:

[LitCTF 2024]small_e:

小明文爆破

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
from Crypto.Util.number import *
from gmpy2 import *

n = 19041138093915757361446596917618836424321232810490087445558083446664894622882726613154205435993358657711781275735559409274819618824173042980556986038895407758062549819608054613307399838408867855623647751322414190174111523595370113664729594420259754806834656490417292174994337683676504327493103018506242963063671315605427867054873507720342850038307517016687659435974562024973531717274759193577450556292821410388268243304996720337394829726453680432751092955575512372582624694709289019402908986429709116441544332327738968785428501665254894444651547623008530708343210644814773933974042816703834571427534684321229977525229
c_list = [438976, 1157625, 1560896, 300763, 592704, 343000, 1860867, 1771561, 1367631, 1601613, 857375, 1225043, 1331000, 1367631, 1685159, 857375, 1295029, 857375, 1030301, 1442897, 1601613, 140608, 1259712, 857375, 970299, 1601613, 941192, 132651, 857375, 1481544, 1367631, 1367631, 1560896, 857375, 110592, 1061208, 857375, 1331000, 1953125]
e = 3

def deco(c,e,n):
k=0
while True:
m=c+n*k
result,flag=gmpy2.iroot(m,e)
if flag:
return result
k+=1
flagg = b''
for c in c_list:
flagg += long_to_bytes(deco(c,e,n))

print(flagg)

[LitCTF 2024]common_primes_plus:

已知条件:

  • hint1 = a * n1+b * n2hint2 = c * n1 + d * n2

  • 已知 hint1,hint2,c,n1,且abcd均为素数

  • ==> 可知 p = gcd(hint1,hint2) = gcd(n,hint1) = gcd(n,hint2)

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    from Crypto.Util.number import *
    from gmpy2 import *

    n1 = 72619153900682160072296441595808393095979917106156741746523649725579328293061366133340736822282117284050717527134297532031234706715551253283030119063143935874516054785948327252045453986903379262257406260016876625891582923191913450785482873961282498295762698500898694660964018533698142756095427829906473038053
    hint1 = 115150932086321440397498980975794957800400136337062771258224890596200580556053305338941267789684878816176014493153795643655219028833232337281425177163963414534998897852644398384446019097451620742463880027107068960452304016955877225140421899265978792650445328111566277376529454404089066088845864500514742797060500618255170627
    hint2 = 166820160267525807953634213157298160399912450930658918773153592459310847514047652216110562360456335336533080444219104489314586122760398361430693763814336759476811490524054588094610387417965626546375189720748660483054863693527537614055954695966458622029711055735399842018236940424665041143785192280089418185085532002136215976
    c = 28378912671104261862184597375842174085651209464660064937481961814538145807266472966765374317717522401362019901110151858589886717440587644003368826809403188935808872400614919296641885383025657934630410406898092262104442977722339379234085663757182028529198392480656965957860644395092769333414671609962801212632
    e = 65537

    p = gcd(hint1, hint2)
    q = n1//p
    phi = (p-1)*(q-1)
    d = invert(e, phi)
    m = pow(c, d, n1)
    print(long_to_bytes(m))


[LitCTF 2024]common_primes:

p = gcd(n1,n2)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
from Crypto.Util.number import *
from gmpy2 import *

n1 = 63306931765261881888912008095340470978772999620205174857271016152744820165330787864800482852578992473814976781143226630412780924144266471891939661312715157811674817013479316983665960087664430205713509995750877665395721635625035356901765881750073584848176491668327836527294900831898083545883834181689919776769
n2 = 73890412251808619164803968217212494551414786402702497903464017254263780569629065810640215252722102084753519255771619560056118922616964068426636691565703046691711267156442562144139650728482437040380743352597966331370286795249123105338283013032779352474246753386108510685224781299865560425114568893879804036573
c1 = 11273036722994861938281568979042367628277071611591846129102291159440871997302324919023708593105900105417528793646809809850626919594099479505740175853342947734943586940152981298688146019253712344529086852083823837309492466840942593843720630113494974454498664328412122979195932862028821524725158358036734514252
c2 = 42478690444030101869094906005321968598060849172551382502632480617775125215522908666432583017311390935937075283150967678500354031213909256982757457592610576392121713817693171520657833496635639026791597219755461854281419207606460025156812307819350960182028395013278964809309982264879773316952047848608898562420
e = 65537

p = gcd(n1, n2)
q = n1 // p
Phi = (p - 1) * (q - 1)
d = invert(e, Phi)
m = pow(c1, d, n1)
print(long_to_bytes(m))

[LitCTF 2024]真·EasyRSA:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
from Crypto.Util.number import *
from gmpy2 import *

c1= 78995097464505692833175221336110444691706720784642201874318792576886638370795877665241433503242322048462220941850261103929220636367258375223629313880314757819288233877871049903331061261182932603536690216472460424869498053787147893179733302705430645181983825884645791816106080546937178721898460776392249707560
c2= 3784701757181065428915597927276042180461070890549646164035543821266506371502690247347168340234933318004928718562990468281285421981157783991138077081303219
n = 111880903302112599361822243412777826052651261464069603671228695119729911614927471127031113870129416452329155262786735889603893196627646342615137280714187446627292465966881136599942375394018828846001863354234047074224843640145067337664994314496776439054625605421747689126816804916163793264559188427704647589521
e = 65537

p = gmpy2.iroot(n,4)[0]
Phi = p**4 - p**3
d = inverse(e,Phi)
m = pow(c1,d,n)
print(long_to_bytes(m))

x = 93492332457019255141294502555555489582661562346262162342211605562996217352449
print(is_prime(x))
print()

d = pow(0x10001,-1,x-1)
m = pow(c2,d,x)
print(bytes.fromhex(hex(m)[2:]))

[LitCTF 2024]small_e_plus:

先爆破出e,然后爆破flag

  • 此时如果采取小明文爆破的话,效率很低
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
from Crypto.Util.number import *
from gmpy2 import *
from string import printable

n = 26287684934288536371438030224508784042871268975402791015134838900290249602701092702492594931306572692868654436714501196060619149020850402317982203575250568283872182497606239389480186694649979877566740647822434500023605871516831662099415987589808614777313595453727243531121031390104059097782466650186291076316486240197369759537327997880644540629964227584070506981319936888159712058406052247256554081989035415864476278146328967410452695134756792942103209740186339835071828587981271027235499355298543650516643100665039796305276163706693873611519506528344413021878980171629732211592839945004800782325172828561339662590291
c_list = [2206795524649235905421691489826312664535869158473992241382107452229902627430789178221234450699214518235612692491501082306158268745610575202210170312762929300421312081998256557805289595256913161318967687803957784191522197708618872099119883772100567610799038030170491575261415069363292331223848994909959222662307903914818692008641789258455591462146141825906954662346647872459477376830019604449386735009274664469596162731339288162705222622464022019805917855614180415135305122287341306358535204977475464107550060171378721195970927993762052901722822033817371589592984818877687488499315074761849162622037910992107211284008, 5772355660578786193365289788142204471140300880779240030922539554921206850801450259027942229717816557629121843824901435845363716561820657469786680232585256790197665053482436914240306106895783671092825614792775018452789907242936725194811142759000550943111242261233418906869936542409260521957109457093880078265172230140113023756025958760162033801341277275818552619176398362323345440943751030254826411167403369778520042425875280132329006784704419423985932863729258308660619215866531848636409929423223281439774682034891288220844217705947244646337813999934326056219959633197870528867256797102445018262011480153115939973120, 1207753724090260852409848530096938494041869666191344850580616117902540004602216282128000198616910613629758228599152405146528856830526069167686468063404160733191610918533887137790198044549066176847699828584104335658872479915611835658770230456040566481519133420435691429577114944632254145293686212844875236028065213764327990843553209848826790721557229795796629116716323389485143635207391322758673224679570474982769025868784848121296090448593104527159728316178638031965733210974157123951201010132807247490252051791615388655934783546925682929869630639426022317978556708362738999927581494799492081969707506643799602026519, 23349127335265499093449067069020992112353295858939476460071138364566485897994252926437380788575729410533824920877221793075557803246884503318707565286465780619451837755333889863647223503631040527885884507188543322662521167319750343131600891690509665461069767205371629056201897374077580748284228605137071513643680112231720015635177198512671008206911131037246521082139072649111758853436401697265407050360284081221903913252963538698624243925508340434415847360772868692706825954252596535393923195017520961377182762938864807222401006410940590209478399415565644283710492027537832649211992078485373823473694670510027091811150, 10226019140134038624377317848115153109426202728030240919051914421470768415604166541259309040981729429302658204608838639560323294519400489855382683083386777345356043308705897287912341523315760693349431629528606884165134456829229982105748229536220053836967234793460400007088552230829556977946642054006994624346182400713981635617380105674142096166299590924644975504927529440869894823989816288037184537810548374154159131078285611810236360387224739364737369218239938401877019353452254541733135847328578198473654682547864026753170978019586975399474768379227943763421295905943744276512487256848753432567851910082922927470490, 23740354509167079065405461731971916754037420716194453557110579966491604804762436810357240604414289616234875179623546843181969909941655688193848922121025497722570206788206574369953117810580405098086613804927789389379000011120646581696237263731340862157598831413772589626428552355215317461446703978266643741459189148155110184955643416482312525932611502239696070143649593393180531208682271982848368078201739398938285094875058820959849311021066738043111703290623367049523633339597166603017770974672021851132978175318897057265294143015585933755643775222343716729295329665381969705644856166297065958733244549838186512052385, 449014525939717636067736015209424784219819246781576119976763479723069921555975991244061404426209241205491628463587064147168107292515973015167075933513053376730612977909688147192509972914228546673914859512456020534607548288441547681099206879988569397951304088877152364775649300942230940480095891405872756559515878791481146087187792174110744462062133353030045674834570611547897985227875674282106272664164460098105513231986703990634100117091825872525928884988567006942035220750862383326774903397508340077320163638705664083267751275414767422570459999305221215356075828860083175263731374754412655619766335149006888723996, 16724794744491727600425925395927244417134995504796613762545001848691858676855371900138882794396073589851705829977971925497098298081053830365847044742295241579270222074264270766160828536659842604404241318349399345391073018854800119637771843569778469196738774691245194283589151708822054754891860887285845079956055960799325451486703248118285066709862851457478898785928241590593187351807366412037409877885725182051826065860998104380663508501993855389845296242673609538795480745163836240239734138130049347272635936034792561725248889899428632572191869130319297765786132841511245497565771732921602763273993266122615935214603, 8335009241673468873253675068463589266426701056401774737990647304778993560605655347351631416630769577522424783603153098182609522990968188535194397812386924076809847791156568504352196579970447867606517135531565802449373639411293098029825159629692422202058452950834073234658264013415977347155192720165418683784735863643368164054960138519912292186928345518922656777075501616408802833213759105274620228201695472893761054437789976692657170111413189445894590722931833376629118468092175170858255694444972297979072766528207056455924414294930988285253186403605383727454401973318032223978796412991222953728595468797201373820622, 1717028738196915227260339129573501065417757436024070728399837662683474643676720266190852688571851260086024584528234004503770202991702828738603236485267929860326697228640681326889845794391744206929580676537615769150484083242039924741303807364343064097449659558370778499818290907827480001580408520014110979083082316647497828342236619136282585160822630608240519352654269080203964531142386474415714079196749108940162898716817139452352062000261548631825989143362746715121123292436275957550673873937398160148303975715603319819731258894296533494152025775404106195174909015831441339509280028585399046169513149752204461930349, 6253489839553538192995294139816446969824750751774728963617638345595670445770677500921617837218605680169746240573789832579137206230177143500699620111070145585461358354523003959756713830108697398762585026303196668650471722612722372863973566811324151291707208671745892059398682725808801715988328719567890446420981480784833951835550433358928430667547317456646990287369723084794020241264506154652275756123282486762023979426752588250225435784747977075518696454125522814567504866613306081720330538332436897331017796420408357014130003339073229042803329670944110125353218213811432346818713964878168764790792105206633440354005, 1207753724090260852409848530096938494041869666191344850580616117902540004602216282128000198616910613629758228599152405146528856830526069167686468063404160733191610918533887137790198044549066176847699828584104335658872479915611835658770230456040566481519133420435691429577114944632254145293686212844875236028065213764327990843553209848826790721557229795796629116716323389485143635207391322758673224679570474982769025868784848121296090448593104527159728316178638031965733210974157123951201010132807247490252051791615388655934783546925682929869630639426022317978556708362738999927581494799492081969707506643799602026519, 5772355660578786193365289788142204471140300880779240030922539554921206850801450259027942229717816557629121843824901435845363716561820657469786680232585256790197665053482436914240306106895783671092825614792775018452789907242936725194811142759000550943111242261233418906869936542409260521957109457093880078265172230140113023756025958760162033801341277275818552619176398362323345440943751030254826411167403369778520042425875280132329006784704419423985932863729258308660619215866531848636409929423223281439774682034891288220844217705947244646337813999934326056219959633197870528867256797102445018262011480153115939973120, 1717028738196915227260339129573501065417757436024070728399837662683474643676720266190852688571851260086024584528234004503770202991702828738603236485267929860326697228640681326889845794391744206929580676537615769150484083242039924741303807364343064097449659558370778499818290907827480001580408520014110979083082316647497828342236619136282585160822630608240519352654269080203964531142386474415714079196749108940162898716817139452352062000261548631825989143362746715121123292436275957550673873937398160148303975715603319819731258894296533494152025775404106195174909015831441339509280028585399046169513149752204461930349, 16954257214609715453949449319699339161494232855569310228933510507504171504126469206091874371244790265592761015613256403517471291015511338346765442554575984841436537843152588028133877350821930031082920487532579036233128796943768462075658517963544351576867080570835108123172127678561307490005618742426940555485915573421790050723171701483141269800431262504278004147886695150170337842904413809555649193394856219267444671017423976317095448634183238063104910602376968654113825856753568856181455666796555652402905808458114516561773417952991326953537750434218624122318995368477991659040481704212571743288062208854477599259233, 16724794744491727600425925395927244417134995504796613762545001848691858676855371900138882794396073589851705829977971925497098298081053830365847044742295241579270222074264270766160828536659842604404241318349399345391073018854800119637771843569778469196738774691245194283589151708822054754891860887285845079956055960799325451486703248118285066709862851457478898785928241590593187351807366412037409877885725182051826065860998104380663508501993855389845296242673609538795480745163836240239734138130049347272635936034792561725248889899428632572191869130319297765786132841511245497565771732921602763273993266122615935214603, 5185490165247175755074805103840625687511977590976733896967715184223982955725681935365096951517529730737911572507779959945930556296503873230438433692310842981978848881986205067999307067785730415524359447947414935770806603135319166013408164683315806218163318125978230966989985398051513033616788512784230934142137906332152151059584574222941527730647262944250765844919176013002939308197949589859844618414360065768222159786067710805154244111569645546199262226746460081578671653615283375596665960708242700241780342523448742861815380568359092813225600016747957517992666799497302478221946509254852979437130583539850985247422, 1748234508408435343229319253644625402817707176509451594647354284826288727338735967235360246609210161049023834307132290872525340273117113455850690260255921823613621383639409134488848519959372177408937889998552431530493839856756914185531673290249084408278489645057787655359507244021027375565961471003583528932265312366403288884176948556324167675395562225956088863571715251876674710333918813480215719798596428736037441464450389735436535142133977551778467378533427938402690627170065561491269748888688911598444983102702261665208037447965537895418969759387684448834920453303484908559802952752182953165141625674023904414158, 11012890581084315425095922547777050020962029248110211263311188736825161568336991045243917700829742195694068118244042803336244383422040087972310576680130493039066637029837297205028290343840934744140990838248421706520572790950203052596858612764294640351774272157943334862976359969574219205290501939867352064476895317015572786888474774760071718201404856802312145427767679849647981118814029138127523521157700904020659839293447586228220702194369342121785362851205183676546931393764208787501487430625010774845511515509394872334800320955439381971987176625826068199951062429360895302585774691509075464492623725384467268825285, 5976772453334984518311442738240004799220403662435440872185530863193424233037367952925902243175234771035939695813307154967530503941081645934538688267920825967077726208002575899575371222695901346361307413004351281869655229087644917183767240951265807406293078230174759543645470570834782744332808979716142354429389228605592485271438778026468985249730030159932637979600514791593524263931036554765213297195922837236962842381131840868115187459577702023810124989825582700575011520568245435377833934768593346195065831458857440454704013911127816011037625063876159283174160162690848395114549568308205531592017492613772445173774, 5185490165247175755074805103840625687511977590976733896967715184223982955725681935365096951517529730737911572507779959945930556296503873230438433692310842981978848881986205067999307067785730415524359447947414935770806603135319166013408164683315806218163318125978230966989985398051513033616788512784230934142137906332152151059584574222941527730647262944250765844919176013002939308197949589859844618414360065768222159786067710805154244111569645546199262226746460081578671653615283375596665960708242700241780342523448742861815380568359092813225600016747957517992666799497302478221946509254852979437130583539850985247422, 6452875340997852295275020218749378916760411126851936571996259386760459856313309845592392640856504175949234216794963908475913037761993360407125952607943943083700382006783091443756617877566422165299422992987336811474980284131306966940424642139162441283769172531199959298540627795873212152702317440453079566096174835647147665695679094943137671532124636863128457006714211465119286776747310503452130041649279123753848522079886216732719572247000481047269505214596261386534160935834909921155351371984109147724730932926711831690752003577272018655013647352055561080857579522667684581123594159788011149227192380455462896729962, 6253489839553538192995294139816446969824750751774728963617638345595670445770677500921617837218605680169746240573789832579137206230177143500699620111070145585461358354523003959756713830108697398762585026303196668650471722612722372863973566811324151291707208671745892059398682725808801715988328719567890446420981480784833951835550433358928430667547317456646990287369723084794020241264506154652275756123282486762023979426752588250225435784747977075518696454125522814567504866613306081720330538332436897331017796420408357014130003339073229042803329670944110125353218213811432346818713964878168764790792105206633440354005, 6253489839553538192995294139816446969824750751774728963617638345595670445770677500921617837218605680169746240573789832579137206230177143500699620111070145585461358354523003959756713830108697398762585026303196668650471722612722372863973566811324151291707208671745892059398682725808801715988328719567890446420981480784833951835550433358928430667547317456646990287369723084794020241264506154652275756123282486762023979426752588250225435784747977075518696454125522814567504866613306081720330538332436897331017796420408357014130003339073229042803329670944110125353218213811432346818713964878168764790792105206633440354005, 20897947836932076779964827384680266669444872541242595584853544810847660781809255811902379402727265984145972717558208216627868351476262475424181241317707734298108218231636329375895362429626917095073694210812814494087830535014117884013936787285440467171742761631884901929078488856204289738449061959822388725333274257861099169377435400465998662612618115681519773625182456433449001773543437767201553703283209697249003117284877232666946456539017194397166088957330100388776645543342462188483091150441369824235427061443229429025534194618806460187812446633057673388068141804189503074739767911838028579099128625845793341901127, 5185490165247175755074805103840625687511977590976733896967715184223982955725681935365096951517529730737911572507779959945930556296503873230438433692310842981978848881986205067999307067785730415524359447947414935770806603135319166013408164683315806218163318125978230966989985398051513033616788512784230934142137906332152151059584574222941527730647262944250765844919176013002939308197949589859844618414360065768222159786067710805154244111569645546199262226746460081578671653615283375596665960708242700241780342523448742861815380568359092813225600016747957517992666799497302478221946509254852979437130583539850985247422, 1207753724090260852409848530096938494041869666191344850580616117902540004602216282128000198616910613629758228599152405146528856830526069167686468063404160733191610918533887137790198044549066176847699828584104335658872479915611835658770230456040566481519133420435691429577114944632254145293686212844875236028065213764327990843553209848826790721557229795796629116716323389485143635207391322758673224679570474982769025868784848121296090448593104527159728316178638031965733210974157123951201010132807247490252051791615388655934783546925682929869630639426022317978556708362738999927581494799492081969707506643799602026519, 8335009241673468873253675068463589266426701056401774737990647304778993560605655347351631416630769577522424783603153098182609522990968188535194397812386924076809847791156568504352196579970447867606517135531565802449373639411293098029825159629692422202058452950834073234658264013415977347155192720165418683784735863643368164054960138519912292186928345518922656777075501616408802833213759105274620228201695472893761054437789976692657170111413189445894590722931833376629118468092175170858255694444972297979072766528207056455924414294930988285253186403605383727454401973318032223978796412991222953728595468797201373820622, 5185490165247175755074805103840625687511977590976733896967715184223982955725681935365096951517529730737911572507779959945930556296503873230438433692310842981978848881986205067999307067785730415524359447947414935770806603135319166013408164683315806218163318125978230966989985398051513033616788512784230934142137906332152151059584574222941527730647262944250765844919176013002939308197949589859844618414360065768222159786067710805154244111569645546199262226746460081578671653615283375596665960708242700241780342523448742861815380568359092813225600016747957517992666799497302478221946509254852979437130583539850985247422, 25920961707523393202281300218444176129734572566815781137488940145677301500180714145402663962373623882683655757546713176923316428191765157386415468883815905581966232659296756935108128028157735278704173240867754374892767863985119564774915890766313799183822643494869775607043330683224121234927784433937849569120283272329925062133702698267726766476110289877776286080853490841837897993369872640809289989540435112046742658888426704252633322563361442888492873827942589957261396606340845665522400646771232316872444568013520651608356878655632725425106340256031308528158877727958784150436116095788759918507442721063497464001672, 6253489839553538192995294139816446969824750751774728963617638345595670445770677500921617837218605680169746240573789832579137206230177143500699620111070145585461358354523003959756713830108697398762585026303196668650471722612722372863973566811324151291707208671745892059398682725808801715988328719567890446420981480784833951835550433358928430667547317456646990287369723084794020241264506154652275756123282486762023979426752588250225435784747977075518696454125522814567504866613306081720330538332436897331017796420408357014130003339073229042803329670944110125353218213811432346818713964878168764790792105206633440354005, 25663191423484921175412364224530127146643925340004154726702279647143356157592854508759921404410754752035271117262826349048515204905598320781277358442584209773238813165864338686191131303650343111109522647292342262318312191154828123703005048694144581658454332596649591143235675787721964930836353194643708891591880016775053451232129740204331045326847472524157097116402350309528683224670236144960836423799755065339099128269152330465141709080678776263364496603148723855163217962603724059472220503607467867433663538613289855157923304803789694579660594681244121347757234971567712156039920653800971260669403951884026752686998, 6253489839553538192995294139816446969824750751774728963617638345595670445770677500921617837218605680169746240573789832579137206230177143500699620111070145585461358354523003959756713830108697398762585026303196668650471722612722372863973566811324151291707208671745892059398682725808801715988328719567890446420981480784833951835550433358928430667547317456646990287369723084794020241264506154652275756123282486762023979426752588250225435784747977075518696454125522814567504866613306081720330538332436897331017796420408357014130003339073229042803329670944110125353218213811432346818713964878168764790792105206633440354005, 25920961707523393202281300218444176129734572566815781137488940145677301500180714145402663962373623882683655757546713176923316428191765157386415468883815905581966232659296756935108128028157735278704173240867754374892767863985119564774915890766313799183822643494869775607043330683224121234927784433937849569120283272329925062133702698267726766476110289877776286080853490841837897993369872640809289989540435112046742658888426704252633322563361442888492873827942589957261396606340845665522400646771232316872444568013520651608356878655632725425106340256031308528158877727958784150436116095788759918507442721063497464001672, 13263786466446190163016008769836220535269357696454674792666135258902640846903309780108315355392508130227345512883180524670260067683978830659316889987124447343297390324463103766540103214985414999778290407008190424180154779235834484101584174703692738403343419550940166812669376385233441159764013001794070232476009158915966454070958519878855933028785291151945528736387913371707135653596226023268592330842008453104190134667308270525900634583278545983101946869551676698088147890541479096323734726116488316329827416755818060204664181280485697259466218350842103872751987842240867163996948996727825810630964777385967911053901, 6253489839553538192995294139816446969824750751774728963617638345595670445770677500921617837218605680169746240573789832579137206230177143500699620111070145585461358354523003959756713830108697398762585026303196668650471722612722372863973566811324151291707208671745892059398682725808801715988328719567890446420981480784833951835550433358928430667547317456646990287369723084794020241264506154652275756123282486762023979426752588250225435784747977075518696454125522814567504866613306081720330538332436897331017796420408357014130003339073229042803329670944110125353218213811432346818713964878168764790792105206633440354005, 5185490165247175755074805103840625687511977590976733896967715184223982955725681935365096951517529730737911572507779959945930556296503873230438433692310842981978848881986205067999307067785730415524359447947414935770806603135319166013408164683315806218163318125978230966989985398051513033616788512784230934142137906332152151059584574222941527730647262944250765844919176013002939308197949589859844618414360065768222159786067710805154244111569645546199262226746460081578671653615283375596665960708242700241780342523448742861815380568359092813225600016747957517992666799497302478221946509254852979437130583539850985247422, 1748234508408435343229319253644625402817707176509451594647354284826288727338735967235360246609210161049023834307132290872525340273117113455850690260255921823613621383639409134488848519959372177408937889998552431530493839856756914185531673290249084408278489645057787655359507244021027375565961471003583528932265312366403288884176948556324167675395562225956088863571715251876674710333918813480215719798596428736037441464450389735436535142133977551778467378533427938402690627170065561491269748888688911598444983102702261665208037447965537895418969759387684448834920453303484908559802952752182953165141625674023904414158, 8335009241673468873253675068463589266426701056401774737990647304778993560605655347351631416630769577522424783603153098182609522990968188535194397812386924076809847791156568504352196579970447867606517135531565802449373639411293098029825159629692422202058452950834073234658264013415977347155192720165418683784735863643368164054960138519912292186928345518922656777075501616408802833213759105274620228201695472893761054437789976692657170111413189445894590722931833376629118468092175170858255694444972297979072766528207056455924414294930988285253186403605383727454401973318032223978796412991222953728595468797201373820622, 5976772453334984518311442738240004799220403662435440872185530863193424233037367952925902243175234771035939695813307154967530503941081645934538688267920825967077726208002575899575371222695901346361307413004351281869655229087644917183767240951265807406293078230174759543645470570834782744332808979716142354429389228605592485271438778026468985249730030159932637979600514791593524263931036554765213297195922837236962842381131840868115187459577702023810124989825582700575011520568245435377833934768593346195065831458857440454704013911127816011037625063876159283174160162690848395114549568308205531592017492613772445173774, 25920961707523393202281300218444176129734572566815781137488940145677301500180714145402663962373623882683655757546713176923316428191765157386415468883815905581966232659296756935108128028157735278704173240867754374892767863985119564774915890766313799183822643494869775607043330683224121234927784433937849569120283272329925062133702698267726766476110289877776286080853490841837897993369872640809289989540435112046742658888426704252633322563361442888492873827942589957261396606340845665522400646771232316872444568013520651608356878655632725425106340256031308528158877727958784150436116095788759918507442721063497464001672, 5185490165247175755074805103840625687511977590976733896967715184223982955725681935365096951517529730737911572507779959945930556296503873230438433692310842981978848881986205067999307067785730415524359447947414935770806603135319166013408164683315806218163318125978230966989985398051513033616788512784230934142137906332152151059584574222941527730647262944250765844919176013002939308197949589859844618414360065768222159786067710805154244111569645546199262226746460081578671653615283375596665960708242700241780342523448742861815380568359092813225600016747957517992666799497302478221946509254852979437130583539850985247422, 1717028738196915227260339129573501065417757436024070728399837662683474643676720266190852688571851260086024584528234004503770202991702828738603236485267929860326697228640681326889845794391744206929580676537615769150484083242039924741303807364343064097449659558370778499818290907827480001580408520014110979083082316647497828342236619136282585160822630608240519352654269080203964531142386474415714079196749108940162898716817139452352062000261548631825989143362746715121123292436275957550673873937398160148303975715603319819731258894296533494152025775404106195174909015831441339509280028585399046169513149752204461930349, 25139940794218635348197118071301083238188918027193611763525774422502805824030159181810808048312828586310375271390658874846166941305171889519472685469675087274773157307133820213186080599249106104274031234797703970573904818411381605617364965926619916397551349237481884885723093798237875561681274880161116978250140685000915537069110074814807782361116104719639226963741990834724296742064451257526339309855861251778350642631845345431897638639307184086434344778694684043943923041302280417162444914203825532942834207262516015206535412006876830590028421616204643350943277314562927607754616803756985741638210493640875844891960, 6452875340997852295275020218749378916760411126851936571996259386760459856313309845592392640856504175949234216794963908475913037761993360407125952607943943083700382006783091443756617877566422165299422992987336811474980284131306966940424642139162441283769172531199959298540627795873212152702317440453079566096174835647147665695679094943137671532124636863128457006714211465119286776747310503452130041649279123753848522079886216732719572247000481047269505214596261386534160935834909921155351371984109147724730932926711831690752003577272018655013647352055561080857579522667684581123594159788011149227192380455462896729962, 20897947836932076779964827384680266669444872541242595584853544810847660781809255811902379402727265984145972717558208216627868351476262475424181241317707734298108218231636329375895362429626917095073694210812814494087830535014117884013936787285440467171742761631884901929078488856204289738449061959822388725333274257861099169377435400465998662612618115681519773625182456433449001773543437767201553703283209697249003117284877232666946456539017194397166088957330100388776645543342462188483091150441369824235427061443229429025534194618806460187812446633057673388068141804189503074739767911838028579099128625845793341901127, 11585318389310082289634538436928729260761907754954731989483654384251165000197213645281370351397028539366128403662173911562239143321895246754339672995138654604980948825905276968754585440593530502031072587489418651687027546522269634035791996102885960686969316226732356317109881863779734224468395519503131972389118986368190443032576070941428487054450651328773394985517568216579647364967614926730248841713741600286001390136757473284393174512577204042060290369663604703262495330209924328523120390710228628984130500686686583318088441875055416917520119056403841430529851364998090755804939747123419334984081027473820456086396]


for e in range(1000,2000):
if pow(ord('L'),e,n) == c_list[0]:
print(e)
break

for i in c_list:
for j in printable:
if pow(ord(j),e,n) == i:
print(j,end="")

[LitCTF 2024]真·签到!!!

先爆破出e,然后爆破出flag

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
from Crypto.Util.number import *
from gmpy2 import *
from string import printable

n = 53779688736203933047434881701980151653423802317221115318252054349550528639605402386823698507644560099402835048990108944258111185574422278737617624691459404487383205558495742477348096557609903091073482529108655721238870718736876917084894146112572318162754496404262394399247602930119945411919174294508800616891
c = [4124398080749553074619843072966405052653858760437326718059791703345965920503569739252697039258403095781261373084359291436131778873009458422798167842256401087702314540530419434366776728534830888673974354635857270349385440098865230210094489169761588857916363734220665484295067349289289937219722492065728599463, 15481644643922585500945090000695562756282558733694376113993997188985665803568510535190119480845091520658885447822873846242168965970319826752836201669345271783173616567609933032017344851978404496594310266471195858958401298265505190354107704046599872108795281982693695588930911349202457222578310220886622884416, 40974022330897595185593668062654482156370823359835540803640174599026663839070218063991563668507393666219642637135525638990455137020424754595250945054931120081475828089632764945575780326199183117119567719177117261011813697975685625263935820428233393538013872760001414320682062909650622706212810667501741354873, 33981786848660496333961506517187714554193615584845878232210394944336780137112027320577548034903832074752598242250089070169817297717880683657379700922708752551349470039462849959879736868560539774248532790598446587204581950938279079907176227710483120279719588731010982317536907131989435797059221285174093962908, 1285910717903203084975787538616625852434321550159180500468441407891029771447865370135113417284148880935400895099397662772912500923680415544536692392496640999237766173745842517211118889788913178800742948591271387743915400252547483363390245549270543581643322229638652142265779266726517677852583628198266108421, 23789203781845502389604138554793333517773526003503743390692470103394090787030629083975882919256262588645554701048271917571850719220017173479370286653555316337255808129285505861937546032314431989480012931420093894536654994001056137216516437854011401289717520452295524972795366753274063468895803833424426506331, 20940208240413900181251095272480030757105866339312310157480925947687648156412725814283553668029566232713480333831122495321031459080649522184580652548367762322620272746907156287431288132170924230190580437501883293037927765862049006329498758245604100845556492302312391684439016854521845339622400243037514523867, 41340655699032850811922590703534124397137469314819785476566566093858629648044627482514797174972386035722096563024583525376236045453451526570126890987183821072119586387364708099135124115856050119661380924186837677285512927400295146789034172166107474252827192261267643468495553148849468493009241668471083048430, 22966360367971968504676737450654736559784526278126249100481690257360113645735823869174095070763996461165850039977914727245980242307319409983699793511352248209423007808171107239738771728438094641440444300596228692729277266556257088686585351869961921410859567001968798590921194402863219621666507877820378827092, 41340655699032850811922590703534124397137469314819785476566566093858629648044627482514797174972386035722096563024583525376236045453451526570126890987183821072119586387364708099135124115856050119661380924186837677285512927400295146789034172166107474252827192261267643468495553148849468493009241668471083048430, 52202475140977838262155766391763349770007617219731559882124842701306589259283233719727463105485402530682922793511867820592726412692298060420804847173813733441078903812811823520344962843237246635665635279928926476628971734748164894875272506105775963532397945641093931037074645811860105881221105902306255621181, 43686732822375527268166781780704145014463398236959129237259540820318050928142217382482854923592727143517945840145245021402367171624497223470640246895897992745217804594441620139099576901221773322604374681094586004810027213343123533228000473640015954168594863999625384697827658129618656763377267113765657637761, 14880134921930262144875287284818967110251827510945998306349834095556559727134453367023956672529927521400098332845397865476485851088348289863395304436600667602897364946074198944367059280853856523321854848231173098875824362694147164421785094924944589659224105370845089374193840009119763660625714201229551202464, 38013516229906731040770728995532120131491416592495253746823605701526767788760134027460299370090486775327164899231056232048607749748639052414737842983659937901990208411978548025212907210373477389757182408450834322391767748006090559771843058148102090701817180898022507797050605846546948706282805015074193093273, 20524906300041996892262239459527462404196257551590250259857365607007677670540302221668693379920161363521285920275466639018409401155313360025405024607708054080526222596947953326605977964045680445269338000371617360892920017917084671528868044975804331654166128752309192614142872384593861258628748764936855953220, 20524906300041996892262239459527462404196257551590250259857365607007677670540302221668693379920161363521285920275466639018409401155313360025405024607708054080526222596947953326605977964045680445269338000371617360892920017917084671528868044975804331654166128752309192614142872384593861258628748764936855953220, 20524906300041996892262239459527462404196257551590250259857365607007677670540302221668693379920161363521285920275466639018409401155313360025405024607708054080526222596947953326605977964045680445269338000371617360892920017917084671528868044975804331654166128752309192614142872384593861258628748764936855953220, 38013516229906731040770728995532120131491416592495253746823605701526767788760134027460299370090486775327164899231056232048607749748639052414737842983659937901990208411978548025212907210373477389757182408450834322391767748006090559771843058148102090701817180898022507797050605846546948706282805015074193093273, 16822859827241912092903301050602204948222809037868347721306013629185546078070142612905867911365364682095817701589155688149474870521437581822944710801232554186762524645518382246152771387652373860849924256464746937608068511622557828364043958392814895625329426982855829366086732912276996321034036018819408951193, 34150153608686108981107806839997156875358767651869050480811448846242725270615327530663889984779854553092120823194108656627949475159285700946138204912775266363022036292515155178325852957375486496328282381365286611916449049601323101141237331480034977207188953388238873934117345088291003788988627587000440491067, 1080077289768974224514697428506714010850637431783677450886962480094680409598510781459495187524547891405762403065728309492525472661717864381505770334364496408759066160232404275108402127205833678508044742271255268139834900230068167627203821637533356900402299478531941413138234500208157822130575455493383047567, 1080077289768974224514697428506714010850637431783677450886962480094680409598510781459495187524547891405762403065728309492525472661717864381505770334364496408759066160232404275108402127205833678508044742271255268139834900230068167627203821637533356900402299478531941413138234500208157822130575455493383047567, 43686732822375527268166781780704145014463398236959129237259540820318050928142217382482854923592727143517945840145245021402367171624497223470640246895897992745217804594441620139099576901221773322604374681094586004810027213343123533228000473640015954168594863999625384697827658129618656763377267113765657637761, 1080077289768974224514697428506714010850637431783677450886962480094680409598510781459495187524547891405762403065728309492525472661717864381505770334364496408759066160232404275108402127205833678508044742271255268139834900230068167627203821637533356900402299478531941413138234500208157822130575455493383047567, 2261213433462723419446068536636649771187144868712624195878985258332075459437123191546644392841202030016957753759317962427017329871785225346154355535823733243490439256337121075737014302820285880854932463336983215343814901470468271086180806826828758278636642722717746069806141466423669570629896086040252059811, 2261213433462723419446068536636649771187144868712624195878985258332075459437123191546644392841202030016957753759317962427017329871785225346154355535823733243490439256337121075737014302820285880854932463336983215343814901470468271086180806826828758278636642722717746069806141466423669570629896086040252059811, 20524906300041996892262239459527462404196257551590250259857365607007677670540302221668693379920161363521285920275466639018409401155313360025405024607708054080526222596947953326605977964045680445269338000371617360892920017917084671528868044975804331654166128752309192614142872384593861258628748764936855953220, 1080077289768974224514697428506714010850637431783677450886962480094680409598510781459495187524547891405762403065728309492525472661717864381505770334364496408759066160232404275108402127205833678508044742271255268139834900230068167627203821637533356900402299478531941413138234500208157822130575455493383047567, 34150153608686108981107806839997156875358767651869050480811448846242725270615327530663889984779854553092120823194108656627949475159285700946138204912775266363022036292515155178325852957375486496328282381365286611916449049601323101141237331480034977207188953388238873934117345088291003788988627587000440491067, 22966360367971968504676737450654736559784526278126249100481690257360113645735823869174095070763996461165850039977914727245980242307319409983699793511352248209423007808171107239738771728438094641440444300596228692729277266556257088686585351869961921410859567001968798590921194402863219621666507877820378827092, 16264894348259769136675550067824857283471919750028043029657185995447205515644739721442713128709898468504029150415861841382906641476195752925950909219618894837821015850329001463680764039265007095540240515692665160125015606879662459432975652875535648068534926380848491577719631224890161757880802939228883185592, 1080077289768974224514697428506714010850637431783677450886962480094680409598510781459495187524547891405762403065728309492525472661717864381505770334364496408759066160232404275108402127205833678508044742271255268139834900230068167627203821637533356900402299478531941413138234500208157822130575455493383047567, 48082751893707411443030173186335305790867819509239136633531599952276619514671134605545456992422479102909480454270136006149473478156585782252929384235054442854349205489546634520955838888639404324251978615664175676633161271815457282615312198983401493084973690137353747061078161134872098033066383487860152411239, 21327622441108572162106669889096334171915319598231314927862632695081879818457106233577588661109578343720589743198154707810708496736138963401446774648179328773413409171869828838434037907816132436438314483017142493175451372700989061258496056410836951234155583628787251073520843683698565432474522538486905480145, 2261213433462723419446068536636649771187144868712624195878985258332075459437123191546644392841202030016957753759317962427017329871785225346154355535823733243490439256337121075737014302820285880854932463336983215343814901470468271086180806826828758278636642722717746069806141466423669570629896086040252059811, 21327622441108572162106669889096334171915319598231314927862632695081879818457106233577588661109578343720589743198154707810708496736138963401446774648179328773413409171869828838434037907816132436438314483017142493175451372700989061258496056410836951234155583628787251073520843683698565432474522538486905480145, 16264894348259769136675550067824857283471919750028043029657185995447205515644739721442713128709898468504029150415861841382906641476195752925950909219618894837821015850329001463680764039265007095540240515692665160125015606879662459432975652875535648068534926380848491577719631224890161757880802939228883185592, 43686732822375527268166781780704145014463398236959129237259540820318050928142217382482854923592727143517945840145245021402367171624497223470640246895897992745217804594441620139099576901221773322604374681094586004810027213343123533228000473640015954168594863999625384697827658129618656763377267113765657637761, 52202475140977838262155766391763349770007617219731559882124842701306589259283233719727463105485402530682922793511867820592726412692298060420804847173813733441078903812811823520344962843237246635665635279928926476628971734748164894875272506105775963532397945641093931037074645811860105881221105902306255621181, 6095619509559019908019352298785640301209234881314970774184941172547625244370412202107112133779358742353812823865176363562807708451451147505179327450732451736668872375390442553984797239930526165727742801338607942940231944774202087146668342653834800543503935286187760190753179319613671205950833349955049912928]

m1 = b'L'
m1 = bytes_to_long(m1)
for e in range(2,10**8):
if pow(m1,e,n) == c[0]:
break
print(e)
flag=''
for i in c:
for j in printable:
if pow(ord(j),e,n) == i:
flag+=j

print(flag)

[LitCTF 2024]little_fermat:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
from Crypto.Util.number import *
from gmpy2 import *
from string import printable

n = 122719648746679660211272134136414102389555796575857405114496972248651220892565781331814993584484991300852578490929023084395318478514528533234617759712503439058334479192297581245539902950267201362675602085964421659147977335779128546965068649265419736053467523009673037723382969371523663674759921589944204926693
c = 109215817118156917306151535199288935588358410885541150319309172366532983941498151858496142368333375769194040807735053625645757204569614999883828047720427480384683375435683833780686557341909400842874816853528007258975117265789241663068590445878241153205106444357554372566670436865722966668420239234530554168928

n_2=gmpy2.iroot(n,2)[0]
q = gmpy2.next_prime(n_2)
p = n//q

e = 65537

Phi = (p-1)*(q-1)

d = invert(e, Phi)
# 666666^x = 1 (mod p) ,根据费马小定理 a^(p-1) = 1 (mod p) ,则 x = p-1
x = p-1
m = pow(c, d, n)
m = m ^ x
print(long_to_bytes(m))

[LitCTF 2024]little_fermat_plus:

这里其实用到了费马小定理的扩展,由费马小定理得

666666^p−1^≡1 (mod  p)

如果我们给两边同时乘上y次方,就有

666666^y(p−1)^≡1^y^(mod  p)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
from Crypto.Util.number import *
from gmpy2 import *
from string import printable

n = 169522900072954416356051647146585827691225327527086797334523482640452305793443986277933900273961829438217255938808371865341750200444086653241610669340348513884285892043530862971785487294831341653909852543469963032532560079879299447677636753647721541724969084825510405349373420839032990681851700075554428485967
c = 105943762023156641770119141175498496686312095002592803768522760959533958364969985856505466722378959991757667341747887520146437729810252085791886309974903778546814812093444837674447485802109225767800488527376777153844313243366001288246744190001997192598159277512188417272938455513900277907186067996704043274199

n_2=gmpy2.iroot(n,2)[0]
q = gmpy2.next_prime(n_2)
p = n//q

e = 65537

Phi = (p-1)*(q-1)

d = invert(e, Phi)
x = 1024*(p-1)
m = pow(c, d, n)
m = m ^ x
print(long_to_bytes(m))

[LitCTF 2024]Polynomial_plus:

多项式利用roots(),找到多项式的根,进而求解出k

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#Sage
from Crypto.Util.number import *
from gmpy2 import *
from sympy import *
n = 343424787688946710828788193478518340184635630498236346907606509763011890082198311173501834898393322176325060349656021994088578448585570427399686920253145504431065451412326430233084073651599248661762036671841142048573051549474182586297565046285161375600990596119448538118327240405957845178956427810835797220204485242640945891970398041508724313442375608608662117158013
c = 300097152084696274516003269451037367405899874736667089358316145472977115856239312841307278390995620995063953407731245808077915106161525019835875978698148238617148929170257141762407514139479267867121064342168993486529889088067645866930029787500052390195406519896658384623575160091828173111087120708969655686251340535134778177193882787257773427670338018428731395437974
e = 65537

PR= PolynomialRing(ZZ,'k')

p = k**10 + 22*k**8 + 53*k**6 - 22*k**4 - 39*k**2 + 114514
q = k**9 + 10*k**7 - 13*k**6 - 2*k**4 + 111*k**2 + 1919810

n0 = p*q
f = n-n0
sol = f.roots()
x = sol[0][0]
p = p(x)
q = q(x)
phi = (p-1)*(q-1)
d = inverse_mod(e, phi)
m = pow(c, d, n)
print(long_to_bytes(m))

[LitCTF 2024]Polynomial:

solve解方程

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
from Crypto.Util.number import *
from gmpy2 import *
from sympy import *

Polynomial1 = 58154360680755769340954893572401748667033313354117942223258370092578635555451803701875246040822675770820625484823955325325376503299610647282074512182673844099014723538935840345806279326671621834884174315042653272845859393720044076731894387316020043030549656441366838837625687203481896972821231596403741150142
Polynomial2 = 171692903673150731426296312524549271861303258108708311216496913475394189393793697817800098242049692305164782587880637516028827647505093628717337292578359337044168928317124830023051015272429945829345733688929892412065424786481363731277240073380880692592385413767327833405744609781605297684139130460468105300760
Polynomial3 = 97986346322515909710602796387982657630408165005623501811821116195049269186902123564611531712164389221482586560334051304898550068155631792198375385506099765648724724155022839470830188199666501947166597094066238209936082936786792764398576045555400742489416583987159603174056183635543796238419852007348207068832
c = 690029769225186609779381701643778761457138553080920444396078012690121613426213828722870549564971078807093600149349998980667982840018011505754141625901220546541212773327617562979660059608220851878701195162259632365509731746682263484332327620436394912873346114451271145412882158989824703847237437871480757404551113620810392782422053869083938928788602100916785471462523020232714027448069442708638323048761035121752395570167604059421559260760645061567883338223699900
e = 65537

p,r,q = symbols('p r q')
eq1 = Eq(p**2+q, Polynomial1)
eq3 = Eq(r**2+p, Polynomial3)
eq2 = Eq(q**2+r, Polynomial2)

sol = solve([eq1,eq2,eq3], [p,q,r])
p,q,r = int(sol[0][0]),int(sol[0][1]),int(sol[0][2])

n = p*q*r
Phi = (p-1)*(q-1)*(r-1)
d = inverse(e, Phi)
m = pow(c,d,n)
print(long_to_bytes(m))

[LitCTF 2024]CRT:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
from Crypto.Util.number import *
from gmpy2 import *
from sympy import *
from functools import reduce

n_list = [16284549467215459860410219597024063610473673936290355100056351270928590364613988243842136274404316005691228851657707321037165033870804113001550943722154728825877813376691406849932899693973387282799799300076386870984605589385666352824740622229871992727011987847056429850720207816048044538068625281977059392365698031140268787802886018698622326103590834314940280191560618753408741810842189500991556860816195814550884416201667771827582907240044216817705876129993030771943110090291383205720587816820335839616491257078918258839986942101986011761809815192713499542329037877195448381127272183807358011340669666067708631770629, 18874449316683637715798227591079994715220250787784886038879393543606786017564740000007881151950098752600868917271951840433212429335449734520464340460962870875528399394278620757114832553403790578599857545045548782264680469899469733610229824411943119032419052885845035690046611519195843721184869834557481917675133504256150187042147269721516549831707784660343957497462516302534697915170087780048689613921549811073805796084838801677337285061667687328043565589734203160196445644144798845303226939960633632967262794622796927905511547760465906600293964201276584199569541295613430382495278352554280248372584117917520373403063, 13076908038170870040678205430512292701702182383746502395067907294908791921755288520053025319156015431312084703402938465525746196078114225446604200656116848235842943713613538425047483331236843707852400888407037547782069810250229035895403347555287877301409523248658733500963325361631821388259137561613536275954710848967383282290486421290937700396986650186236373076267188846407623991396459884128392118502565707689494271484411270172764553747426536404781904379621870642658609027074757591034785814602602669666257742808888301912575857074138613714693225934811254682687014167022418837710552784925328161453554291397460324648009, 16378397749449315054623854181248970586445531404081850673625192835136416152712968780451149412408644689393643801969477034418829482292894114547339155149570026460766659623960243723741437212596779580161767297321149670682427000047000712397718946486472118638780090056091542235702825736985864963592363421943353726975184567975451918105247987573044010599149673027905021130138957885113596669923366241161695565837122963976988635649640547443201925034845002113548522307980664206158188711548845245115694530280375848933481227411503982144621846732228815377656607983358898296200251680387871097014543693213877074718748683243193584032307, 16561385664507310659703460597815131331175620854125898893505075859155749890511144622913872488783791188180242785479319865960633526830814389031162024199864660323116594980719331106368397062852472114748955889862650270563487466194545102072373606964935390400328607060427961354290055443710114639781630071832997101380097322119243847190066266823291236828718017385537809056374392924015081117151158033309950857254309859691442649968222489177513517837849318096762149934959873646750864750378500351560253453052870424424427631414365680967482680769587570457938750679258205430151223470761518748987038822469422647137405393267829437115661, 27046459277694602448592524332290812177367631061914086306537115904955610821120392893033090428641088790759783810505225125618182431554899875183961418066959811832057748013953098277804562621152445358481976221983179988257658622392669474721482514871569548645762057681213193026792187879687736985533503283192537252904253565317763028483404018596514523171644666753183517320602643087213777450193062371986178076259168860180486748722567326484282893069173271762518110920685267104269429407229859993484209639764440874444582271870147714648808732931399985199947422716048582921727875237459841962093669408116061538502016560235135864203187, 26656304012303785684433399162699704691814095671158676770279115782799819097401667611247727555104978633884125246262630572285699884039990597392442760154412046297340436752418017863089245998557221143069544231044947583991838381529081774245290065442299808728542273138931461712874414662570197142795674160946728850452526786804787060582942714635903943088540232346797109678405554499677459722287119125623191067780196726820726456507802067342186435679967664032334075189916733352409403602499298544374351405005339596410771187606377781063995755795494682971576602822244457151090982442689870155439418641987576796032975032982289138437523, 15430339362720939092241771692575439580654810089653970198317149114896596238037181680990393763581287618371554846982066535980062263001619707606585504112155505335852802431392213092366756058196440934454810685146101829974548748060332228708229146991380736668433937967747468330692411917426038703359064546899782163287526256750039064809093426968389929333819191207284079703677535201724530391246890003928025687520199553868464322185815354591044585221486768114570373992719977614232251764409893171263639718616620216630797031237033969290978218328767317279717825174597882707772846934097838694418308236053838800414834627456689940059791, 18567217334857361786819913577261265078968886790989901098066320191741355103505838160569648197557648144402318678198622602821398215265062903833980611331991924162821902705417905758829862021425828310098183855605162264362860669298956185657733562472361876121183146316333113433547558152618165933865808900552444816088227098441082165477634812598644531670232452276788291537671779564658425789722419032860803991282640262179618723470437500425645011269733791887608702964571393657348573277992781115199432229176320688981128912052074722348557580462855962547978505669490105804175211061178124988260957275350940324541120102820024607088877, 10779265483116424102513175333888918968735912126282080716409998310381429332303237383487628664073567555863832134055945636657550074126628975203541323090803941066893475056319351674995896497450955897099614503220268400135112031310669044989879413178359759130908036871112663414065113664951350386824618325532532761206110118269005313068956882540007289422776225718534047101012876346009269097785027585782628699252006893938086064139042361425306202870627629615292450559291783382487842611805623198422252868756644595549320868144393828052610953995595915294930701560599016888539448223935199483656756326744914184772404419968728372785709]
c_list = [644471004204038587358576160407417490938643306027967868486894032686145771114614076076527690366372762614045209015175209880518279715723521182568975220993976451106760236390912778371250746699463366097164369672789316408520079193370191810477580463635224092686607896863852671881543817329521589324466628227730589108339783619357530316049670209743367574983963078106666377633552745384690084183804939047320711873053569717432670155045869610477526046503868585690544254566603491357805849009447674789480061139157433156989123228768899846183291164697221164452100037658563026884070301188916984245139290761779580443049, 644471004204038587358576160407417490938643306027967868486894032686145771114614076076527690366372762614045209015175209880518279715723521182568975220993976451106760236390912778371250746699463366097164369672789316408520079193370191810477580463635224092686607896863852671881543817329521589324466628227730589108339783619357530316049670209743367574983963078106666377633552745384690084183804939047320711873053569717432670155045869610477526046503868585690544254566603491357805849009447674789480061139157433156989123228768899846183291164697221164452100037658563026884070301188916984245139290761779580443049, 644471004204038587358576160407417490938643306027967868486894032686145771114614076076527690366372762614045209015175209880518279715723521182568975220993976451106760236390912778371250746699463366097164369672789316408520079193370191810477580463635224092686607896863852671881543817329521589324466628227730589108339783619357530316049670209743367574983963078106666377633552745384690084183804939047320711873053569717432670155045869610477526046503868585690544254566603491357805849009447674789480061139157433156989123228768899846183291164697221164452100037658563026884070301188916984245139290761779580443049, 644471004204038587358576160407417490938643306027967868486894032686145771114614076076527690366372762614045209015175209880518279715723521182568975220993976451106760236390912778371250746699463366097164369672789316408520079193370191810477580463635224092686607896863852671881543817329521589324466628227730589108339783619357530316049670209743367574983963078106666377633552745384690084183804939047320711873053569717432670155045869610477526046503868585690544254566603491357805849009447674789480061139157433156989123228768899846183291164697221164452100037658563026884070301188916984245139290761779580443049, 644471004204038587358576160407417490938643306027967868486894032686145771114614076076527690366372762614045209015175209880518279715723521182568975220993976451106760236390912778371250746699463366097164369672789316408520079193370191810477580463635224092686607896863852671881543817329521589324466628227730589108339783619357530316049670209743367574983963078106666377633552745384690084183804939047320711873053569717432670155045869610477526046503868585690544254566603491357805849009447674789480061139157433156989123228768899846183291164697221164452100037658563026884070301188916984245139290761779580443049, 644471004204038587358576160407417490938643306027967868486894032686145771114614076076527690366372762614045209015175209880518279715723521182568975220993976451106760236390912778371250746699463366097164369672789316408520079193370191810477580463635224092686607896863852671881543817329521589324466628227730589108339783619357530316049670209743367574983963078106666377633552745384690084183804939047320711873053569717432670155045869610477526046503868585690544254566603491357805849009447674789480061139157433156989123228768899846183291164697221164452100037658563026884070301188916984245139290761779580443049, 644471004204038587358576160407417490938643306027967868486894032686145771114614076076527690366372762614045209015175209880518279715723521182568975220993976451106760236390912778371250746699463366097164369672789316408520079193370191810477580463635224092686607896863852671881543817329521589324466628227730589108339783619357530316049670209743367574983963078106666377633552745384690084183804939047320711873053569717432670155045869610477526046503868585690544254566603491357805849009447674789480061139157433156989123228768899846183291164697221164452100037658563026884070301188916984245139290761779580443049, 644471004204038587358576160407417490938643306027967868486894032686145771114614076076527690366372762614045209015175209880518279715723521182568975220993976451106760236390912778371250746699463366097164369672789316408520079193370191810477580463635224092686607896863852671881543817329521589324466628227730589108339783619357530316049670209743367574983963078106666377633552745384690084183804939047320711873053569717432670155045869610477526046503868585690544254566603491357805849009447674789480061139157433156989123228768899846183291164697221164452100037658563026884070301188916984245139290761779580443049, 644471004204038587358576160407417490938643306027967868486894032686145771114614076076527690366372762614045209015175209880518279715723521182568975220993976451106760236390912778371250746699463366097164369672789316408520079193370191810477580463635224092686607896863852671881543817329521589324466628227730589108339783619357530316049670209743367574983963078106666377633552745384690084183804939047320711873053569717432670155045869610477526046503868585690544254566603491357805849009447674789480061139157433156989123228768899846183291164697221164452100037658563026884070301188916984245139290761779580443049, 644471004204038587358576160407417490938643306027967868486894032686145771114614076076527690366372762614045209015175209880518279715723521182568975220993976451106760236390912778371250746699463366097164369672789316408520079193370191810477580463635224092686607896863852671881543817329521589324466628227730589108339783619357530316049670209743367574983963078106666377633552745384690084183804939047320711873053569717432670155045869610477526046503868585690544254566603491357805849009447674789480061139157433156989123228768899846183291164697221164452100037658563026884070301188916984245139290761779580443049]
e = 10

def CRT(items):
N = reduce(lambda x,y:x*y,(i[1] for i in items))
result=0
for a, n in items:
m = N//n
d,r,t=gmpy2.gcdext(n,m)
if d!=1:
raise Exception('Input not pairwise co-prime')
result += a*m*t
return result % N, N


data=list(zip(c_list,n_list))
x,n = CRT(data)
m=gmpy2.iroot(gmpy2.mpz(x),e)[0].digits()
print(long_to_bytes(int(m)))

[LitCTF 2024]CRT_plus:

低加密指数广播

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
#Sage
#fpylll

from Crypto.Util.number import *

A = [126, 48, 16, 72, 118]
B = [1015, 838, 454, 322, 287]
N = [14928238039315040991308196203361315232720657103650133916768377003541186379974554794073142343542962199646167766317056723028716081533473830944328192280890558488982087259502304749351712886702680690273779927046689225691188145463409018705371701817782500722503682956161406169576545370923150575960593215241955617811801884711743303725010992704344613814422803869554915295599263200818169122460109761202619658976615539515461554999589496432809489233653847835884852838383631155057809145366161488972716470542997257824927235683738259840332405831579098429903716774910463581929154318403690419160948134710111693142307975784807557693379, 17942112047893516394059758069789896767008729052700255916941606468451353356755128052549675888464470730751071560385587733542652063605624887715486701968268746511130513891808360080569152819964870126967139166330069938033479674849483747008363844616001579775106124746396822730393977795887093285171120310391388533993105150552272708636765519928941755740285542436495225661570621438914992974707276930502069303295274628661481998308554649392508786793750053053121122238628064635273635766848165401929854140867543074809148318281653184460226317939677515071700168976030351545593059026392022012671316065525702115657483566938137244340943, 13019064216900979539288062154033407362873923068007793252861690841339799064052996489313924024470974905381895275618151217852919855409876807710907317767656306172828545362002202523070939278046699936212402230630256584670423362708987878505483680635512219997968954116231217398227993622065902156246475702094095500711503286622519913896122591961739665723628435538946933843825335162611709476594363043466396457232612767777259192378480905334359054208794766852953721503794850664015006289392327541583330272689875846792533484323373077869253786846989723423921359499060297185946499178827913630078855649725924366889102773642897486126623, 13912864686675639249288437589107116555604805004189183711379789929568272769079461241751272015747660238880020581115276925307650817840052731478197935494922776778456671398757225456564763063323400586339819575338030773839261766332062362334879207190483699972215128979606986002814161594101693635881349015199185085412611407662604627479103847204950489715963432100704956918420774156334247252954925845191282729254577898318969430816941295140050362250629162902319950857410371021670404067789437944207703037460999816188314289887032825758140831028148890807643175098513541476223379383684271681907330269037209677032315558402937931625967, 20697281700165158060712321641266488711894944770894967058614284974230824937584669196933970375321828545024565840884072714039625672397255154291241299830226044184343634190191714207346083253113281433886226024581215292220163243496877738571331530557698633431609877271753876915587472086166892247529345031622448967841394311132707519133169502656041602524428786054667737910711240877755895057344274733837936106880244101397045580919605270516952216181028018300911277852780391514223551138578229868751099931303779985263212375714318776700627534091244790507276964260243653855487575165560179621639549449819991732450911014479975009486773]
C = [1722078835760061914922188136968375167560877120158977673683182787526616054111469302309902289765296385972742778009222122528552899918863724377732557219671176645494150005867610261347026235782564913243945601412744385129580128250927608122522809099383488427292064494983097644976239331574095708707385594044914760001270147206289650087166888037423932397555572816680601347885645487184528254070549733484985825517047949, 13816768804244975535171696506080461156723308623701857620869448033158865282990045039961844920570143914665135883585879971811381020721992222246426401777511507400191713087571687956741206708710177012785421375718708189812774837594504418965920334982224317114403682678639035989628947049770826058014589194158740309041792753136519168749545398774774914316098342278282514631042388857128856143795589244785052399900000, 56859130881666565988360890971524531509149418204534393501520362276373931205720700726887545491289205478830425585724997174504028201171321308151273876050431857688549262391131233843813896378551007208009894797843649952348922113315189777325469148719163919686766128489229222919487894298991061288984198998019515140204032611992635303660051083035992783953034672470253917987745130941338091497821670180651626339168, 104921088107235282970210070343048501908867624861235981308477371001800133242704884555685815497516836051050046856653001827861416954490565731163497396533369953441870506739608750779206146960512840685327369132438186520936819912160558465866281258814185277348673235724471278843834900077063632942847769939844998491486539844971328759014099887125592504524703425638600458022082133169071492523661735192162844062500000, 1240538766092673389922062748316424702468324581791216732649676526936727204257919336267729115874238837779394913573904392250443112978081341477867371036538324777176210745189240390306682663050771398816977024467405187435749941354366210128964797433232968555682642062707794521268832699429918162047270351881018092211816812850558073282348521389449478019560248801682472510717226707312809024869529183888321461953350349]
e = 5
F = []

for i in range(e):
PR.<x> = PolynomialRing(Zmod(N[i]))
f = (A[i] * x + B[i]) ^ e - C[i]
f = f.monic()
f = f.change_ring(ZZ)
F.append(f)

F = crt(F, N)
M = reduce(lambda x, y: x * y, N)
FF = F.change_ring(Zmod(M))
m = FF.small_roots()[0]
flag = long_to_bytes(int(m))

print(flag)

[LitCTF 2024]midRSA:

已知p的高位和低位,找到中位即可

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
# Sage

from Crypto.Util.number import *
from gmpy2 import *

n = 10912724749357317040117295175340915836309117326481842971911576002816136982982366412133127436929465794389631046998036509363047557873155846920275327196471118680559431161116535588318645353317739214770132790445807395653916337747136630775427171105596048281228718048314706544665819996610453587925745842345926654572410324847927833437471701176403031302117052425160845583678182335391697596801106017558494065612842298945201720733418994561321697012416704574891516720606917736854915347853341353358814869449590841870866128113400765492223847582506991200050368263722438854522124807397499067048911261448546634778788867555039834459211
e = 65537
c = 6991017300002465473760665517672638980904771950587963320768028786572848880002446111427309844155944419991711131609525886799710433964716773503883581910737560542905952516670539044167012461107915291519628081744473505479068712979401023972013124089857993361492602682730769445826818873805246777789559501477084603991595919524098203387452563401306823917989080019788620521432596833764004972429814705900915782768111621466120683534147560628509733828773006451505153520893053368254310905682981931980175859011116643271531341395883753605992130701423800808678200033639094180802506618083869818685981234182334150817211223363755511509799
leak1 = 749278395841748263310980933893
leak2 = 2675756732628494397256285826768672620995252274010849868485475743575097846941007603037228233621038664628877573057336866559545388148568450491606789423985

PR.<x> = PolynomialRing(Zmod(n))
f = (leak1<<924)+x*2^500+leak2
f = f.monic()
p_mid = f.small_roots(2^454,0.4) # 找到中位

p = int((leak1<<924))+(p_mid[0])*2^500+leak2
q = n//p
Phi = (p-1)*(q-1)
d = inverse_mod(e, Phi)
m = pow(c, d, n)
print(long_to_bytes(m))

[RoarCTF2019]babyRSA:

image-20240901091858161
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
from Crypto.Util.number import *
import gmpy2
from sympy import nextprime

def get_p_q(A,B):
tmp = 1
for i in range(B+1,A-1):
tmp*=i
tmp%=A
tmp_inv = invert(tmp,A)
result = nextprime(tmp_inv)
return result

A1 = ...
B1 = ...
A2 = ...
B2 = ...
n = ...
e = 0x1001
c = ...

p = get_p_q(A1,B1)
q = get_p_q(A2,B2)
r = n // p // q

phi = (p - 1) * (q - 1) * (r - 1)
d = invert(e, phi)
m = pow(c,d,n)
print(long_to_bytes(m))

[湖湘杯 2021]signin:

解法一:

**n~1~= p~1~^4^*q~1~ n~2~= p~2~^4^*q~2~ **

看到这种多因子+大数都可以考虑连分数分解

由题可知 p2 > p1,

则 n1/n2 = (p1/p2)^4^ * (q1/q2) < q1/q2

q1/q2 ∈ (n1/n2,1)

n1/n2进行连分数展开并求其各项渐进分数,进而求解 q1、q2

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
from Crypto.Util.number import *
from gmpy2 import *
from tqdm import *

pk = (1150398070565459492080597718626032792435556703413923483458704675295997646493249759818468321328556510074044954676615760446708253531839417036997811506222349194302791943489195718713797322878586379546657275419261647635859989280700191441312691274285176619391539387875252135478424580680264554294179123254566796890998243909286508189826458854346825493157697201495100628216832191035903848391447704849808577310612723700318670466035077202673373956324725108350230357879374234418393233, 1242678737076048096780023147702514112272319497423818488193557934695583793070332178723043194823444815153743889740338870676093799728875725651036060313223096288606947708155579060628807516053981975820338028456770109640111153719903207363617099371353910243497871090334898522942934052035102902892149792570965804205461900841595290667647854346905445201396273291648968142608158533514391348407631818144116768794595226974831093526512117505486679153727123796834305088741279455621586989)
c1, c2 = (361624030197288323178211941746074961985876772079713896964822566468795093475887773853629454653096485450671233584616088768705417987527877166166213574572987732852155320225332020636386698169212072312758052524652761304795529199864805108000796457423822443871436659548626629448170698048984709740274043050729249408577243328282313593461300703078854044587993248807613713896590402657788194264718603549894361488507629356532718775278399264279359256975688280723740017979438505001819438, 33322989148902718763644384246610630825314206644879155585369541624158380990667828419255828083639294898100922608833810585530801931417726134558845725168047585271855248605561256531342703212030641555260907310067120102069499927711242804407691706542428236208695153618955781372741765233319988193384708525251620506966304554054884590718068210659709406626033891748214407992041364462525367373648910810036622684929049996166651416565651803952838857960054689875755131784246099270581394)
e = 65537
n1 = pk[0]
n2 = pk[1]
cf = continued_fraction(Integer(n1)/Integer(n2))
for i in tqdm(range(len(cf))):
q2 = cf.denominator(i)
q1 = cf.numerator(i)
if q1.bit_length() == 128 and q2.bit_length() == 128:
print("Found q1: {}, q2: {}".format(q1, q2))

q2 = 196443958511498599913330690975430421229
q1 = 181856133933383097933223133658050179553
p1 = n1//q1
p2 = n2//q2
phi1 = p1**3*(p1-1)*(q1-1)
phi2 = p2**3*(p2-1)*(q2-1)
d1 = invert(e,phi1)
d2 = invert(e,phi2)
m1 = pow(c1,d1,n1)
m2 = pow(c2,d2,n2)
print(long_to_bytes(m1))
print(long_to_bytes(m2))

解法二:

wiener能解的题目一般都能解

n = p^4^q,pbits = 360,qbits = 128

根据连分数渐进得到的公式**|n1/n2 -q1/q2| **,

我们令s = n2 * q1 - n1 * q2

再补充一个恒等式q2 = q2

但考虑到(s,q2)的配平,

引入一个平衡矩阵的项D = (n2//q2).bit_length()-q2.bit.length()

~(再减去2留出安全余量)~

这样我们就能构造一个格[[n2,0],[-n1,D]]

最终的式子就是:(q1,q2)[[n2,0],[-n1,D]] = (s,q2)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
#Sage
from Crypto.Util.number import *
from gmpy2 import *
from tqdm import *

pk = (1150398070565459492080597718626032792435556703413923483458704675295997646493249759818468321328556510074044954676615760446708253531839417036997811506222349194302791943489195718713797322878586379546657275419261647635859989280700191441312691274285176619391539387875252135478424580680264554294179123254566796890998243909286508189826458854346825493157697201495100628216832191035903848391447704849808577310612723700318670466035077202673373956324725108350230357879374234418393233, 1242678737076048096780023147702514112272319497423818488193557934695583793070332178723043194823444815153743889740338870676093799728875725651036060313223096288606947708155579060628807516053981975820338028456770109640111153719903207363617099371353910243497871090334898522942934052035102902892149792570965804205461900841595290667647854346905445201396273291648968142608158533514391348407631818144116768794595226974831093526512117505486679153727123796834305088741279455621586989)
c1, c2 = (361624030197288323178211941746074961985876772079713896964822566468795093475887773853629454653096485450671233584616088768705417987527877166166213574572987732852155320225332020636386698169212072312758052524652761304795529199864805108000796457423822443871436659548626629448170698048984709740274043050729249408577243328282313593461300703078854044587993248807613713896590402657788194264718603549894361488507629356532718775278399264279359256975688280723740017979438505001819438, 33322989148902718763644384246610630825314206644879155585369541624158380990667828419255828083639294898100922608833810585530801931417726134558845725168047585271855248605561256531342703212030641555260907310067120102069499927711242804407691706542428236208695153618955781372741765233319988193384708525251620506966304554054884590718068210659709406626033891748214407992041364462525367373648910810036622684929049996166651416565651803952838857960054689875755131784246099270581394)
e = 65537
n1,n2 = pk

D = 2^(4*360-128-2)
B = matrix(ZZ,[[n2,0],[-n1,D]])
L = B.LLL()
q2 = abs(L[0][1] // D)
p2 = Integer(pow(n2//q2,1/4))

s = abs(L[0][0])
q1 = (q2*n1+s)//n2
p1 = Integer(pow(n1//q1,1/4))

d1 = invert(e,p1**3*(p1-1)*(q1-1))
d2 = invert(e,p2**3*(p2-1)*(q2-1))
m1 = pow(c1,d1,n1)
m2 = pow(c2,d2,n2)
flag1 = long_to_bytes(m1)
flag2 = long_to_bytes(m2)
print(flag1+flag2)

[强网杯 2022]ASR:

n = p^2^ × q^2^ × r^2^ × t^2^ = (p × q × r × t)^2^ 开方后分解更容易,借助yafu或者factordb得到了p,q,r,t

e与phi不互质,而且e很小,结合中国剩余定理(CRT)求解

  • 将同余方程 m^e^ ≡ c mod n 化为

    • m^e^ ≡ c mod p
    • m^e^ ≡ c mod q
    • m^e^ ≡ c mod r
    • m^e^ ≡ c mod t
  • 分别求解以上剩余类环(Zmod())得到了

    • m ≡ m~1~ mod p
    • m ≡ m~2~ mod q
    • m ≡ m~3~ mod r
    • m ≡ m~4~ mod t
  • 利用中国剩余定理结合以上m~1~ ~ m~4~得到若干m值,

    • 根据条件筛选
    • 或者全部转字符观察可见明文
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
from Crypto.Util.number import *
import libnum

n = 8250871280281573979365095715711359115372504458973444367083195431861307534563246537364248104106494598081988216584432003199198805753721448450911308558041115465900179230798939615583517756265557814710419157462721793864532239042758808298575522666358352726060578194045804198551989679722201244547561044646931280001
e = 3
c = 945272793717722090962030960824180726576357481511799904903841312265308706852971155205003971821843069272938250385935597609059700446530436381124650731751982419593070224310399320617914955227288662661442416421725698368791013785074809691867988444306279231013360024747585261790352627234450209996422862329513284149
p = 225933944608558304529179430753170813347
q = 260594583349478633632570848336184053653
r = 218566259296037866647273372633238739089
t = 223213222467584072959434495118689164399

PR.<x> = Zmod(p)[]
f = x^e - c
f = f.monic()
result1 = f.roots()

PR.<x> = Zmod(q)[]
f = x^e - c
f = f.monic()
result2 = f.roots()

PR.<x> = Zmod(r)[]
f = x^e - c
f = f.monic()
result3 = f.roots()

PR.<x> = Zmod(t)[]
f = x^e - c
f = f.monic()
result4 = f.roots()

for i in result1:
for j in result2:
for k in result3:
for l in result4:
param1 = [int(i[0]), int(j[0]), int(k[0]), int(l[0])]
param2 = [p,q,r,t]
m = CRT_list(param1, param2)
flag = libnum.n2s(int(m))
print(flag)

moectf-2024:

week1

1.现代密码学入门指北:

RSA解密(有n,p,q,c,e)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
from Crypto.Util.number import *
from sympy import *
from gmpy2 import *

n = 40600296529065757616876034307502386207424439675894291036278463517602256790833
p = 197380555956482914197022424175976066223
q = 205695522197318297682903544013139543071
c = 36450632910287169149899281952743051320560762944710752155402435752196566406306
e = 65537

Phi= (p-1)*(q-1)
d = gmpy2.invert(e, Phi)
m = pow(c, d, n)
print(long_to_bytes(m))

2.Signin:

用已知信息表示Phi即可

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
from Crypto.Util.number import *
from sympy import *
from gmpy2 import *

c = 5654386228732582062836480859915557858019553457231956237167652323191768422394980061906028416785155458721240012614551996577092521454960121688179565370052222983096211611352630963027300416387011219744891121506834201808533675072141450111382372702075488292867077512403293072053681315714857246273046785264966933854754543533442866929316042885151966997466549713023923528666038905359773392516627983694351534177829247262148749867874156066768643169675380054673701641774814655290118723774060082161615682005335103074445205806731112430609256580951996554318845128022415956933291151825345962528562570998777860222407032989708801549746
pq = 18047017539289114275195019384090026530425758236625347121394903879980914618669633902668100353788910470141976640337675700570573127020693081175961988571621759711122062452192526924744760561788625702044632350319245961013430665853071569777307047934247268954386678746085438134169871118814865536503043639618655569687154230787854196153067547938936776488741864214499155892870610823979739278296501074632962069426593691194105670021035337609896886690049677222778251559566664735419100459953672218523709852732976706321086266274840999100037702428847290063111455101343033924136386513077951516363739936487970952511422443500922412450462
qp = 18047017539289114275195019384090026530425758236625347121394903879980914618669633902668100353788910470141976640337675700570573127020693081175961988571621759711122062452192526924744760561788625702044632350319245961013430665853071569777307047934247268954386678746085438134169871118814865536503043639618655569687077087914198877794354459669808240133383828356379423767736753506794441545506312066344576298453957064590180141648690226266236642320508613544047037110363523129966437840660693885863331837516125853621802358973786440314619135781324447765480391038912783714312479080029167695447650048419230865326299964671353746764860
n = 18047017539289114275195019384090026530425758236625347121394903879980914618669633902668100353788910470141976640337675700570573127020693081175961988571621759711122062452192526924744760561788625702044632350319245961013430665853071569777307047934247268954386678746085438134169871118814865536503043639618655569687534959910892789661065614807265825078942931717855566686073463382398417205648946713373617006449901977718981043020664616841303517708207413215548110294271101267236070252015782044263961319221848136717220979435486850254298686692230935985442120369913666939804135884857831857184001072678312992442792825575636200505903
p_q = 279533706577501791569740668595544511920056954944184570513187478007551195831693428589898548339751066551225424790534556602157835468618845221423643972870671556362200734472399328046960316064864571163851111207448753697980178391430044714097464866523838747053135392202848167518870720149808055682621080992998747265496
e = 65537

Phi= n-p_q+1
d = gmpy2.invert(e, Phi)
m = pow(c, d, n)
print(long_to_bytes(m))

3.ez_hash:

题目介绍中说是联系方式,则应是纯数字,利用hashcat爆破

1
hashcat -m 1400 -a 3 3a5137149f705e4da1bf6742e62c018e3f7a1784ceebcb0030656a2b42f50b6a  2100?d?d?d?d?d?d

1400表示sha256的编码,?d为数字

4.Big and small:

小明文爆破

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
from Crypto.Util.number import *
from sympy import *
from gmpy2 import *

c = 150409620528288093947185249913242033500530715593845912018225648212915478065982806112747164334970339684262757
e = 3
n = 20279309983698966932589436610174513524888616098014944133902125993694471293062261713076591251054086174169670848598415548609375570643330808663804049384020949389856831520202461767497906977295453545771698220639545101966866003886108320987081153619862170206953817850993602202650467676163476075276351519648193219850062278314841385459627485588891326899019745457679891867632849975694274064320723175687748633644074614068978098629566677125696150343248924059801632081514235975357906763251498042129457546586971828204136347260818828746304688911632041538714834683709493303900837361850396599138626509382069186433843547745480160634787

def deco(c,e,n):
k=0
while True:
m=c+n*k
result,flag=gmpy2.iroot(m,e)
if flag:
return result
k+=1

m = deco(c,e,n)
print(long_to_bytes(m))

5.baby_equation:

k已知,(a^2^ + 1)(b^2^ + 1) - 2(a - b)(ab - 1) = 4*(k + a*b)

化简得到 (a+1)^2^(b-1)^2^=4k

1
2
3
4
5
6
7
8
9
10
from Crypto.Util.number import *
from sympy import *
from gmpy2 import *

k = '2227e398fc6ffcf5159863a345df85ba50d6845f8c06747769fee78f598e7cb1bcf875fb9e5a69ddd39da950f21cb49581c3487c29b7c61da0f584c32ea21ce1edda7f09a6e4c3ae3b4c8c12002bb2dfd0951037d3773a216e209900e51c7d78a0066aa9a387b068acbd4fb3168e915f306ba40'
k = int(k, 16)
k *= 4
product = iroot(k,2)[0]
print(product)
# product = (a+1)(b-1) ,yafu分解

image-20240811075934188

接下来要爆破对应a,b的因子组合

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
from itertools import combinations
from Crypto.Util.number import *
from itertools import combinations

factors = [
2, 2, 2, 2, 3, 3, 31, 61, 223, 4013, 281317, 4151351,
339386329, 370523737, 26798471753993, 5404604441993,
25866088332911027256931479223, 64889106213996537255229963986303510188999911
]

target_prefix = b"moectf"

found = []

for r in range(1, len(factors) + 1):
for combo in combinations(factors, r):
product = 1
for factor in combo:
product *= factor

product_str = long_to_bytes(product)

if product_str.startswith(target_prefix):
found.append((combo, product))
print("Found", combo)
print("Product:", product_str)
break


image-20240811080154896

1
2
3
4
5
6
7
8
9
10
11
factors = [
2, 2, 2, 2, 3, 3, 31, 61, 223, 4013, 281317, 4151351,
339386329, 370523737, 26798471753993, 5404604441993,
25866088332911027256931479223, 64889106213996537255229963986303510188999911
]

a=2*2*3*223*4013*281317*4151351*339386329*26798471753993*25866088332911027256931479223-1
b=2*2*3*31*61*370523737*5404604441993*64889106213996537255229963986303510188999911+1

print(long_to_bytes(a))
print(long_to_bytes(b))

week2:

1.大白兔:

image-20240819103844535
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
from Crypto.Util.number import *
from sympy import *
from gmpy2 import *

e1 = 12886657667389660800780796462970504910193928992888518978200029826975978624718627799215564700096007849924866627154987365059524315097631111242449314835868137
e2 = 12110586673991788415780355139635579057920926864887110308343229256046868242179445444897790171351302575188607117081580121488253540215781625598048021161675697
N = 107840121617107284699019090755767399009554361670188656102287857367092313896799727185137951450003247965287300048132826912467422962758914809476564079425779097585271563973653308788065070590668934509937791637166407147571226702362485442679293305752947015356987589781998813882776841558543311396327103000285832158267
c1 = 15278844009298149463236710060119404122281203585460351155794211733716186259289419248721909282013233358914974167205731639272302971369075321450669419689268407608888816060862821686659088366316321953682936422067632021137937376646898475874811704685412676289281874194427175778134400538795937306359483779509843470045
c2 = 21094604591001258468822028459854756976693597859353651781642590543104398882448014423389799438692388258400734914492082531343013931478752601777032815369293749155925484130072691903725072096643826915317436719353858305966176758359761523170683475946913692317028587403027415142211886317152812178943344234591487108474
c = 21770231043448943684137443679409353766384859347908158264676803189707943062309013723698099073818477179441395009450511276043831958306355425252049047563947202180509717848175083113955255931885159933086221453965914552773593606054520151827862155643433544585058451821992566091775233163599161774796561236063625305050
e = 65537

x = pow(5,e1*e2,N)*pow(c1,e2,N)
y = pow(7,e1*e2,N)*pow(c2,e1,N)
p = gmpy2.gcd(y-x, N)
q = N//p
Phi = (p-1)*(q-1)
d = inverse(e, Phi)
m = pow(c, d, N)
print(long_to_bytes(m))

2.More_secure_RSA:

C = m^e^ mod (n*r) ,又n,r互素

==> C = m^e mod r

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
from Crypto.Util.number import *
from sympy import *
from gmpy2 import *

c = 12992001402636687796268040906463852467529970619872166160007439409443075922491126428847990768804065656732371491774347799153093983118784555645908829567829548859716413703103209412482479508343241998746249393768508777622820076455330613128741381912099938105655018512573026861940845244466234378454245880629342180767100764598827416092526417994583641312226881576127632370028945947135323079587274787414572359073029332698851987672702157745794918609888672070493920551556186777642058518490585668611348975669471428437362746100320309846155934102756433753034162932191229328675448044938003423750406476228868496511462133634606503693079
n = 16760451201391024696418913179234861888113832949815649025201341186309388740780898642590379902259593220641452627925947802309781199156988046583854929589247527084026680464342103254634748964055033978328252761138909542146887482496813497896976832003216423447393810177016885992747522928136591835072195940398326424124029565251687167288485208146954678847038593953469848332815562187712001459140478020493313651426887636649268670397448218362549694265319848881027371779537447178555467759075683890711378208297971106626715743420508210599451447691532788685271412002723151323393995544873109062325826624960729007816102008198301645376867
C = 1227033973455439811038965425016278272592822512256148222404772464092642222302372689559402052996223110030680007093325025949747279355588869610656002059632685923872583886766517117583919384724629204452792737574445503481745695471566288752636639781636328540996436873887919128841538555313423836184797745537334236330889208413647074397092468650216303253820651869085588312638684722811238160039030594617522353067149762052873350299600889103069287265886917090425220904041840138118263873905802974197870859876987498993203027783705816687972808545961406313020500064095748870911561417904189058228917692021384088878397661756664374001122513267695267328164638124063984860445614300596622724681078873949436838102653185753255893379061574117715898417467680511056057317389854185497208849779847977169612242457941087161796645858881075586042016211743804958051233958262543770583176092221108309442538853893897999632683991081144231262128099816782478630830512
N = 1582486998399823540384313363363200260039711250093373548450892400684356890467422451159815746483347199068277830442685312502502514973605405506156013209395631708510855837597653498237290013890476973370263029834010665311042146273467094659451409034794827522542915103958741659248650774670557720668659089460310790788084368196624348469099001192897822358856214600885522908210687134137858300443670196386746010492684253036113022895437366747816728740885167967611021884779088402351311559013670949736441410139393856449468509407623330301946032314939458008738468741010360957434872591481558393042769373898724673597908686260890901656655294366875485821714239821243979564573095617073080807533166477233759321906588148907331569823186970816432053078415316559827307902239918504432915818595223579467402557885923581022810437311450172587275470923899187494633883841322542969792396699601487817033616266657366148353065324836976610554682254923012474470450197
e = 65537

r = N//n
print(r)
Phi = r-1
d = invert(e, Phi)
m = pow(C, d, r)
print(long_to_bytes(m))

3.new_system:

由条件可得到 c1+c2-c3 = (a1+a2-a3) mod q

C = c1+c2+c3 , A = a1+a2+a3

C = Ax mod q

则 **CA^-1^ mod q = x **

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
from Crypto.Util.number import *
from sympy import *
from gmpy2 import *

g1=[48152794364522745851371693618734308982941622286593286738834529420565211572487, 21052760152946883017126800753094180159601684210961525956716021776156447417961]
g2=[48649737427609115586886970515713274413023152700099032993736004585718157300141, 6060718815088072976566240336428486321776540407635735983986746493811330309844]
g3=[30099883325957937700435284907440664781247503171217717818782838808179889651361, 85333708281128255260940125642017184300901184334842582132090488518099650581761]
q = 105482865285555225519947662900872028851795846950902311343782163147659668129411


# c1 = (a1*x + gift1) mod q
# c2 = (a2*x + gift2) mod q
# c3 = (a3*x + gift) mod q
# gift = (gift1+gift2) mod q

# c1+c2-c3 = x(a1+a2-a3) mod q
print(gcd(g1[0]+g2[0]-g3[0], q))
x = invert(g1[0]+g2[0]-g3[0], q)*(g1[1]+g2[1]-g3[1]) % q
gift = (g3[1]-x*g3[0]) % q
print(long_to_bytes(gift))

4.ezlengrede:

通过判断二次剩余

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
from Crypto.Util.number import *
from gmpy2 import *

p = ...
a = ...
cipher=[...]

flag=''
for c in cipher:
if jacobi(c,p)==-1:
flag+='0'
else:
flag+='1'

flag=int(flag,2)
print(long_to_bytes(flag))
# moectf{minus_one_1s_n0t_qu4dr4tic_r4sidu4_when_p_mod_f0ur_equ41_to_thr33}

5.rsa_revenge:

RSA剪枝问题:

  • 已知条件: n = p*q ,p和q的二进制序列相反
  • 搜索方式:
    • 从低位向高位搜索
    • p的低位bits位已知,与xor的高bits位同
  • 剪枝条件:
    • 将p和q剩下位全部填充为1,需要满足p*q>n
    • 将p和q剩下位全部填充为0,需要满足p*q<n
    • 这里注意要把p的已知的高bits位加上
    • 确保p*q的已知高位与n相同
  • 结束条件:
    • bits = 256
    • n = p*q
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
from Crypto.Util.number import *

n = 141326884939079067429645084585831428717383389026212274986490638181168709713585245213459139281395768330637635670530286514361666351728405851224861268366256203851725349214834643460959210675733248662738509224865058748116797242931605149244469367508052164539306170883496415576116236739853057847265650027628600443901
c = 47886145637416465474967586561554275347396273686722042112754589742652411190694422563845157055397690806283389102421131949492150512820301748529122456307491407924640312270962219946993529007414812671985960186335307490596107298906467618684990500775058344576523751336171093010950665199612378376864378029545530793597


def find(p,q,bits,c):
if bits==256:
if p*q==n:
print('Find!')
print(p)
q=n//p
print(long_to_bytes(pow(c, inverse(65537, (p-1)*(q-1)),n)))
for pp in range(2):
for qq in range(2):
tmp_p=p+pp*2**(511-bits)+qq*2**bits
tmp_q=q+qq*2**(511-bits)+pp*2**bits
if tmp_p*tmp_q<=n and (tmp_p+2**(511-bits))*(tmp_q+2**(511-bits))>=n and tmp_p*tmp_q%(2**(bits+1))==n%(2**(bits+1)):
find(tmp_p, tmp_q, bits+1, c)

find(0, 0, 0, c)

BaseCTF-2024:

week1:

1.你会算md5吗:

md5碰撞

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
from hashlib import md5
from Crypto.Util.number import *
from string import printable

md5_hash = [
'9d5ed678fe57bcca610140957afab571',
'0cc175b9c0f1b6a831c399e269772661',
'03c7c0ace395d80182db07ae2c30f034',
'e1671797c52e15f763380b45e841ec32',
'0d61f8370cad1d412f80b84d143e1257',
'b9ece18c950afbfa6b0fdbfa4ff731d3',
'800618943025315f869e4e1f09471012',
'f95b70fdc3088560732a5ac135644506',
'0cc175b9c0f1b6a831c399e269772661',
'a87ff679a2f3e71d9181a67b7542122c',
'92eb5ffee6ae2fec3ad71c777531578f',
'8fa14cdd754f91cc6554c9e71929cce7',
'a87ff679a2f3e71d9181a67b7542122c',
'eccbc87e4b5ce2fe28308fd9f2a7baf3',
'0cc175b9c0f1b6a831c399e269772661',
'e4da3b7fbbce2345d7772b0674a318d5',
'336d5ebc5436534e61d16e63ddfca327',
'eccbc87e4b5ce2fe28308fd9f2a7baf3',
'8fa14cdd754f91cc6554c9e71929cce7',
'8fa14cdd754f91cc6554c9e71929cce7',
'45c48cce2e2d7fbdea1afc51c7c6ad26',
'336d5ebc5436534e61d16e63ddfca327',
'a87ff679a2f3e71d9181a67b7542122c',
'8f14e45fceea167a5a36dedd4bea2543',
'1679091c5a880faf6fb5e6087eb1b2dc',
'a87ff679a2f3e71d9181a67b7542122c',
'336d5ebc5436534e61d16e63ddfca327',
'92eb5ffee6ae2fec3ad71c777531578f',
'8277e0910d750195b448797616e091ad',
'0cc175b9c0f1b6a831c399e269772661',
'c81e728d9d4c2f636f067f89cc14862c',
'336d5ebc5436534e61d16e63ddfca327',
'0cc175b9c0f1b6a831c399e269772661',
'8fa14cdd754f91cc6554c9e71929cce7',
'c9f0f895fb98ab9159f51fd0297e236d',
'e1671797c52e15f763380b45e841ec32',
'e1671797c52e15f763380b45e841ec32',
'a87ff679a2f3e71d9181a67b7542122c',
'8277e0910d750195b448797616e091ad',
'92eb5ffee6ae2fec3ad71c777531578f',
'45c48cce2e2d7fbdea1afc51c7c6ad26',
'0cc175b9c0f1b6a831c399e269772661',
'c9f0f895fb98ab9159f51fd0297e236d',
'0cc175b9c0f1b6a831c399e269772661',
'cbb184dd8e05c9709e5dcaedaa0495cf'
]


mm=''

for h in md5_hash:
for p in printable:
if md5(p.encode()).hexdigest()==h:
mm+=p


print(mm)

2.helloCrypto:

AES解密

1
2
3
4
5
6
7
8
9
10
11
12
13
from Crypto.Cipher import AES
from Crypto.Util.Padding import unpad
from Crypto.Util.number import *

key_long = 208797759953288399620324890930572736628
ciphertext = b'U\xcd\xf3\xb1 r\xa1\x8e\x88\x92Sf\x8a`Sk],\xa3(i\xcd\x11\xd0D\x1edd\x16[&\x92@^\xfc\xa9(\xee\xfd\xfb\x07\x7f:\x9b\x88\xfe{\xae'

key = long_to_bytes(key_long)
cipher = AES.new(key, AES.MODE_ECB)

plaintext_padded = cipher.decrypt(ciphertext)
plaintext = unpad(plaintext_padded, AES.block_size)
print(plaintext.decode())

3.ez_rsa:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
from Crypto.Util.number import *
import gmpy2
from sympy import symbols, solve

n = 96557532552764825748472768984579682122986562613246880628804186193992067825769559200526147636851266716823209928173635593695093547063827866240583007222790344897976690691139671461342896437428086142262969360560293350630096355947291129943172939923835317907954465556018515239228081131167407674558849860647237317421
not_phi = 96557532552764825748472768984579682122986562613246880628804186193992067825769559200526147636851266716823209928173635593695093547063827866240583007222790384900615665394180812810697286554008262030049280213663390855887077502992804805794388166197820395507600028816810471093163466639673142482751115353389655533205
c = 37077223015399348092851894372646658604740267343644217689655405286963638119001805842457783136228509659145024536105346167019011411567936952592106648947994192469223516127472421779354488529147931251709280386948262922098480060585438392212246591935850115718989480740299246709231437138646467532794139869741318202945
e = 65537

# not_phi = n + 2(p+q) +4
# p+q = (not_phi - n - 4)/2 = Z
# p*q = n
# q = n/p
# p^2 + n = Zp

#Z = (not_phi - n - 4)/2

#p = symbols('p')
#q = symbols('q')
#ans = solve(p**2 + n - Z*p,p)
#print(ans)

p = 8141718443899971866435611383307659937822484107070436226370768656806495239448624178566680116128893503281864119780033117546021082236554869984932214653357543
q = 11859601043451548704239065811750630150121409048356115322381859833767027517389301429046456876409906319499766276197893850146733170630849226147814156555750347
Phi = (p-1)*(q-1)
d = inverse(e, Phi)
m = pow(c, d, n)
print(long_to_bytes(m))

4.十七倍:

计算了 17 在模 256 下的逆元(即乘法逆元)。然后,对于 cipher 数组中的每一个元素,我们使用逆元来恢复原始的字符值,并将这些值组合成一个字节串。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
from Crypto.Util.number import *

cipher=[
98, 113, 163, 181, 115, 148, 166, 43, 9, 95,
165, 146, 79, 115, 146, 233, 112, 180, 48, 79,
65, 181, 113, 146, 46, 249, 78, 183, 79, 133,
180, 113, 146, 148, 163, 79, 78, 48, 231, 77
]

inverse_17 = pow(17,-1,256)

original_flag = []

for byte in cipher:
original_byte = (byte * inverse_17) % 256
original_flag.append(original_byte)

print(bytes(original_flag).decode('utf-8'))

5.babyrsa:

用sage计算Phi

image-20240816011641998

1
2
3
4
5
6
7
8
9
10
11
12
13
from Crypto.Util.number import *
from gmpy2 import *
from sympy import *

n = 104183228088542215832586853960545770129432455017084922666863784677429101830081296092160577385504119992684465370064078111180392569428724567004127219404823572026223436862745730173139986492602477713885542326870467400963852118869315846751389455454901156056052615838896369328997848311481063843872424140860836988323
e = 65537
c = 82196463059676486575535008370915456813185183463924294571176174789532397479953946434034716719910791511862636560490018194366403813871056990901867869218620209108897605739690399997114809024111921392073218916312505618204406951839504667533298180440796183056408632017397568390899568498216649685642586091862054119832

Phi = 104183228088542215832586853960545770129432455017084922666863784677429101830081296092160577385504119992684465370064078111180392569428724567004127219404823572026223436862745730173139986492602477713885542326870467400963852118869315846751389455454901156056052615838896369328997848311481063843872424140860836988322
d = inverse(e, Phi)

m = pow(c, d, n)
print(long_to_bytes(m))

6.babypack:

简单的**背包解密**

根据加密:

1
2
3
for i in range(length):
if bin_m[i]=='1':
c=c+a[i]

exp:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
from Crypto.Util.number import *
from gmpy2 import *
from sympy import *




def find_flag(a,c):
bin_m = ['0'] * len(a)

for i in range(len(a)):
if c >= a[i]:
bin_m[i] = '1'
c -= a[i]

m = int(''.join(bin_m),2)
flag = long_to_bytes(m)
return flag


a= [2487264674516612702148381262059366937897201508455413114345031288894980789076145147579418259432661232747375904997965581530362268904008339124626472045717075482791021095030019783589425299870946373246221582957232862473515, 491733695728183987781854883946776199363545034763223630648303216239781071808983441788738994635864262288104702316190256147614095355462666760091586746521889127102395089946736744234701020777747486645716679961505355358205, 110323038758283816811655397189354730775114318542406507944678995133064353922234139010858233544980338693080719766808774615216332973443076471838385315798081800456260331047745824029902641504699030254172864776140503685719, 21329601123439484788549839891633989762344638209267595412456647269024794605613697213699096256470155035750114059504925376661660484839061252258268241386676023785213539005867805566800471943519247336183762390966700950019, 7146972597944713271040951137457604863561388249875746261956055482229418349264570561740906104126974792505856583850338097727129246644471065603435449813884941071413766137227119139128098345457922432088128969598942863267, 1346101131622672931978096423414991055086097907048045187836881598919564312718270178534519827267497280433625574785132174894812908583233359458000469975702103413693480199742325839719191134247009906270778775450756715188, 431832097768527518676165198802192386603746291434967601504548859319580699889723090943427634867984592194172569910901514799190511020246917662162535632202054961537707269684557393598823535364874075052250490284484829188, 140385263282271996264759155211641776877746297983736897311922733831813190094504225023609340831846735540994403916688230922925129855025970272950216444321463493579227283703118512150491635819942098587286980862817753505, 34223371325515207445588748757581712557393912157235932688701226001484995652561037930828670928779595410194265999875772181711329727812185265441887453894003309876654082495957062628413923487565276953961953102939899664, 11277905223110088306111589808536546872836546320235997789453098291242971723694602770076671423955063276020078678714571127064308764611705435202479293805661470178917099557275252963592432838615626750886647727435412727, 2615533435460831263145388899927800470846179005257762751742107113431800042995970550154282940437470113325491219189765587324789634252029440596113709555932091761129000675863727140738692649309833681187804499985953136, 936680841170458882946412959909966575946011948314629933325082014426837165501136249855420901858482634295013806361789689361684904674438042695516337484436348646919308417999556756779144910987756875858573687134864914, 240803995584844951172124454225548986410808735949094019867567366838810221297826531921690948148961695516283629928962961745839887826049348862278548294987215333063020792491250359616172365439958324315638641990190536, 74980313650452416147684959971591530004150916322659108850519926847892455755211157414650129501071119906261853154503022754482691495645170933619292755026582075009055897885581671027043347130782615603358690889357969, 17373734350550516610959609643239951947839958095899981508834140825450716407631617618229082722622331706459216379319570540046133821392793975119423828799726656124807834541043219269949459907314628636546219059231483, 4383939698435145446949414991318424065438281430941348230548310095735465803169460840233678696507780083107318568406471009158126616954496458697727524252433591785759305622568557705826283690985480130620325779855269, 1070435075033499499988967771003353861621342562651011567215908784740129578236135452228720299864117045007232989018924013752836270314752592099997410344317383430641687448457000377071747633795773722163076615405153, 354613024399513291150023928129989293929227226203084151945112636505041432337820329935805740802403361855625313123094613318180050195219366366832494130593248906011113600242755768635094775633827342114020854687801, 82597124584081826710375601757684765457467298282386480837692933784824657535317108286212691529276214884031365269733862817274058538453459456296256548913748615606422415053313052283494323168620576805637766138197, 26135834190257866104316629323550052649627679758726229473294221139854796563641126471998920211481501156701889782668173105315082084500683017294728437322818254222939692828669475566191154442279318530752996234399, 5321914533271631715766698346734309258597941523919808971175049357994196078126479079595401724485236733828962687678778457409546781470810737250537642200901652790857563365204935103019528537962033407161035692676, 1401112116815344363602973427355047116358185953451255358550792547953394603648490800732761959337994181037602301212276448178218413428984435465643957862122433848889149559184391769249005008972240636924677483332, 340703164964920022751406615239919113589733348338271455697386514814772581315065581482054968704086006813510346859307625729162886049905513425065578320526943584411252201523709613325050800852296078315276309498, 87840565476176074750781589683807196881040923233689789764972859007886298300522765664170224177346224637510402223797751637511990096677274023769380478419759017880813713095034065541851821136431753956971681001, 19670793194720557916718563116693476958260133378839723765611437953301903581689095646338017322208705125479649557618768892326788688569445543579968049624743997901012938768052637463357937838813048475700143702, 4813717864536159278344281889539442680460787707429632446095662166356039450500759565004728794684170823084248242129657936118206321365817871353015182900801593481805141407218121604733002829781487535789180828, 1042206069053701098495071546906704343612504895408542932593774355364200288153617940373728364353536406373351075906293793845088075847011440543341941529120830192687505151588415115374221938124244686599669458, 194044946903756616103043562433809500007183272927392950867023951726626302681204141127037211903589021504233703959475286805099197368181117710043885464503673129287184477006142067195426098588591382748102539, 57242060503628134854797583503415516863794342630010325140908044397602380211468806869876771678223543893631961137313994861319272460663638480876700367769402916003571424012128837346480997355093988632012775, 10220201967005002779370447788097151915347020902180766203690278038856770790331091587750957262611786369059831723020056245241984653662463224025520044810966000669665537134571188694822388194379280786606327, 3267926212173074655716273983885176036956276231571067023300127600981173234474770474267538130720791055154389260987137327011230845199160118826368874310750622421181065045300794979970673152630315803973451, 664310922264744733608679352162235206229153782441085066286192469594499932348386155418089005696350197905438895173077254739918594652439993237866669330317791070351667267902119216464673735535997917820053, 157621450510303034999027157498529810254434467859123877137482107910574969124384732028159729373548578204828393076100787322321913754468400698891584836797607004658385107761645961934718993971913922689493, 39332477720879659647769207180648194166511069149312182714850691343807294060027257884701895063257342090729165323939249852666973310856943035346466688523098612569329263778095249692454805322913109933451, 8981431226314577645818078061310516067058739244501260778838272265495867618491462415652789974290152305589437388668252286740099675804549931870318361834902625342381411139234786285243806607019356580655, 2112396066721715241251602227199629841249291526749264633946336472170358658345723532373776051582626845585398413757777914886165302637471620129930025840435283626998895529130832700898103592084193587990, 469796330799746978963007177579525242476491475859713462679382870110198758612531699613499280185379426640464846165230615898408348461001941619050157303936273348173453633557613625134687931175489772308, 115039894603762374765072518903656214032673578314477265152318302986985809844170481821167559173999270345678822988509361838537021290790266729339932399789571955857561187896624119148469524606927195502, 29664847413037439140755929162295500789926130685594096951097063583886105875553862215342779333568726148068998390489061260679772397420854474310952173916283562144502155749545173676547095974974938801, 6556839835049647931901086051581445260744766665407776927047263448383041272915616955807464961262297820118065353994454969038345182131864552405100904248845811998006038518360062998811216993218123317, 1777902487663062541759851155686901732751487652837314110752529657038468352750515100993079307083868172100714925159868062197729467104948375724637901426300367514987134187716080043905739938236648704, 496319028827230065370808145407239788641593404351668605447266421139929451476993248197319730317200648698252327668625409509842367526798038085336803728242097138638139634601057690936621540950362878, 91859873982601930765698107766946424315968932113724973875252752520495744658349166435087906664763198237819106317321871232725285852613201351155535304791295392982339051653723048621713854087558299, 27416797198170440695880404003135961426335900780086489077063102228234854286849577430053665684665123525576025865136178905344946412182398068100227278108238228179476948006111402146551358956042173, 6618792570596090569883178232621713030844697317972184177900266954498675602890666553071207714570183352868264445779550306428622314821163774496224109073830696331713973117656394498431868066547419, 2170402078990376080093979069174241330730093169079857263825716044536454255816623476318486713531051261924372354329543376436907081387161693951811518904258013624768207438418761774847657241464116, 444068419739995022918617734805868711289130441640491361059833564963918508148289061718666452354434057970227476744547047349557417149242164606932560068546338531971271707670031796603537502372902, 116657711114961473575551110004924695540253659208616449841332120251303948007722209463493630964437083428655981974738051994193994806043789586554127478932520376572981058192629163539170482099439, 26060438230704097273528583087224964538829526126764669880723211182150736154082956489319587015488424248074673973497150602509972124276820315641896501503925719577821672512750083923483639733416, 6312791407424911633066282842976932623335914208291314848182683302453777089215292160945721990083867179076948154652506406356338815828714441906485780965753668277560566183244931348859397184996, 1692738421964980687206278894671327723911704272751755954222196367628340111939187266884312772028554097537058570911615150944663230388612366056826914851034642492298594744849153229556190046330, 467525048501123667461709936020772038812998605707446973687794928398759672463134111033796530786478727006399722869173671763892936977996495279695995929887621412909042553923445043307978487073, 100524774903368088338735495212617525628101069016243368191042349062731422745652851141040067275932170134907320208205726289799197848585810532178559348960204294517902672414604810447030596048, 27814678376250636475963101212563090069738325215292874239553841311037561288624279025540601779796471707609056593491462913915467359662214011975515860736192625178250236017806638891058352841, 6146583639189016851959336110111529802617165794295583668085087256400497268514196451801697302172354876150306785802188833007655768181472221094475392274540015787948511952367768046413009035, 1972647620592074216061102097901025152958921034850117568363055778941629490654706191168761681590445732321415108675787531563680577749629570660705072798303247953275401784690900022657739322, 371444236734952267365204917912482218024760669256564601735746557802172061599306636753624221981211002583971063750448869544186339158302695225083644994003958727288476784454648096424712122, 122254251587569792335530528509722911970032904171801982862469794399827245263786995733489731913997837358853070479769024383526380208988565918719151600653752397319872277146128837497328015, 37286085540618400296289156352820709922577362907484951458689730829327977274283958429361031670068907334172105855310654077662912181145565822690393824208950538512990718744603086462751297, 8960386121829638279311227577342777825734976587843199435094340053720338004424184197136819101116475086084110882985205105967675766957208204488229410580925549838579346975088433058825112, 2276020215301107373585539745757682715066838555468744061772014192384015274014672056309929648681686089838637957127768944113418121587630588726390948566064269910008396907056486696440621, 607349939368134408551415861865227396073824635286316486245465114777775395388058059102705505424561001490318248134384090100571125911216424062773005875309952406284203774537367839133285, 119036276576206703263155095063111697848826207711313825926870015597766389307963670003146886377762517538032971265642879985310317695973899218804472784113163457901422724084711780785647, 42030777748108550530459203444475857940945563824576240738615672332753050069206966495014628929275783847295884969372071131041457167837216841146848083118096773135990284469263324779443, 7801996642301319152692691810553695688255137357013588495692283033031549008190374987427339686278893185224986120367594016951691992507271905708595080902010159659368839867860433342236, 2208574074019210752518459502962754515153645798717698412888529548015314931730564928870825878207969197632997431492713572137381185806543942907257429896476484304820878553303138599159, 768875672280773738301803816415515519067859985949784777815605972358140605222957399855931295900483405997209014872309627261455336173608212560504792804732406159988744626008190591642, 213430837881757766520777720690227709564760977311522001626864091515991137423909703305978776728094360822736833235760061066314816749758660033547207607953805341923438394772222356568, 82360211831711259567147082155555818156999516949891879514305397375226376936714506922756403002876731807095740268483307937613566131364594612432398098476300712735589147781570183292, 17749505352232170648277795567698933594199437689182764405380407013992895289676270195878470798816715217377777574478356564936400974585960088437473753598924064324383361905659789789, 3427214394932046144638723931330597473316067571098072662894954825121393877991928319931449114219100671521983554547487355301825989691873309784465316768877146988849237541879345997, 1033902507229521469775736346351634090020261583833297661608844489398831364552754846127512235344097362890795464047384509362185144853214501000183283440093026203459311568816825264, 224896235915885231383021605802223120291823571580780275950317681857821908865357784480256946962966353978144999197255874549242776446126658379098611152585008158970159741029928166, 46029158819241197707530664166476597494824578315547299718547883731820892091315435238631987346971891025923179798692039448953613556744177038196467650472219486883115951311114343, 11947866502696456680811378187645438096064991719463034800178755900009558951200835612294081250719346343143340755576335021624771970543003065673188450976052831967872919086392740, 2920182352645954475250456149302161189384947754266138653194940049989939156554780361528842542799077656577372777863627070726368904843252451856963117841700429655465449705784298, 641622426678020294248348183140299041659157650855760105808225416711044677800278294044700367798760043786235745613510792462327964867426046011657009528106413572140156175050547, 139954746021857963632941471710740997948822448809029403690252968784849647633362222415971470082427919553489814062772632095710992183657541577740542585479640231081279442703729, 26951287563812328009402867445459718346022404035671471571180747182520664735617063468580188663385794364598479725800534646437082877207222254951262061856164914161401031069085, 7533585444288704788707326472044821719148563540561950589462107215132713320228676563974287003223326227564110259498308322080055316439031345783355395296729881160340610419798, 2276681583409260736395242645263289467585348662731848036224090877214770286189504748163492790260653720049576572250410962278647838121717162502347694787530301107754917965930, 474556448905745036966775435479094252142291985759634322576584740921367165655972599891226896859675668151114091970232772247346351748955558953513984653925641106869750480713, 127434337967780172994097939061090682233760718060985516805855544997040535343689397647620215878303719159525314116562161004671399396862283153119456440081266677387394513825, 26958440398830097157570752848820597974607321452122682350667898050790790872944229259301257843111978215025542048968699222294492807645241856446964337776714971381969501071, 5543555284065922229007474385783130130141655633965977061928013317537397727717406514000700955159647395591026117082092382033235800387850239860460046217510413778741145568, 1234762639172810584930296374422356813288496696923257612102992994614585199225028932857122231293467541131628736229833789522239025569090130126077017761481761935075168095, 355466248406445302867530536283270751070714127588124044114582631609659246249339560304163152323418724390561360227173698743244037301264764126798143323643968965204937509, 72700233281268425015457883799224003903351225804106120865021630177680188790291132871915896124460090399131402188231983457135950533458784941828330878270977967060216148, 17316325779212303492370685449752299828026183539683998725619992507954441121758510621171086796417805607101134043617316264832615245565516418608812080799316990851625705, 4045793926070659592750134404331599438619282956075192844401269281007613550701517318190039173492631001707043977026685514125253560526115949503328595814800145874763660, 711093850172488751248536015688936346283846062295071944527029992467516277719725837096755918337587878576030222851749327532666344838291776707230618144013255672878802, 265627118033654696712457079751401631255125309014812639375295118794146799198801006240800873274048170518660448221821727034749291649708953722421725907035286053353872, 56397799026942637682063511042055387061218525595156363606895648399263418939712512484112089481484737116602512227228360835774657959685026627558074305176995845647003, 14485314789957973511455116454157965523985421493897618644045918045972073878396047755360530791556364199120111093825046698573687446383611922050184839529827282440392, 3550955573839595298078922255066479093374448121222507459840552079059417076208499387361330875700156148993662311858100125881757983588374422578671684157194578005699, 845394743568277367630651838202283372116209637644259875312243046465466486130071115873693547193074995290146894807692302774606698607144257685615262061054213977420, 157730148886711208861332893525227881346167845596707482474187376786153504516831765170538422967044056418676212271368775137847308449974344069982254963969728576186, 54972881967813310263623651713923315210166704822071760933248319000133464676004646169143078394020203091841106960137380702725337793156762085219469872257140065395, 10729618624425932454603285350456338562675184367958955898413107388221142096410983819404349570576694967179369846493834859543515755779034404675292796271503098978, 2442709998183758153870663320358670148543830566673551209180788899834647749860789589565309923762896818608005296106561164431377898506019097822580641263331814899, 651590036376284619471743663785818577107718418313829721360265583261583596100827943422638184205536113868285291626431841044058974804223249221103868269005376657, 114607798091152645971169174208076386390725220406372401915445980825934238917993417913942451617626679858301802459311641056076814238046173194524157303256038150, 39902529162554510030314089494503111747276505091248405060746015077422014506338256115473236342993594864048856417342484086620483648018566663638691082167406896, 7696036409658331229292571646244718273466046087174912598857625566056708582171413470987556822776798859431848832604237853020082821687940873973792941059899704, 2124793715529138812294972358553948624813291392446651644830711957681124971135340690294893448419315140942986852615187098678211216431027229098600530178187333, 658384832743376570742078380839633081933064245096557997421967190397377225701314189557712470669358349072689322858650074777626830988174808516744296032918846, 207441722934708037755237631720378642887937120813748348023809687455047615244353892880515039372882445336126456679753369371480841621878413386189854105557570, 46120989258570141716198175239164426659655378133453203231982537688000264558364343582463401621127725393877459942514087061448921695021828660135004811441077, 8188249463851855339650372248928765967441086033339032675901168172673586603869217763697984051550480433177801759541580074823902608731330486865652085135044, 2937142904794524692633847174299189664745670816742834573158221153146769098153095208026269794290966633578370921776670433893125934429015973900770183068397, 733124926365921400367689082582974550222406734787055535605162687013854196685186803977001257147200683812867023143593280536908792623212121135546302252718, 163278402453599131564496240174531690514528227885644439879148727669198836851619817419582703102053351987308732391369947772790306377652049104175405389057, 30247650270830046327693354982611104496891052070130966758534212809812843335592964533296290766840765263207385481421035739473846342013342141171267959427, 10078130422940933339521748812234495734268808180137214319132992860890442263439248960992021699437860319479050323778157839338656439168670198619111143719, 2468880502161574512996214909253394046701372930781084997897282377444297398943413058653731620475409298189864459900922031063170285510529204509174601472, 607074026100427506196023135076433955199278835550407310798426497629249872001552107547116229667872950481628543662982580322754725261269013849906534673, 132740473918237042219883376937810235079740145884708583638955667277623190279830437900121550989480157388767941856419463040395910600481643868918183256, 31718510456640085593521631697634193356173604238387825664787000835659167411973149050707246808351118400835035866343214347384616969135648635282147931, 7013023279079169100512494613396045516189395791014739872279083083144940194186933569894993097804928064121695159201540587912810973411497923430308118, 1771185586112090213616219590319917086599723206748079096836927259082387415598439340193771966567407719988569555116938671184047274203791682665544114, 397374970256811388188624914624139083024782079917643579178513419907217677561151325006437923068157587425558261984085274694860016959461272906962347, 79357052331733760410996870451429462826990142415371259214931967883012213322689987714484368914655142353136743730816759493623445282698964105194007, 18024995037150399824560351471574943556440673595591374226442857720036395804619368162299007566488606118476181051500800792556435843369345814420200, 3672082813534614033824027501205682677746304198256311647201407880518658491065244877413146229442328563967205873649123895823789401080903874966058, 884390448367024106697977520994089114652140177186827650340642302821550463666402143376715117683073225822100147575051185094558637911933790548300, 188239732756327819809744123998273956373038631188535307108080455432157193929576323356894115167616675699250266852372722398883063108283627629142, 33288603989729116913271536956952173835445978966530730095436444955036538722332958231617041802341417062090911709863572792283326143337721274355, 11485733967829072841907653505652765367596185911550254707130569392647462332893031105105058197515848740962693154105512628726167266984356020289, 2403399291804759683718697201628718853672014990022411946032431974098338948608647899389041474778909482165700212670301626696886803147288043249, 511319889754958068650171413169799880502913743237143323338990019288960892229714861654882544537650773480294037968794797914167989453965720824, 108151236227275669723663372909233127249406930188286111418173641508503812685900937356143956513296377001193855340520507635261983173020133040, 29238304319413057053313068686030250753447165587962843793828466785518433534702764546822180884428461976687744929459281379124786742084937021, 8710806082582848713173281808121766793059207164795295196447513451552342446919958461280536897422363560410120915054864290671091109422830007, 2960745852030782790607427333914261375033099283529370879973360161495226124203100530063141357601421786632355173585713266548540973431376582, 604226789553326438591187728019722484152820159976600984629527520901554123057786334839341626845330699593003318860611284025243121271706983, 182601602703012851376129630760230344746014108213070190831158648995503303041568836468914587260292443510296580408749988987988496769980026, 45452114165544367630569931330797239179068892066478030202246828842399491816831847850747717090783448434947452983100492335497009639567888, 17121905765418035275547423058447462707899580001255272989656046701474401090015657327101125412277786884745764423250530487272209339058447, 3774603297652275052121496733944137560240160153708941233671122697937317529256966828765637412706299259386179629160090242954994907929332, 1060720547441758622170146447289706124200025617853186951481807263542360257370083864882158715152433273118314629121456220166038646613297, 221968014150998259820244482577203245639303312867709655818056071267607816968641371724863025295597993367786164837699315327363092768373, 48882714266352303994499906166362680249387918980441207673706748487810074857456907593421757139320785593117603391693650930762966455968, 16202448926627445820838961561455164462246910065772244580677765363543397691542726082412061203163218760307389834156275979660359394394, 2956163682419868606126264117158250029934298756926288053091609992334385653684466888852763393290616941805759810929196668548734379973, 947743414350088412833104395509485078494688169216314527117041568424743421788079617145817207736081707175649820823460623353469499129, 184945524926843220565904193572688427321550948207655453104873607656563645624884025013598624332554709507217938881998831490973926770, 56091241819606834802888641120709675472905317085277369060569812131174812302014447128355020686805930142925377568700991226583887786, 11342476554725825973899273577573419030806527097049265365675861670559660391106730894000199354064208522140305551746468882526930218, 2402177443476249504669747634772796049517512708172380623039160322117732888388776939986309881254003733945369109368480598991083692, 779694676467776330674778030069618028430247798034244061629255618166403221248637754838157860401196252119142530084615889227008718, 279805151354990313327069866270353558845137298807826578854001581649814949600343606775647790956175906533124785285484676594205727, 71475104043185673882357779032282210215441549654529833915666511795774890652222328738683786126978390540777959958334867072773903, 17943539235945014339231354558742830502206047263873390682998140665294407299445224663761111928004278268665005924991145357190559, 4644026442647371851471373522652996931494883964189143247893482852205071445064380253582641516905658082237627505163407862645664, 1409644155578077661014560265925065735043498896729842671302999827395230787557009605337358883198670470099670153973385533319619, 323096734145812043063935925026236730750028036642046031570292345040624480525514361785469029998625026693350812690921739556759, 66490109788591511799221912380563668027716398810544644123382175383682357229245468554339935745239347569290928368121481198120, 12656292548243054261915436732277320096081079272327419007058490559709461117024442299280829706525636594720337557745657188367, 3391681366475824837488092758715214360838073187075047614113065989329609613896833473414068502642149439870471691863634629122, 1171517421153263625675697419132009454686117107914679030403775353063155717395912120634642665620725468223446139999071277507, 283703308943571467555327320427163735194765821724187323544643973406396459830945519805247147967066979142358739388094356677, 68051202286065965847502158995164914066216566669074127539650532219749577216638549042842244710379907101440823172129217941, 13657391854992511108591836048816405373941724899814769682716923188133130484869138365241075289816576384008939639840185236, 2883783693644859186835460708048379333567917588026714123591585397758887606304693027342351097912118721134282551369664243, 799049413981621014519709854919842048905323519892313665984919603393072653972864233067257746232644641382453549991205564, 167323486728516981799615013230008131717839880066330604897780052101994505570227406902019168715315935265773326851501787, 36720821966367632835200966450053402442515187808387796741238632349642200514749124280117021313827183586060369692397742, 9231349669963900651759770670625059190403421490616649578654575717995018536450416781815824036250202148465899261409814, 1782108859562682583955834770956766771890605266822317978330465547356702234978432274339716401371413673051273821401047, 403558799957529775306903388246707975744649346938130151765107472774892029713724284184220469230250620098654222513187, 113610170795802770344935864787382347027936273326387062416574602249889635787754346617875788451115772661826280534521, 32055073799513070460127524930885397197257512625854036561086683809899754909243064094359316603350553060664792782962, 9032924934526196049960770072668776382612241442724751839457302023155061259650364280524549081144893790536494565021, 2017862790729520323724155794794272872202696299996991444268875260039652843714149080734888358373743815054699872032, 641989462295283575733593919337192523868529607267791351139020713122159499889249625918896534847416953951571198300, 128576036185681041874919451733195397084174018792730182604376427967040903314850718633946179141568345684439398601, 40372047007036282320578970360805818319565465833073029617047122562052782556856211341854983376957243551410081742, 12690329041364261531787667832647179962305068888653710915257119208086200721695307184639464428289081103144163044, 3561839882694824398822284966776610177573484210494611237706713481725365094327241161248699081978241602830178596, 1199938132534089466501994820759235969832300222872622731608847912038243599132645129289586987692172765041057363, 324263436138121201088338125064781061780131145213294921711639118717892670326681104392825089385185080492440484, 68312903907509568411987755477707268100466381276451833349595552008166402404491773244111478626617324226539375, 17644820024620964580235818915132121042107943132825887368503777072488644953818352369186661300059264368686602, 3506176982938427175993147412444392161707218066658168782915638022559988465482121419504891010260766228901318, 1066127911891872518349397911557440606663336809214920827134975446907327509548040800613223772158827103310018, 226192414853873324160991825316404956087309825251607871786471768482769238181939189651359979648153657144702, 45868481610678874924581859998825662511897619432776149300471637861901025934649825592930301843850526560482, 13790618957198333318923230203705633437848971510707911225277092048085966476634360389032477412386316672075, 2577037700547459915849817513069936580425167358802123937052546118913600453224885074049561249688358836828, 907316011507113096967526321014989153923826069305244388586962072152306166058795915708345202709057953005, 257655812504204080571300921288974779044004152926402846615682864861219686480771224251979519937398150021, 49251062839756470728155099947305937498531111600022908848098152154867828870296984401906907127621922967, 18003086576459067165101290934987020831800807030229687007784917512221091664668503037255416369751058381, 3931602604129427365537886268681901399659904652265314628365560645602702305389347981284422957262198925, 1024271243554288667730540660664163792950639594042380266463713922650987059456833218457318808946966091, 264399551848126394660403560510401104363977298239470868728218368941030448200247464958990623172466340, 91991457278474569364064153570190123603908094841658212918408559703533962838464377716405517361239718, 22400319343956127928389329988299680966797095025488025868862978943959831082472834977311350142227326, 4054933925260064992644878588484342847457594792015796931877255389193313381697255433801823807489993, 1563931191287550417926830376062569859269361644002382824954373333292013041945346281280805769011292, 343600935590550484460351833584964172817805330710096798788745676605896512317351762955463013247649, 63176100013413022744650607325631187438860827337150751513958540819158680919377176592820951694123, 21461895060447171957232560518498142689748550789857829420960180353599240337920080298104122001920, 5835166770039346718590125171268445418773015279002775708686914119655634953623824713817863325421, 1583080965885530423876853196443645139416147803583378489670913938148126388391843537295818940207, 392027882718889629138666367076395194013822284370187648811904450742968357888850048132707951624, 84773060845038628419287336751649666625561226450930810787040749330985148718455599359011719538, 20913329354023188439880157138010537207897970146456506518137268768176475768733880753458923347, 4311750805563893138689876217833463788577851583828477282279295599052168675043703275872499679, 853899685398867377607396879875326827128843982112866203167371936104484725330862023846437598, 177330267045126383717093581983187474779454406408201086941455408963372790398670000549267776, 53143647775046286515978817675952110384368487980955438888997975610432428251415059859228454, 10991259161865360146194812310045803635018376660538575719261554366173833834812335245373835, 4056765217542521288464908532309700817396778995632736813131981648221349714370388148127516, 804624166261647601714189486709310419472244009530705820922420809512944365943834561839229, 221209387838524016717980366851546408106123634464083126244578703480033718962945353384984, 44893426704852156297812963470050296993434463573414592728231358819460836492051444088309, 15097276880249572944791099185953982641176811310343688646744220558627388586126270884093, 3177547688411513827329112344846258118128928380413096551275296685970663730887380521208, 707854681966281587817169996379236533896940250761506339446186239585936846532007717960, 123430766712269269314015844444108981877839453341743217081639119599583069918979135631, 42727196484340883716428235074652898935106385756024360939020725643288512665432787419, 9795023686113954751639542218587813833546340682044130681106706094735594753449446343, 3333589652095912448402556417544763364674016013042330262047943676041390880358346180, 947455010581251264347248926744940190279860580467728251791365397084078291899564124, 268670018298046298594544067046438306285322924770238391595093977430279476868065240, 78094390422018068485749659108183366278694042747549744891971134188665400412950020, 18124918094760916369648633132238959364840331932070152769613739914614309846704031, 4241888706533610079212359644998015902376872441583028817350629704555219530448753, 1292864973632566395230008219224138571254648896695439011761255646000025705327047, 268748278858999280597005392622004242197468731403889200124673378952297248513604, 88509143938000904019404561563568039020388387086033088264015176342184836107961, 20193371122440969904693011623640235956008535236609083989796068753247319156032, 4038600180280215891988824178178278280373636611246918842044528278230564207261, 1107150907782944887892399335890628523766269912586346493641592121812091723247, 210625186186013434779241292600805721380717453215450496819990522919652412749, 52953910211550391007013147620224873533688473472101985821194501496064403298, 9097555221706291288743269232756819233000414675958515393645941994120605160, 3429649093597174301305755373533641028744892761855146399462989664052400884, 741640028601865737636894538300654069448568041784703865806900024636263858, 137111267993711698795554790044192357770629382096307382022924712860324239, 38616149627736424773611788634842959989120382193171456026729095563767415, 9431485520373346422889960992205054090491173749526200420980321805553690, 1992952778532071559000019699416705938136688490627773967637839059076015, 574194788106589082411518870360486672683587224354718671901248024476268, 102609620640057348696515220693089742351613040750651566890644962920462, 36268823254475267212915191076327557136209959811616783925907478300982, 7567999544690811975942075962292580482677577353162367723788797894980, 1874140527739488453786828468118120241481575966337619572680165251377, 453914446353792760975691426663914252084437914832347163629988619705, 165150650733410175597931630292861667062273243834275274945484646602, 34566163119600685975060339689452757045437083897698838710019239494, 7694148541008402030841753047537726531717215585386379181283251145, 1697576884850411658454847805622249167935227079092758267244556419, 472437807783179983228633641986010243354676995634705949446120356, 119409918075506001971427759705853133156186846892920587610723175, 25613263424766799565203791718547119460962423676387668942984591, 7805142960598461841091346841458786166600096726425068620929337, 2767230135693902128766236987544547378777436388091785064756910, 689644486314086496286093830416975206144754872092432108597436, 138642086125227682870831666630271950088954885603515871632201, 30047434693445231347602467117028303851832764185641774643468, 6851801387424175873694354145711254327404855789285230103013, 2120042874205307146695207067554609162977513984517631857617, 490320105846897857421254356104910632681008002313418940471, 126323731373804665276167034060996983366300068355660603173, 21699921539905324453875345006818945922412432384306278913, 7939681050823987735942326816454304705408373515598927024, 1704054406000164917101338955641076586996654015897777293, 674629720702507360892410918497513853241707768110535720, 130116804903893330957629746403630277914984408897684191, 36586674897705341032938585410676119549859764313014514, 6820517853488553816157069373430435510514248629408934, 1940615831245060580576779381334292194461763717429719, 486407487540373443078130965659847688641455681092783, 115503902548715291215146001384729209189201342203617, 20726453501406140054607926221786392225949497849620, 5795586010156766459954451266198423523738902544440, 1894126095992857664160110316211206136427948391401, 400235284644456465531456917507977101554184036138, 96821039379669584765064498053975819680674844391, 23003305579401059533778299981921977893360385917, 5228073966664279351555893540080524011514115962, 1242198234479925081489833339665036257581784830, 412185918978837707936146917867270887000813745, 100133634343775138722999743130814482251294603, 26059544917887755330857182088221243972088111, 5139528748995372887990321340679356174733638, 1253542354308041615766358708614160342158058, 255695244303425264981809526736239333102982, 61808370933695923699986081041674755242751, 12426096507290278206573602748929564597975, 2986453750810080523307169404271220297061, 642144302488057714162005557670195083334, 130361391592026886001154254666792730817, 38722902212652057786773086799878934378, 7692285091800305362911294817569041066, 2668441901840977427307689562983863761, 627879703191450992712744583653335581, 143466848278452388635765854137055267, 40114449315047293082657646359855538, 9604649217508319090540717981276261, 2160954625898663094838587676686854, 663518655289550974870054172122371, 165231181091826810616798470843406, 32017505733146837917121936265672, 6710170503572414769550988030906, 2193907060628154300461720427652, 655138594818423378286082953437, 128372286376670762441323321515, 34081674525017606572942142473, 9410152783640368288366142632, 2828735859241558188208098320, 551007171562149788272788426, 123790351812017402954987183, 26171709615346256252881994, 5974406115827778237616062, 1129305631130982975444977, 309305180419035303006618, 63076647774929269450546, 17802308053095636943505, 5708739899619810440888, 1717642617243788103954, 487452007321104273269, 128040514304008259695, 22395338754966061650, 6980614247696882509, 1954726203330249242, 521378690601084559, 136837526017031961, 29173740577404415, 7191768065683254, 1621292657659019, 549037231011822, 141224784287699, 28266584508619, 8568210839573, 1730361037440, 343914088335, 79692432578, 29986725790, 6384194185, 1319027283, 483793159, 103505140, 22103086, 7280487, 2401760, 411716, 143073, 37097, 10436, 1884, 649, 134, 40, 14, 3, 1]
c= 2488656295807929935404316556194747314175977860755594014838879551525915558042003735363919054632036359039039831854134957725034750353847782168033537523854288427613513938991943920607437000388885418821419115067060003426834

flag = find_flag(a,c)
print(flag.decode())

7.ez_math:

矩阵运算,det_B=1,最后flag=det_MAT/(point1-point2)

这里用gmpy2的mpz来存储大整数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
from Crypto.Util.number import *
from gmpy2 import *

point1=85763755029292607594055805804755756282473763031524911851356658672180185707477
point2=70470862191594893036733540494554536608294230603070251013536189798304544579643
MAT = [
[mpz(73595299897883318809385485549070133693240974831930302408429664709375267345973630251242462442287906226820558620868020093702204534513147710406187365838820773200509683489479230005270823245),
mpz(46106113894293637419638880781044700751458754728940339402825975283562443072980134956975133603010158365617690455079648357103963721564427583836974868790823082218575195867647267322046726830),
mpz(161159443444728507357705839523372181165265338895748546250868368998015829266587881868060439602487400399254839839711192069105943123376622497847079185)],
[mpz(13874395612510317401724273626815493897470313869776776437748145979913315379889260408106588331541371806148807844847909),
mpz(17025249852164087827929313934411832021160463738288565876371918871371314930048841650464137478757581505369909723030523),
mpz(59510107422473463833740668736202898422777415868238817665123293560097821015330)],
[mpz(11314088133820151155755028207579196628679021106024798818326096960197933616112389017957501267749946871903275867785729),
mpz(13883500421020573457778249958402264688539607625195400103961001780695107955462968883861677871644577542226749179056659),
mpz(48528427402189936709203219516777784993195743269405968907408051071264464132448)]
]

def determinant(matrix):
if len(matrix) == 1:
return matrix[0][0]
elif len(matrix) == 2:
return matrix[0][0] * matrix[1][1] - matrix[0][1] * matrix[1][0]
else:
det = 0
for i in range(len(matrix)):
sub_matrix = [row[:i] + row[i+1:] for row in matrix[1:]]
det += matrix[0][i] * (-1) ** i * determinant(sub_matrix)
return det


det_MAT = determinant(MAT)

flag = det_MAT // (point1-point2)

print(long_to_bytes(flag))


8.mid_math:

与上一题解法相同

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
from Crypto.Util.number import *
from gmpy2 import *

point1=65540596822333029826884315503808996273733737079814345540607878287618419734231
point2=45151244176940366132774311848077675849486332018843894072137609985463616792271
MAT=[[mpz(9259505595451159514948336330303511539525155092949382077995385373332083424570340733825203563332256599256361679775371565817159463557158551820090084800254999338417057682355404780422980119717238594927467956675771042145306399815569005775907169857728757334979422594358),
mpz(3700462282298785820527479428312072678870010244861115107206951164684911761755437333209293039456840068340334559453608012512177623936248784897843503284633804083281388001236742261832974291349480314135560368365574114042082002559069958228523318326290833422846224288247),
mpz(20791012146351643571145217310876690226642338279942557085580439219377325884045305279931904540467264182713135410067252835618936836675270813727053937054168296298149405902638242278868020381541490973458957704137657413376043351193)],
[mpz(3802535350808074374431476757195874789213113083310705049856269457737583463559458126494122484246497049005001474007088865512110432486291568737501434666990689483191924384489484665070592656641925905986397402822195880143437724155134584374613878027218950975919679551229),
mpz(1519642544380087919293814751485424198320747098741960781639133554268321708273309194651985562222274023623071346914239982055028526526058064787882720065775210796950963778381575914964024929110539407721461321785325399699126116201001806816030960662346173275101476487421),
mpz(8538097185709421082644083672229287227818939415260987123718318427750267353075860559170390896769087600458156859498331152566368881938040799840806164389020986990994328370205184734637870147251004626759120887684269603636183629300)],
[mpz(17987668490992083132878642797176089621188858356259455169173987325310681186627844776077058221612169421636403546746899152917309634315569997105261046388995579843528014810244648968375990949478033964619008761814039733347955609163),
mpz(7188579142941521685422767412932555782658469950638690886255638896617687421517941457682493542615460990114218059246938237257830976937359020731335958068934235967457123039874441635435388736524907036941379695243043923900290273902),
mpz(40388963560266769813551191613694768219344365780650048155838802242681775019274045964917142477325170274191702615504062392461666558731638338001971723737440974198823443420018559746335727687)]]


def determinant(matrix):
if len(matrix) == 1:
return matrix[0][0]
elif len(matrix) == 2:
return matrix[0][0] * matrix[1][1] - matrix[0][1] * matrix[1][0]
else:
det = 0
for i in range(len(matrix)):
sub_matrix = [row[:i] + row[i+1:] for row in matrix[1:]]
det += matrix[0][i] * (-1) ** i * determinant(sub_matrix)
return det


det_MAT = determinant(MAT)

flag = det_MAT // (point1-point2)

print(long_to_bytes(flag))


week2:

1.two_squares:

直接利用sage的内置函数two_squres()分解平方数

1
2
3
4
5
6
7
8
9
10
11
12
13
#Sage
from Crypto.Util.number import *

e = 65537
c = 42330675787206041757903427737108553993012805007294570657461042152628982126538
x = 209479773119142584969854470862023704936857416491817498021871883305658177375498

p,q = two_squares(x)
n = p*q
Phi = (p-1)*(q-1)
d = inverse_mod(e,Phi)
m = pow(c,d,n)
print(long_to_bytes(m))

2.铜匠:

给了p的高位q的低位

简单变形:

n = p~low~ * q~low~ (mod 2^266^)

p~low~ = n * q~low~ (mod 2^266^)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
#Sage

from Crypto.Util.number import *
p_high = 14439249591349619691972392177790365247490839237199085979433418493254022567815148979672690178
q_low = 90063199151369157959005663017593053931871580139169245885113098598755909124764417
n = 18347545778876678838092757800261556931131930866012101566000425608407193858675622059415995283684230959320874387944052648148677918542763633503231962873204645415818139345588988936580526094727943067102768943117592654029397879665312089518191052154267343886226820785206334238961064175118262578895847281575656290248049404047727756356910896332939145136942219317065063060070725033146788186604738271846183709127655298440696824683099637827282095133642324657860714680107691622056420045091586609974536644773286992447027164350612852922016376888380895187804771279035652496676089183636450028327097084911908336202253562671798012457461
ct = 15659576879410368237140555530527974801613150473447768911067611094143466009251385693099110691602954207905029692682380253595062935017486879899242785756448973466690818942065250284891341066578689696180061755610538867770441139827574063212967027249650509215685566103350688284041405586915563454117672061141919712416360596137520514412607512596079964611672166435592936417138352662031529414118312166411150736015788925026636845744110093161894267707446937939130745326244186579516665160036229715964182962542836836457885170975474737620430886449029488829662146456489724775166105816909257516908496172172266375617868819982791477888289

e = 65537

mod = 1<<266
pl = n*inverse_mod(q_low,mod) % mod
pbar = (p_high<<721) + pl
PR.<x> = PolynomialRing(Zmod(n))
for i in range(4):
f = pbar + (x*mod*4) + (i<<266)
f = f.monic()
pp = f.small_roots(X=2^453,beta=0.4)
if pp :break

p = int(pbar + (pp[0]<<268) + (i<<266))
q = n//p
Phi = (p-1)*(q-1)
d = inverse_mod(e,Phi)
m = pow(ct,d,n)
print(long_to_bytes(m))

3.random_primes:

题目提示len(flag)==45,

n的大小大概为2^360^ , 而其中的组成n的素因子的大小为2^128^,也就是说三个素因子的乘积就已经比n大

所以我们只要知道其中组成n的三个因子即可求解

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
from Crypto.Util.number import *
import gmpy2
from collections import Counter

n = 78300669134090137852678272985826748552135227276632141248987049792032006306302216838913764274866303353208450204056303587307590215658369546155011362928706987241738494219541640893624036978156512506828463680671263486243620357332029975262649036988429673099480612452108805474703908926666372276084227948945557265663478215385708377783788570365632616043692339165126905185780780266966306548390661933964569191558132570743049563034138454687784280737515786647554373002062073506433019576711216881997114922882459590300118573321037403610889041169358378723253785685185468195113769538654602557963324567374538144099228383454092513581001676844948371535253876783418313588527754932166605066901072445123419390582818421290114496685300926300428214457517990285819930164112928731952543551128353453115448896272534889430898972420106066951673716649898254901175990616932072274131352817500432771246120044877003878221635833566879303044541045834038388997926347179939044765998585225912825579716411592564742018931576637831147018364052669287568321730785094397048548966924521616592554123755297954204221563101170233500051950508111908253332306439556638016218903032470713009804240601585082087048162066169084662644707376647151608352036058459491394516846894878416951958668053255135013274125427380981145860643060541753558111657169642936860264070256441807766713460296249602643758686033797758071121020245797758472562524923801634553187959279204425077723939301840341779998492203869115635533331664608105795918593153796830400602836307602218542060655621724654663459491663959746624660378618696497713505280314029154654750144247111545203758654611758984447921004347657793617842564871769622784844341157861486787088384957424536581508067582989224734241742351249915951485225249670040001204171856547596397427658888879993013652971335861824416084725435327931256774534973698438003593122194474117269397752225948596514379988893089239094703410940035417268946100231522267605729519374566776171026410423486906556493370843386314649478106704968479881781695360132024826936593194324539644886241562342997299649076507105518992946223028855705189458007533521138703343150937158114114218932400728424949936286443583797118636171187082834662757985896337364138817400612718422265665198024836586611857266616428913152399750688461692677751727389476785588380514444593900569311496880422405988762554852121131345538798688587092154717384294801026132314002251890156123191210398076704434510182202143578810771596233936298462366674592585338029819643973999567268938697218329734244529139548760101393715777276776940762681748317493543343685273831243829694914274003574509516149595004243952747746644961308054952235256037171151695870643020625268635139422461824974663101258586488528601193378268634713686606488503649923013225514905688326248009253372769118830036659383418890729585564557376820890036155588551064419189532686009173215470250197488274429655669070803391973941917017493224972246331391152287082983301776505925295294164201606063028946348118492358755684668733095242911870636074134633575423928967453742150728552560370847186174905012586984090885433727025000206871702482359563400504600567763564582739694873656581728461491373440639163666040518508819641244084238867282549191870081112768586762540287977817548140346798817430775010275964061529114139424317686620296832033309265702409802876815255731607798400127673166880859281784259402995434972992131101158600882460475931695668710417351337637612478180964570698492610372677176847071937542439765750578751925220375723373827393178629810215549480885217514819316424426943459039642952096990941480059597449017550988311939357225101582029418355438775525606571176735588489070335070244453533520858832311313682516805060002632168734723995449881138047136306876918900826798316113276424022400544205104057777588615149030045126315192448561606146254432070045197349283823967140032987449249831755565764939530383006495743
e = 65537
c = 1093256121418811691349633884423021356633978134292966489553874542781791238358295335426668415023166027954996625051420577493667824501649432869528057686451750288316816910397382629774298441937547233956753065529097877191699918039115202957337087658469098304374696277563020457331278140075969310150315715843020746656167994646063024677105714238622574336597601173953997036582942407796229805377339006787815702404915271846770376106312644390819144016155830513829761647568620243654068928415623802444953011361211378013499713469372806125474734994287518083907329841838337717556241874324440340626885553763322954232400855565339807071892321582386180978536483407197865884342435897670134641970372091590178581326892854820705050227840462139458418313478056939546089488178689697927788133612008061739961796780717135680690059059843521460548943400440075072549263642778142322553681107266326899389399400224420049958868630481920741293895509509786744023698063926664818702849276103941412666213912301512015982875337927624885673329513416992222855651023180889148449319496283772492522626881480405730489310544315066415406419791190663101607618436762339809465699249346219280236246798494923574248758432354732450859901402315454165220861852940020724189284384978436094976303046718818115920223875761763369205054892082583399430768426962644539683767683622215674622364530161306440520074932775203726898254313918302918158338893115967835907921400822151110065285755016823481526036112086877396184474779772672777884312990976267562132296839364269838737667955289273381304280292531609850947774380025541448760290985029328831136155532030110660328741793152955524993218772392841301083853407843632521944959421101063922926408630857942155173553265649994782728054809833578075255522763473867570242922191690258610960429527917825954799350243215320860648845823888406079144360733120892758516436394283721941074591992068709056978434144249946370176209580261992712491146585486352865467853012283982569783829897373148685163663183813646084064010686825626422454984021416402862127889251773565118407053577546260937996800783904867497317512257427384881412920876851185681901360445996414854617735746124849305097724462381788049919520369827437945533718238301976608693210822883549849346914749712641177399278642094159972818771839223940037362062271618565492364129165948546330822175641999869293182574801410909568799887485687799830413460992606782188190161078789803079204468693865791568886757702397226751678303106993202727687413409748299454409517072068313199302592993167348776456703605936302216362148170559954097296263965296226759555059786981274338884349876203756741105449671416827010661253266421028866463837188482523849379185098341631154586750782372250753953789082447013115491415875557484766163997419331193733180948335725001700381759888109481542481560084404144004112246764995544553798311119720361550478239142333177065617369951724788288789091898104014990085985609531302672876148454755584802296948087896190960286862545509803680907635139069769773489974690789281850253441901658186053827023495071972754442328786102677924620742574365171969462047797683507872502560411636054630326651806741191565960549277521714122075001246821117983391397806797612028499867676071294152880791421912694378781390703123405056446531600817818157671340725736220061182015810279092548335683818151707498767164622121926625237321182816937233802267205025138008023815746402851176062360192537976175702542328058732539514446727425707394730057315691659046002877368113680075447504177622678838170749340265685373340874438362777036176293805138792214226140580946132386530852126980325547324038761178186444019589823730620635017784138099601753640268173837644549341739416563571709247391327046697023194351531203111048984847048754457714313305254115325718812624677601983165234723923006394872649966184045387413721873049174098054565879297120256469204258468893249797880459716409176351490537
primes = [255675877315683439181791416047922719357, 180461111025833129025002455435975940971, 337490274732450824975483083220272824199, 304456281514261901091507788207898547903, 254797576342247974393400562686432925229, 183131976400038388097951032415099792851, 187104898097787470482482874168168046723, 300625339408843701719323023799725058313, 293895810597575199851257228961757849961, 197370673648293754589174456296168807801, 214231100175566513755789399545798257027, 299940533764670809123600295354236009687, 329911008919678926860313614132444450849, 292789028093982326052555296040896616647, 267992025172569093811940290026790452689, 192120589915828510906490323831586947847, 208470412662206941915861109996165224771, 195723355777376859063723356742829282943, 195479450259644250739997899829659598467, 225273608271867864202603965232709350643, 297983612753980801299047698668400172129, 289863711883286870918208567358762217117, 320181619705477005993614485764800027801, 274756647552045078797369358162815740121, 208678800821922117897086572764543689257, 274510151199776127157320013074195989531, 270061041585244138305865647463819178071, 231693016600939448457585159254864460211, 221276763231716810367704255896280432977, 284588387935614601031451184436365997027, 190107678698149330362585520776807817237, 244360771516251060479861295353775315223, 184597108435320085388683362929647254859, 214993743235105601056961433866767506839, 319622401044815459679561340300419077137, 312048738778225034570138647462191322423, 192343262692325176379644178905323471293, 217411522139037534713431287902356703153, 203269104665429435826852242437943175799, 197694542080431775212389192687346023837, 170754527923440727794804968936874697237, 199565850096248778954713726823038799169, 329479041983980219266962570620791190271, 336543942677902368237166971184411120319, 296349049540412710059375861980880864529, 276958785496368109105253052397588113011, 236061938563845834433725013690718000077, 175132351377019405283465079997063887583, 210382170435243156571657554946080029177, 179295658173078371976938970235081809653, 221499702407155816778095037176350210511, 273750615951477382944958796366722325273, 215400010676152024850087488645214675509, 242104770580865606729511928881839588399, 237832832377832763447973839385045714547, 240569613888482344825828531593242970283, 188780850815328211058185207879562258749, 236351101956411494065697625496351792553, 234848091988225252588700833488573195973, 216111241348931999833159262144497816823, 248635261568172677022024655836676274851, 175169438550312686771927355949990675153, 222945249317916941175129207081724296809, 272123250140823727659430614318422459467, 321040760103571995807993446246308239643, 244443756627073674223172405572152750757, 231281757931881868821441147678670578293, 212608548905981265953338769409211557953, 262334849743113291736207517444943890093, 221968375825210657749121344978372971509, 284590253068157230941830678792449649633, 300977729071492709020945132474829506297, 305429273614180801706392853095181679257, 335939257455017842008237083398243135951, 294393337682220551877311202846160164539, 300751607582285572452649226924384213987, 177342562402002655670186066181715938647, 314293624358674993004107306426510931177, 192176341797009660053769692734114433539, 219685065300219568101641511794459670373, 311600604660297404708381142674858758433, 189258688382892886748712093669349354607, 265765352209342630144326504781080544103, 233694355945946803066419059858430846563, 223443907562486442160842066195579310831, 182987294835928563972108625144731142337, 214137187246441738588307243392955884313, 251175687278238637206326829923211055529, 280606397834257483599650477170805542213, 233315167891969517243554909836441514543, 189298893622248669462727814260415085983, 248568957395290350328195179867090245057, 292645643756069284722532228739967572339, 179447399460747583275629697319304390429, 179645924152591342445122478862459911921, 332356391092472452305991116186146584177, 245901581082639772431455170863897420347, 205817781083003905754490509387056092343, 240380627852067724273161876175750141361, 268700167965406311300179029348879484383, 213345040113356686319409599805587957227, 251674200978198716465773971152251242983, 179180641720352444750737502831482762429, 306320532661676131438858609804319013343, 256526510096408769263055362633154848279, 205959060854084755092268947433148347151, 291927192797043538420569211955680836527, 204978877621419749982721876460562600659, 332399656527167823296930534887330184167, 280595736375324905544725725979456898547, 300213915091486506011056425480272542643, 318558817334795356700066397524785435681, 319436460864579377450478049744976231249, 243133148342749788432705330633449318989, 322207542584548294558453923911981520623, 320850760899167598764295789802781069077, 319881693868123342340868542828982909581, 206495732343577870213482544631201066371, 242791194590408310278390962600348350913, 251698935174714138851501858575403291023, 336741296937713120832285756167770151171, 315930741679982320652758472398428972349, 308738538640639393614807292598596283683, 242935142876894679332147837418000898919, 320412254452324446540182603262368766623, 244141238875170898148081089385979949403, 213402860730186872545578995830820087021, 257839149567099022202819187898373109541, 205790643921760418513647126480621419031, 198756405484996593521220520853141427989, 294805620517257214889752595599972901633, 255265348017204260362764409566933677153, 274956788729771493245467759809121243433, 207307664273912902821847768063880326327, 228782470653856387114481087524374601589, 327491405235009262853431015300186498577, 173419211471119738399569200317219003511, 266492438299975532333886393820275910943, 276688137488059756944807773426416608851, 189140053313243747387509835884240226891, 184847492345401269770088588442458737119, 333210953053056282315216794932763359439, 214889588455292527477541347807824233317, 215229626238372443203352172982941095611, 321221012891336284787614820604143303369, 199400757934809114495211412464158118397, 178651685535715756785532928453093603903, 220776757717693008935011794749825325367, 303675938617156800143972318322678387193, 327088681522055240658148530499087069577, 335783766579434559780651762543581106409, 259404300424171457987268194257725139933, 179840475811181163398944717514437142491, 297175485665739288479300848974745531391, 237485053681467543059304786336620370377, 297758270183402970750961370350920892967, 287801215974478613717591686806352676563, 310730027586487200761300572073383664977, 276935537099897424875065059267639595933, 251308797428280999427269663339682237319, 217181290779624781624389434069663308189, 278483889173395237559970658394075421689, 204589549925569581630736863023597052269, 226032820526239722979885626335569166693, 307616487066170583892695494367464641267, 222259520009563764167811735543215104543, 264617923645991453974534495741056598021, 300871024629133281254211035867737539223, 170303240421348821459663263562155031807, 194456703515031789312329705897177851253, 327369717787718586651743316493134914089, 313093229847313153837631186419773330871, 224824444829441039679277741769033772991, 224589292446640473576473771583959436463, 214868884335325091682110394113205785173, 281852933308534953139887124628766315043, 225661596373287038911910532148417025369, 197435393688129783450788260536037003399, 266167151841181488476394288675916455947, 179215005575751890101294918245131012843, 181845510055827963079718687867786713537, 257637102334933109362889675555405989789, 211635849392838491382106919488103885767, 186185061420106956824801515596528043351, 285418977308105637920637161558618377271, 333320927697115374794556799401253359593, 188501857269628483380021948001960729951, 333805438111531260206119448902819218463, 207203219305023873959844954660799240249, 243125622633677038874854389025310242579, 216464412848635515952075334791481048513, 215209416857176076836597526059188595229, 214612926530046226231879587951703041239, 211839237456343309131155436452991652823, 243378322702585683775212046627894119463, 300569560524099180847101362636309727649, 277442530432004673254582623587364635427, 264039335285085705456044566498360689059, 336941745040225044220256680095943361963, 294351957900120820634469984437616730183, 193397784957516885417425615607279607259, 172625665034500456784052580259369183617, 171214762299612221823796960282578324943, 194792374409055048312123241531481499583, 214020514849615741103085838425694524869, 217152285242353248407824271751534124093, 310504460995069986330272047239018516719, 257283037178296965441561511618312400677, 196379023990504203398232036900292068109, 208338219265141175146204974249461481119, 180313228114558484028748815066535513471, 293814076002148382129879416847624489347, 217981245083649644743701945778358819867, 198894611219128734462943250308461071371, 190754795019022912784187412387261424293, 273263914687122798746013275553691541621, 319875887014797059887738138214903974573, 280433942775269696096083027024527213553, 339832090471957335839878188583478605273, 245482340001475388718217992653932933781, 195945871414379770821529324478394520901, 203621853598394319877751491201563422297, 285527901432745514886361613743984147931, 284721811618834957831167749970526496317, 327215978662725442740036051250620691291, 221299321558362891869402561537662340987, 252585072729486722478056993406814970147, 280264567326332248237425051940201458271, 241027648066340372998036400876879511133, 209093079608768177230455678431608454539, 340235244837800791530469709812216931327, 318370869089270734010914463566452904391, 218007259061353959833958121965586715759, 320702628326860753372843359167209806577, 280574097974570759348625351607802595079, 228292038707075332622237132594473246261, 246482905608669854259984848561724759323, 281771843261446623855706740146832822043, 241444581355719829115072364769273312223, 309029268537775236744873599480649785803, 293169195958605701684834829075351077843, 240056552101889027428780330876207267181, 206667506718454166578882634113592471317, 295377459264316749259598713099825801289, 334341534141831513237527215426279900591, 263440016933436744959242384953581131709, 327921668846632014434297416582771393151, 179743859120339282852666034250891124503, 212172965192102954961276830300925726343, 325170702322845184523697390427992449689, 271105603309076479942153666379400527383, 271642757529104184378772507234018239527, 244844048330592276234702305193952823371, 270007525941420385852467420335121485863, 290899364033417721623974853950097454643, 279919385326960469749295500025219756669]

factors = []
for i in primes:
if n%i == 0:
factors.append(i)
print(factors)

n1=255675877315683439181791416047922719357
n2=180461111025833129025002455435975940971
n3=337490274732450824975483083220272824199

n = n1*n2*n3
Phi = (n1-1)*(n2-1)*(n3-1)
d = gmpy2.invert(e, Phi)
m = pow(c, d, n)
print(long_to_bytes(m))

4.basic:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
from pwn import *
from Crypto.Util.number import*
import base64
import binascii
io = remote('challenge.basectf.fun',47391)

se = lambda data: io.send(data)
sa = lambda delim , data : io.sendafter(delim,data)
sl = lambda data : io.sendline(data)
sla = lambda delim,data : io.sendlineafter(delim,data)
sea = lambda delim,data : io.sendafter(delim,data)
rc = lambda numb=4096: io.recv(numb)
rl = lambda:io.recvline()
ru = lambda delims: io.recvuntil(delims)

for _ in range(100):
option = rc().strip()
print(option)
enc= rc().strip()
print(enc)
if option == b'A':
secret = base64.b64decode(enc)
if option == b'B':
secret = bytes.fromhex(enc.decode())
if option == b'C':
secret = long_to_bytes(int(enc))
if option == b'D':
secret = eval(enc.decode())
secret = ''.join(chr(i) for i in secret)
secret = secret.encode()
io.sendline(secret)

flag = rc().strip()
print(flag)


io.interactive()

5.try_to_factor:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
from Crypto.Util.number import *

N = 162692163428762295773992659007654377270271126313772302197255271375236131917158614424426498628778734679898165422129699410934825650141972454562350664161510689489443251515884304101827584411577749250383438126881931889798597627663578045519256806107514170414321556291545302688028088470848270636776466672843710163017531472049823632822203461654253767303314505996071453898533003519236112138591066133289040889933161978131399309340741554076140734156174295730180874473301361701867633594222054688204666518058106672165786417002466165926062199279674267145233283545524775943767021416906072142236079753359492846480515376121887507681663761713445807717270089017438999615422884163666812016989696908657065537508715229685120221307021151610089917537155165897740417480127289719971512938348936259
c = 113962118676826667648935023618252851875440854724310328843964819392166304653581141146631375503931008732348730639629174670963727399860571217264854300057305570824097216782800531930906801885967717639795643406206813677461127762087560021634738167845077869308515223303820469892552545806179267969169748886980836435095
gift = 863514692222931709925579242743251211976114217396765747601042357918763818732391790491059528595917786523674732369068315533549380754409535403506339052401422249684188032949680148055803474336983973622610403448963752802490806614810077181934627694570685722842963961551889267501616799757825675192653489096007790143775773378495299981666657347802233798206597104474595281241837323214457344961462510183726339545608046357281265026013496037522835659867389206279894057481600882665189079672009577651494435000349624334685832217586703242422260870866432379257259316411280539845741932725104662417642890238587876489774492067722351467773093391502588019563488688309892102039611978767690653206664257400163618467825666105966072942726011447079204869750153256054140924951306811971422635104088608275908232688385437145325481792836532453258784103533536292492138405929815964841772656055397705840797739586953744563989819811944946916720655079908564653686456283647030055622241840292127096994325415897266379446446435164189216562921252341705747891518007710533906231225283309180960546212899099652226954393826875
fac=[]

for i in range(2,10):
tmp=GCD(N, pow(i, gift,N)-1)
if isPrime(tmp) and tmp not in fac:
fac.append(tmp)
else:
for f in fac:
if tmp%f==0:
tmp//=f
if isPrime(tmp) and tmp not in fac:
fac.append(tmp)

for i in range(2,10):
tmp=GCD(N, pow(3, gift*2**i,N)-1)
if isPrime(tmp) and tmp not in fac:
fac.append(tmp)
else:
for f in fac:
if tmp%f==0:
tmp//=f
if isPrime(tmp) and tmp not in fac:
fac.append(tmp)

for p in fac:
for q in fac:
if b'BaseCTF' in long_to_bytes(pow(c, inverse(65537, (p-1)*(q-1)),p*q)):
print(long_to_bytes(pow(c, inverse(65537, (p-1)*(q-1)),p*q)))

6.mid_math2:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#Sage
from Crypto.Util.number import *

MAT=[[9194428734244577957135736828947112370812209206819996917633266069359894211949655026549592464237531352518967649750275097282532736237822915630766535634248987628113137246739472264614337707439494149796414126558156060870508338278038269649101921703583149322486905552569052814106532234864028314925118581658029792157851338427975728108000711353532410024128431635933014226306706319591106081211872,
7052600738698435126221697697810087514520765619736355003187836563546493264420232197860875416948961661231812045406188307561458872254314061097960625042149316957446344556490001927621879295417925720004568332344856366002394724202261454916368122811414228043610804718983599804179657247820737462743875143882925818085495573474169110616761320858675303922740882169073395416895304752909979711051264,
13094262565727554986668133240216117564284263232131011542877585146452802164148464500319291219458081531317231044962383872061004846788004747813785963603455919882739054992075130196548494850105124430477756818974520035883861936342117869122455996838023977818945511119955390136020375974150407580576040034808588694313922810340598787633148909527275716235390356737099830131958338026891256778602432],
[7291452286171544741377496447735677778433522048452394999757158120018504601116506253897733192493798837108269469756414516913436198353934250444263790689101779479157541198872731006007031448329354826004420971505929629537584453480285628607579031078497417101681028600589030661495031531644755072500393418929237208836713910921969937998825721580514845395852889662758886414966066733340052235985735,
5592919719754926663830816961667268104316637431189640788304536404157195458040686322901848820171568258023938724485177544141303597034389473064509506247034833050568643394732003598890104462382321956436508366359718039669456303596542945687737870352569084995858128262046585579724537002100295978230177579835256681774512205534970583421138287684468047290246482431883957170924203400422234299829407,
10384135162743100269852365857770153822630076412853981379757028821332622753962517667857057209221058533163475030678127399042436975886694593504673386134198042731671320468065688239424934644173240507619471360908786669070898288638067852779718549009532013299792474712979659423962779677856135791013599792822988457540442172903145046394648862567656330868441373023488569784114231877910285319620037],
[34946383530632295853235791100380055176686898072752599942691162027311662041417740482507624946631032260410440329949488242706004902881977357811370156793240362927747354453547446315050117795844866771053429455608334265986953931753411938119703800489233043034369650346216548318254326462336573090313788936967898128977445514764945671848611612198443909056919,
26805677375585831510259621878357023272222175103906204143689109861471123435549853025410319713500257027420994041712736040084303902812241806295302385126726161281240831030434347236854521776375408982352155894199700974681768432734155312616453345950508256035721377179651166114898547487082749355033867559583905997404388549346221139007108462958001461826337,
49768956277664050500387501949373949828589012443212214016088015478826178759698946452495063308332332373728223252613132611904477061717762261927498754849913008747980442098787524359755695519989286304445175440218168145037681791003471134417445542856715034633656861298596197935068562189476201463465706711744838395255326376049859058504891392128431832044455]]
enc = 11781599055433308033432930805524658061560499523533841161297213162869735414528038973998414585008473948613388691447093
e = 160907

u13=MAT[0][2]//MAT[2][2]
u23=MAT[1][2]//MAT[2][2]
u12=((MAT[0][0]*u23-MAT[1][0]*u13)//(MAT[1][0]-MAT[2][0]*u23)+u13)//u23

MAT=matrix(MAT)
MAT=matrix(ZZ,[[1,u12,u13],[0,1,u23],[0,0,1]]).inverse()*MAT
a,b,c=list(MAT[0])

print(long_to_bytes(pow(enc, inverse(e, (a-1)*(b-1)*(c-1)),a*b*c)))

week3:

1.没有n啊:

yafu分解c,得到质因数,然后得到phi_c,然后解出n,注意此处由于先是计算c = pow(m,e,n), 然后是 x = pow(n,e,c),所以c是比n小的,此处 n = n+c

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
from Crypto.Util.number import *
from gmpy2 import *

c = 52453423663797600504896811946820841317615798875871627840172711423749946998217916744135290476795328543876098295227017753117609268701786914053599060330837226980969490439739651088710549890669593587642238827462108900683237797139569260570711611781514337884756698142193277516649805710242748531658979160170193283558
e = 65537
d = 54297831548863701092644190086258072883163378307246681513317422545902442650340916001357605211715836911877651782099787873046987096258918495734824011752504203578982947618784736181975847356304742402103468329660346526185908618978851982007496096394151821403282347897417590596861323293706611997134962231129075032641
x = 40635864473997460751766935373772107585133301579524000836637683731949939348171187931595274511243052505604832873086269554842194695737052043633079044688826020656068356561856848814530947955429343483847291398607359454851926470168457852479044154798114087493843073091985855839008222762224952503563764527380033064437

c_list = [
2,3,73,3967,6373,4744823012787277141,95592293,216465863,48245998253859255581546561942142167304434549996919484957120717763726325509833409296170471619434291990255044694414983821250538266717293535917534918221352198192885071310932646412147737114561229291373456448363184353049796801297876664512630305475226391199481032049429
]
phi_c=1

for i in c_list:
phi_c*=i-1

print(phi_c)
d_c = gmpy2.invert(e,phi_c)
n =pow(x,d_c,c)+c
m = pow(c,d,n)
print(long_to_bytes(m))

2.exgcd:

共模攻击,e1e2不互素

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
from Crypto.Util.number import *
import gmpy2

n = 27855350163093443890983002241607629119744539643165776358993469078731521668677421483556132628708836721737685936980427467856642738196111748018522018598646125626995613169001111504706363742194664774823604738939411512861441742683157275818500991834651769368178320088982759626122029956515159435424882855075032400667120376075618896752694718491438251810609878021717559466498493103257912108879328270813061231904227056671621363669388496383136964549879459562004569059185078204867346250733489663015417879915436157806942021693920206071715538430633494012923651469196048546309592946901609803631751035364478773126967010589504275776307
e1 = 3747
e2 = 2991
c1 = 24426579024062518665031958216110619832653602343205488454298659533869220501923184793828421371206493659949730138867555889074137026401207985428160803910695088081370233571905915349589146504374710444468715701305061060934519410886010929009297226496448218819742287990364436349188987723637449590579092391100714056589967894609950537021838172987840638735592599678186555961654312442380755963257875487240962193060914793587712733601168204859917001269928487633954556221987632934190217367502677285906521385169669644977192556145782303526375491484736352799180747403161343130663661867413380222714012960607473395828938694285120527085083
c2 = 6932145147126610816836065944280934160173362059462927112752295077225965836502881335565881607385328990881865436690904056577675885697508058289570333933837515526915707121125766720407153139160751343352211421901876051228566093038929625042619250168565502734932197817082848506826847112949495527533238122893297049985517280574646627011986403578166952789317461581409161873814203023736604394085875778774834314777046086921852377348590998381648241629124408514875110073073851913857329679268519229436092660959841766848676678740851087184214283196544821779336090434587905158006710112461778939184327386306992082433561460542130441825293

gcd, s, r = gmpy2.gcdext(e1, e2)
if s < 0:
s = -s
c1 = gmpy2.invert(c1, n)
if r < 0:
r = -r
c2 = gmpy2.invert(c2, n)
m = pow(c1, s, n) * pow(c2, r, n) % n
m = gmpy2.iroot(m,gcd)[0]
print(long_to_bytes(m))

3.wiener? :

leak = decimal.Decimal((3 * P * Q-1)/(3 * Q * Q))

直接对leak进行连分数展开即可得到P/Q,则分子为P,分母为Q

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#Sage
from Crypto.Util.number import *
import gmpy2
e = 65537
c = 11032748573623426359632659657114807044712138586316710250985606809252700461490504487308849626514319062562557448839550994242999334882617031487618174168038491566640081840111747765753878087564318833273878755416584962921669911444225959335274753391800995531023212276838665202257007640354237043291129197348884914956663597240094662207929658519596987351984403258345205873566463643624175318315064440456858013874962784792564480286904620663695194689839431808082976248378509181327101557380978849545906691903896662095520288964101796965095129861467059775556110616007889846240936219381379219605528051627402300580239311202137582442057
leak = 0.829374344780877053838760251345359097311540811993463349625630085472892814959843248358036249898871908548743719153319438638517170060651237635838827482534816419091949205584951292517303330452910012749674475329235689229498752425379611083979518257734473992186831474208400813283887045691145481237726578827559198828469462343342343287720369159899636816373592067698883361360269728719786071024354151682314608072902347335691012713629816579496252896260869382806838857194293618332286500427694077400072428506897829689703872985954772105672992293334668485358785863779749153981721900135318166811250762946069962348114491411585418993494561587403918162681937152503739843

cf = continued_fraction(leak)

for i in range(1, len(cf)):
q = cf.denominator(i)
p = cf.numerator(i)
if isPrime(p) and isPrime(q):
print(p,q)
n = p*q
phi = (p-1)*(q-1)
d = gmpy2.invert(e, phi)
m =pow(c,int(d),n)
print(long_to_bytes(m))

4.没有n啊 _pro:

5.ez_log:

用sage里内置的log可以解 z = y^x^ mod n 中的x,然后AES解密

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
#Sage
from Crypto.Util.number import bytes_to_long as b2l, long_to_bytes as l2b, getPrime
from Crypto.Cipher import AES
import gmpy2

pad = lambda x: x+b'\x00'*(16-len(x)%16)

def decrypt(KEY,ENC):
cipher = AES.new(KEY, AES.MODE_ECB)
decrypted = cipher.decrypt(ENC)
return decrypted

enc = 33416570913716503492297352041317858420349510954381249751537743898024527101872454706181188441210166165803904185550746
y = 82941012
n = 228338567
z = 51306718

F = GF(n)
x = discrete_log(F(z),F(y))
print(x)

x = 38806815
key = l2b(Integer(x))

enc_bytes = l2b(enc)
flag = decrypt(pad(key),enc_bytes)
print(flag)

week4:

3.rabin:

e=4,如果是一般的rabin算法的话e要求为2,此处只要在最后求解出的m处开个平方根即可

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
from Crypto.Util.number import *
import gmpy2

p= 8531212975719216550108614256955774722172741885676113601617182716356239301381951899737237219659253655889636684200345109462928796329670321336864298557778843
q= 7443256287912111739335729314443559886458007838130371799255078565502662459436043455787869631999073617967343884377537828940738213460508765519478956421282871
n= 63500004625039456439237191267891267558404574431112995926594213383621331385226487443753506088788203040258384788149958095020759745138424276657604371402824844725005596890673468964961037168078105356669148960568974603581485045691990626520286184874115519591663033533771400334558853058140717812903874350138362098253
c= 51452608438757130697131508192775727191605112918772187364577097224326062184288501602000700342623122861398852536963355962672293705131887315354242193416090384360837672258861475017098419459125395949090523474744886423754439919504732741712693909507972791203801494594878447921609420574365853676576693694677914169353
e= 4

def rabin_decrypt(c, p, q, e=2):
n = p*q
mp = pow(c, (p+1)//4, p)
mq = pow(c, (q+1)//4, q)
yp = gmpy2.invert(p, q)
yq = gmpy2.invert(q, p)
r = (yp*p*mq + yq*q*mp) % n
rr = n-r
s = (yp*p*mq - yq*q*mp) % n
ss = n-s
return (r,rr,s,ss)

m = rabin_decrypt(c, p, q)

for i in range(4):
try:
print(bytes.fromhex(hex(gmpy2.iroot(m[i],2)[0])[2:]))
except:
pass

buuctf-2023:

week1:

1.Caesar’s Secert:

凯撒加密,偏移为5

flag{ca3s4r’s_c1pher_i5_v4ry_3azy}

2.Fence:

栅栏加密,栏数为2

flag{reordering_the_plaintext#686f8c03}

3.brainfuck:

brainfuck加密

flag{Oiiaioooooiai#b7c0b1866fe58e12}

4.Vigenère:

维吉尼亚加密,密钥为kfc

flag{la_c1fr4_del_5ign0r_giovan_batt1st4_b3ll5s0}

5.babyencoding:

第一段为base64加密,结果为flag{dazzling_encoding#4e0ad4

第二段为base32加密,结果为f0ca08d1e1d0f10c0c7afe422fea7

第三段为UUencode加密,结果为c55192c992036ef623372601ff3a}

6.babyxor:

单步异或

1
2
3
4
5
6
7
from pwn import xor

string=bytes.fromhex('e9e3eee8f4f7bffdd0bebad0fcf6e2e2bcfbfdf6d0eee1ebd0eabbf5f6aeaeaeaeaeaef2')

for i in range(256):
if b'flag' in xor(bytes([i]), string):
print(xor(bytes([i]), string))

7.babyrsa:

提供了n,c,e,且n的位数不大,可以直接利用sage的factor()分解,用euler_phi()计算得到Phi

image-20240811153403433

1
2
3
4
5
6
7
8
9
10
11
12
13
from Crypto.Util.number import *
from sympy import *
from gmpy2 import *

n = 17290066070594979571009663381214201320459569851358502368651245514213538229969915658064992558167323586895088933922835353804055772638980251328261
c = 14322038433761655404678393568158537849783589481463521075694802654611048898878605144663750410655734675423328256213114422929994037240752995363595
e = 65537

Phi = 17290065983330319066216184030777067976382697670733255200004943703459332462321021486252411405242719735544959857825124088104221030960082400051200
d = invert(e, Phi)
m = pow(c, d, n)
print(long_to_bytes(m))

8.Affine:

仿射加密Affine cipher:

加密函数e(x) = ax+b (mod m)

解密函数d(x) = a^-1 *(x-b) (mod m)

求乘法逆元的公式子a*a^(-1) (mod m) = 1

字母含义及加密条件:

  1. a和m互质
  2. m为字母数,即m = 26
  3. b为移动大小
  4. a^(-1) 是乘法逆元
  5. mod是求余的意思

image-20240811192528561

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
from Crypto.Util.number import *
from sympy import *
from gmpy2 import *

f = b'flag'
aa = -1
bb = -1
for a in range(256):
for b in range(256):
if(a*f[0]+b)%256 == 0xdd and (a*f[1]+b)%256 == 0x43 and (a*f[2]+b)%256 == 0x88 and (a*f[3]+b)%256 == 0xee:
aa = a
bb = b
break

data = b'dd4388ee428bdddd5865cc66aa5887ffcca966109c66edcca920667a88312064'
for i in range(0,len(data),2):
print(chr(((int(data[i:i+2],16)-bb)*invert(aa,256))%256),end='')


9.Small d:

e过大,d很小,可以通过算法快速得到d的值

image-20240811192440508

1
2
3
4
5
6
7
8
9
10
11
12
13
from Crypto.Util.number import *
from gmpy2 import *
from RSAwienerHacker import *

c = 6755916696778185952300108824880341673727005249517850628424982499865744864158808968764135637141068930913626093598728925195859592078242679206690525678584698906782028671968557701271591419982370839581872779561897896707128815668722609285484978303216863236997021197576337940204757331749701872808443246927772977500576853559531421931943600185923610329322219591977644573509755483679059951426686170296018798771243136530651597181988040668586240449099412301454312937065604961224359235038190145852108473520413909014198600434679037524165523422401364208450631557380207996597981309168360160658308982745545442756884931141501387954248
e = 8614531087131806536072176126608505396485998912193090420094510792595101158240453985055053653848556325011409922394711124558383619830290017950912353027270400567568622816245822324422993074690183971093882640779808546479195604743230137113293752897968332220989640710311998150108315298333817030634179487075421403617790823560886688860928133117536724977888683732478708628314857313700596522339509581915323452695136877802816003353853220986492007970183551041303875958750496892867954477510966708935358534322867404860267180294538231734184176727805289746004999969923736528783436876728104351783351879340959568183101515294393048651825
n = 19873634983456087520110552277450497529248494581902299327237268030756398057752510103012336452522030173329321726779935832106030157682672262548076895370443461558851584951681093787821035488952691034250115440441807557595256984719995983158595843451037546929918777883675020571945533922321514120075488490479009468943286990002735169371404973284096869826357659027627815888558391520276866122370551115223282637855894202170474955274129276356625364663165723431215981184996513023372433862053624792195361271141451880123090158644095287045862204954829998614717677163841391272754122687961264723993880239407106030370047794145123292991433

d=hack_RSA(e,n)
flag=long_to_bytes(pow(c,d,n))
print(flag)


10.babyaes:

解密 flag 我们需要获取到 key 和 iv 的值,由条件:

key=os.urandom(16)*2

iv=os.urandom(16)

可知:key是32bytes,256bits ;iv是16bytes ,128bits

key^iv ,那么只有 iv 与 key 的低128位相异或,所以 key 的⾼128位是固定不变的

所以 xor 的⾼128bits,就是 key 的⾼128bits,进⽽可以得到 key 的所有值256bits。

之后 key 的低128bits,与 xor 的低128bits 相异或,所得结果就是 iv 的值了

得到 key , iv 后就可以直接⽤aes.decrypt()来解密了

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
from Crypto.Cipher import AES
import os
from Crypto.Util.number import *


def main():
xor = 3657491768215750635844958060963805125333761387746954618540958489914964573229 ^ 1
out = long_to_bytes(xor)
key = out[:16]*2
iv = bytes_to_long(key[16:]) ^ bytes_to_long(out[16:])
iv = long_to_bytes(iv)
ciphertext = b'>]\xc1\xe5\x82/\x02\x7ft\xf1B\x8d\n\xc1\x95i'
cipher = AES.new(key, AES.MODE_CBC, iv)
flag = cipher.decrypt(ciphertext)
print(flag)

if __name__ == "__main__":
main()

week2:

1.不止一个pi:

根据简化剩余系与欧拉函数的性质:

​ 设a=p~1~^a1^p~2~^a2^……p~k~^ak^,则

​ φ(a) = a(1-1/p~1~)(1-1/p~2~)……(1-1/p~k~)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
from Crypto.Cipher import AES
import os
from Crypto.Util.number import *


q = 115478867870347527660680329271012852043845868401928361076102779938370270670897498759391844282137149013845956612257534640259997979275610235395706473965973203544920469416283181677660262509481282536465796731401967694683575843183509430017972506752901270887444490905891490955975762524187534052478173966117471143713
p = 171790960371317244087615913047696670778115765201883835525456016207966048658582417842936925149582378305610304505530997833147251832289276125084339614808085356814202236463900384335878760177630501950384919794386619363394169016560485152083893183420911295712446925318391793822371390439655160077212739260871923935217
c = 4459183928324369762397671605317600157512712503694330767938490496225669985050002776253470841193156951087663107866714426230222002399666306287642591077990897883174134404896800482234781531592939043551832049756571987010173667074168282355520711905659013076509353523088583347373358980842707686611157050425584598825151399870268083867269912139634929397957514376826145870752116583185351576051776627208882377413433140577461314504762388617595282085102271510792305560608934353515552201553674287954987323321512852114353266359364282603487098916608302944694600227628787791876600901537888110093703612414836676571562487005330299996908873589228072982641114844761980143047920770114535924959765518365614709272297666231481655857243004072049094078525569460293381479558148506346966064906164209362147313371962567040047084516510135054571080612077333228195608109065475260832580192321853906138811139036658485688320161530131239854003996457871663456850196483520239675981391047452381998620386899101820782421605287708727667663038905378115235163773867508258208867367314108701855709002634592329976912239956212490788262396106230191754680813790425433763427315230330459349320412354189010684525105318610102936715203529222491642807382215023468936755584632849348996666528981269240867612068382243822300418856599418223875522408986596925018975565057696218423036459144392625166761522424721268971676010427096379610266649911939139451989246194525553533699831110568146220347603627745407449761792135898110139743498767543521297525802809254842518002190381508964357001211353997061417710783337
e = 65537

n=p**3*q**2
Phi = p**2*(p-1)*q*(q-1)
d = inverse(e, Phi)
m = pow(c,d,n)
print(long_to_bytes(m))

2.Rotate Xor:

round_rotate_left:实现了将 num 的最高 step 位移动到最低 step 位的位置,同时保持其他位不变。

根据加密手搓解密脚本即可

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
from Crypto.Util.number import *
from pwn import xor

ROUND = 12
k2 = 9982833494309156947
ciphertext = b'\x8dSyy\xd2\xce\xe2\xd2\x98\x0fth\x9a\xc6\x8e\xbc\xde`zl\xc0\x85\xe0\xe4\xdfQlc'
enc_k1 = 7318833940520128665
def round_rotate_right(num,step):
return (num >> step) | (num << (64 - step)) & 0xffffffffffffffff


def decrypt_key(key):

for _ in range(ROUND):
key = round_rotate_right(key ^ k2, 3)

return key

k1 = decrypt_key(enc_k1)
flag = xor(ciphertext,long_to_bytes(k1))
print(flag)

3.滴啤:

给了 p*q=nd mod (p-1)=dppow(m,e,p*q)=c

image-20240807203058349

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
from Crypto.Util.number import *
from pwn import xor
import gmpy2
import sympy

n = 93172788492926438327710592564562854206438712390394636149385608321800134934361353794206624031396988124455847768883785503795521389178814791213054124361007887496351504099772757164211666778414800698976335767027868761735533195880182982358937211282541379697714874313863354097646233575265223978310932841461535936931
c = 52777705692327501332528487168340175436832109866218597778822262268417075157567880409483079452903528883040715097136293765188858187142103081639134055997552543213589467751037524482578093572244313928030341356359989531451789166815462417484822009937089058352982739611755717666799278271494933382716633553199739292089
dp = 307467153394842898333761625034462907680907310539113349710634557900919735848784017007186630645110812431448648273172817619775466967145608769260573615221635
e = 65537


def get_q(e, n,dp):
for x in range(1, e):
if(e*dp%x==1):
p=(e*dp-1)//x+1
if(n%p!=0):
continue
q=n//p
return q

q = get_q(e, n, dp)
p = n//q
Phi = (p-1)*(q-1)
d = inverse(e, Phi)
m = pow(c, d, n)
print(long_to_bytes(m))

4.halfcandecode:

p,q很接近,可以用yafu分解,也可以q=next_prime(gmpy2.iroot(n)[0]);p=n//q得到,进而得到前半部分的flag

后半则进行md5爆破

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
from Crypto.Util.number import *
from pwn import xor
import gmpy2
import sympy
from hashlib import md5
from string import printable


p = 10631151190024160908870967192522097752991652918777416177941351782447314225123009693276679810786266997133099934443701772661928189884235742113123409596993841
q = 10631151190024160908870967192522097752991652918777416177941351782447314225123009693276679810786266997133099934443701772661928189884235742113123409596993409
e = 65537
n = 113021375625152132650190712599981988437204747209058903684387817901743950240396649608148052382567758817980625681440722581705541952712770770893410244646286485083142929097056891857721084849003860977390188797648441292666187101736281034814846427200984062294497391471725496839508139522313741138689378936638290593969
c1 = 43054766235531111372528859352567995977948625157340673795619075138183683929001986100833866227688081563803862977936680822407924897357491201356413493645515962458854570731176193055259779564051991277092941379392700065150286936607784073707448630150405898083000157174927733260198355690620639487049523345380364948649

md5_hash = [
'4a8a08f09d37b73795649038408b5f33',
'03c7c0ace395d80182db07ae2c30f034',
'e1671797c52e15f763380b45e841ec32',
'b14a7b8059d9c055954c92674ce60032',
'e358efa489f58062f10dd7316b65649e',
'cfcd208495d565ef66e7dff9f98764da',
'b14a7b8059d9c055954c92674ce60032',
'8fa14cdd754f91cc6554c9e71929cce7',
'0cc175b9c0f1b6a831c399e269772661',
'4a8a08f09d37b73795649038408b5f33',
'e358efa489f58062f10dd7316b65649e',
'cfcd208495d565ef66e7dff9f98764da',
'4b43b0aee35624cd95b910189b3dc231',
'cbb184dd8e05c9709e5dcaedaa0495cf',
]

d=inverse(e,(p-1)*(q-1))
m=pow(c1,d,n)
print(long_to_bytes(m))

mm=''

for h in md5_hash:
for p in printable:
if md5(p.encode()).hexdigest()==h:
mm+=p
print(mm)

5.partial decrypt:

m = c^d mod n

中国剩余定理可写成:

m1 = c^d mod p

m2 = c^d mod q

这时候n的位数降低了,但d的位数依旧很大

利用欧拉函数:

c^d mod p = c^(d mod phi(p)) mod p = c^(d mod (p-1)) mod p

同理:

c^d mod q = c^(d mod phi(q)) mod q = c^(d mod (q-1)) mod q

dp = d mod (p-1) = e^(-1) mod (p-1)

同理 dq = d mod (q-1) = e^(-1) mod (q-1)

m1 = c^dp mod p

m2 = c^dq mod q

最后RSA的求解过程为:

qlnv = q^(-1) mod p

h = qlnv * (m1-m2) mod p

m = m2 + h * q

最后的求解过程可以写成:

S = CRT(m1,m2) = m2+((m1-m2)*(q^(-1) mod p))*q

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
from Crypto.Util.number import *
from pwn import xor
import gmpy2
import sympy
from hashlib import md5
from string import printable


e = 65537
q = 7325294399829061614283539157853382831627804571792179477843187097003503398904074108324900986946175657737035770512213530293277111992799331251231223710406931
h = 4180720137090447835816240697100630525624574275
m2 = 4816725107096625408335954912986735584642230604517017890897348901815741632668751378729851753037917164989698483856004115922538576470127778342121497852554884

m = m2+h*q

print(long_to_bytes(m))

week3:

1.Rabin’s RSA:

e=2,且结合题目,是**Rabin加密**

先yafu分解出p,q

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
from Crypto.Util.number import *
from pwn import xor
import gmpy2
import sympy
from hashlib import md5
from string import printable


p = 14450452739004884887
q = 13934102561950901579
n = 201354090531918389422241515534761536573

e = 2
c = 20442989381348880630046435751193745753

def rabin_decrypt(c, p, q, e=2):
n = p*q
mp = pow(c, (p+1)//4, p)
mq = pow(c, (q+1)//4, q)
yp = gmpy2.invert(p, q)
yq = gmpy2.invert(q, p)
r = (yp*p*mq + yq*q*mp) % n
rr = n-r
s = (yp*p*mq - yq*q*mp) % n
ss = n-s
return (r,rr,s,ss)

m = rabin_decrypt(c, p, q)

for i in range(4):
try:
print(bytes.fromhex(hex(m[i])[2:]))
except:
pass

或者利用轩禹CTF-RSA工具中自带的rabin算法:

image-20240813105140497

2.babyrandom:

LCG伪随机数的参数恢复

附件中可见:

1
2
3
4
5
def GetRandom():
global x
nx = (a*x + b) % p
print(nx)
x = nx

利用线性同余得到随机数

image-20240813153356546

有结论

a = (X~n~+2 - X~n+1~)(X~n+1~ - X~n~)^-1^ (mod m)

b = X~n+1~ - aX~n~ (mod m)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
from Crypto.Util.number import *
from pwn import *
import sympy
import gmpy2
p = 64999433139797068147576269731948390094958654326970231465808792590598519729077

r = remote('node5.buuoj.cn',28410)
r.sendlineafter(b'> ',b'1')

x = []

for _ in range(3):
r.sendlineafter(b'> ',b'2')
x.append(int(r.recvline().strip().decode()))

a = (x[2]-x[1])*inverse(x[1]-x[0],p)%p

b = (x[1]-a*x[0])%p

flag = ((x[0]-b)*inverse(a,p)) % p
print(long_to_bytes(flag))

3.knapsack:

4.小明的密码题:

Coppersmith攻击(已知m的高位攻击)

C = m^e mod N

并且我们假设我们知道m的很大一部分m~0~,即 m = m0+x,但是我们不知道x。

e足够小,且部分明文泄露时,可以采用Coppersmith单变量等式的攻击:

c = m^e mod n = (mbar + x0)^e mod n

其中 mbar = (m>>kbits) <<kbits

当|x~0~|<=N^1/e^时,可以在log N和e的多项式时间内求出x~0~

1
2
3
4
5
6
7
8
9
10
11
12
13
14
#Sage

from Crypto.Util.number import *

n = 131889193322687215946601811511407251196213571687093913054335139712633125177496800529685285401802802683116451016274353008428347997732857844896393358010946452397522017632024075459908859131965234835870443110233375074265933004741459359128684375786221535003839961829770182916778717973782408036072622166388614214899
c = 11188201757361363141578235564807411583085091933389381887827791551369738717117549969067660372214366275040055647621817803877495473068767571465521881010707873686036336475554105314475193676388608812872218943728455841652208711802376453034141883236142677345880594246879967378770573385522326039206400578260353074379
e = 5

part = bytes_to_long(b'sm4ll_r00ts_is_brilliant#')
x = PolynomialRing(Zmod(n),'x').gen()
f = ((part<<64)+x)**e - c
xx = f.small_roots(X = 2**64)[0]
flag = (part<<64) + xx
print(long_to_bytes(int(flag)))

5.Door:

6.eazy_crt:

RSA-CRT fault attack:

image-20240814152051848

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
from Crypto.Util.number import *
from hashlib import *

m=2180240512138982889935733758776025289492848542072999905411903898302427496814336475436552230920326681809745778470583226987
n=25505131259827344749407187081729819350996141100990518281765117676936124636084125400315049858697199427401342785804654120926568235761577895862889807660442415521870277729420875825744007886870384790308986342360349597392841568418588521694478184632631896474390291958350681472768485356865513284619086754437723630874827593280089682939629265210875169009057935264259019861755270570945614034505771690412042781423771110441028258110022746603974882162934979726300741541857444013708508946471384525030286343828680432038605288717842755346907256658746733811881247992925881684393431852248253701825024590345480994598867741811599162649467
S_=5510086561842250138908875342533294108331951659612671466695801343686972919443402163401521040457640602756777910081639191753436122171756174730531385913865951826869995984787102439679170684422717808771260217541439878677750508065703064081375473845405916674327932798153100574555933448570618732842365795738120491532398081467312017203933413296779070611024124965772787502242499016884537233028947865288037718074352448773759363242111080540630360902388540661831992776707600133253329779003707938065020121645530719140954554800986771763343191398210100325971573069812381693089384221441735278736889673500218274673196333806222266248844379127652366
S=11422623501509574650959962952004985925543723972567988534433510888436662069119800576321679344425052011563473005275801787271861671898318523033415642388512047035650991047953319601346912194462122313366888126100093635969476696871403883687946617575837061694813669883782221006701704487938500886952347003631626326127154081787016692856628561200386941683756397734100698520464199249811238013146899352390453500132666840606585760306723894654933077094375810666168464835756607377998959675132305971721109661644231613426322675350973373434138686086023265910883509514575554429502214217460059521619625693750938117427832654792355808803321
e = 65537

p = GCD(pow(S_,e,n)-m,n)
q = n//p


print('flag{'+md5(str(q).encode()).hexdigest()+'}')


DASCTF2024八月开学季!

1.EZsquares:

1
2
3
4
5
6
7
8
9
10
11
12
#Sage
from Crypto.Util.number import *
from gmpy2 import *
n0 = 192573744538639130845868727014075967669513667763315934161849620531683536696376138303320681922782003088094539724238109116416456294472461075668568088688287209898850985024632463251984323888765249950269595045648435192047990940593817086918399212487934262786817996341234806934640246045717955941049031252181676005098
c = 1541487946178344665369701061600511101386703525091161664845860490319891364778119340877432325104511886045675705355836238082338561882984242433897307540689460550149990099278522355182552369360471907683216881430656993369902193583200864277424101240184767762679012998894182000556316811264544736356326198994294262682
e = 65537

p,q = two_squares(n0)
Phi = (p-1)*(q-1)
d = invert(e,Phi)
m = pow(c,d,n)
print(long_to_bytes(m))

SU2023:

1.sign1n:

题目给了WHATF等式,等式两边同乘e3即可求出kphi,尝试用kphi和n分解n;其次在gift函数中容易得到r=2,若r不为2则输出结果必为合数。然后就是已知kphi,分解n

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
from Crypto.Util.number import *
from gmpy2 import invert
from random import randrange

def factorize_multi_prime(N, phi):
"""
Recovers the prime factors from a modulus if Euler's totient is known.
This method works for a modulus consisting of any number of primes, but is considerably be slower than factorize.
More information: Hinek M. J., Low M. K., Teske E., "On Some Attacks on Multi-prime RSA" (Section 3)
:param N: the modulus
:param phi: Euler's totient, the order of the multiplicative group modulo N
:return: a tuple containing the prime factors
"""
prime_factors = set()
factors = [N]
while len(factors) > 0:
# Element to factorize.
N = factors[0]

w = randrange(2, N - 1)
i = 1
while phi % (2 ** i) == 0:
sqrt_1 = pow(w, phi // (2 ** i), N)
if sqrt_1 > 1 and sqrt_1 != N - 1:
# We can remove the element to factorize now, because we have a factorization.
factors = factors[1:]

p = GCD(N, sqrt_1 + 1)
q = N // p

if isPrime(p):
prime_factors.add(p)
elif p > 1:
factors.append(p)

if isPrime(q):
prime_factors.add(q)
elif q > 1:
factors.append(q)

# Continue in the outer loop
break

i += 1

return tuple(prime_factors)

n = 17501785470905115084530641937586010443633001681612179692218171935474388105810758340844015368385708349722992595891293984847291588862799310921139505076364559140770828784719022502905431468825797666445114531707625227170492272392144861677408547696040355055483067831733807927267488677560035243230884564063878855983123740667214237638766779250729115967995715398679183680360515620300448887396447013941026492557540060990171678742387611013736894406804530109193638867704765955683067309269778890269186100476308998155078252336943147988308936856121869803970807195714727873626949774272831321358988667427984601788595656519292763705699
WHATF= 7550872408895903340469549867088737779221735042983487867888690747510707575208917229455135563614675077641314504029666714424242441219246566431788414277587183624484845351111624500646035107614221756706581150918776828118482092241867365644233950852801286481603893259029733993572417125002284605243126366683373762688802313288572798197775563793405251353957529601737375987762230223965539018597115373258092875512799931693493522478726661976059512568029782074142871019609980899851702029278565972205831732184397965899892253392769838212803823816067145737697311648549879049613081017925387808738647333178075446683195899683981412014732
sign = 12029865785359077271888851642408932941748698222400692402967271078485911077035193062225857653592806498565936667868784327397659271889359852555292426797695393591842279629975530499882434299824406229989496470187187565025826834367095435441393901750671657454855301104151016192695436071059013094114929109806658331209302942624722867961155156665675500638029626815869590842939369327466155186891537025880396861428410389552502395963071259114101340089657190695306100646728391832337848064478382298002033457224425654731106858054291015385823564302151351406917158392454536296555530524352049490745470215338669859669599380477470525863815
e = 65537

kphi = e**3*WHATF - 3*e**3 - 1
p,q = factorize_multi_prime(n,kphi)
phi = (p-1)*(q-1)
d = invert(e,phi)
m = pow(sign,e,n)
flag = (m*int(invert(int(pow(2,e**2+d**2,n)),n)))%n
print(long_to_bytes(flag))

2024长城杯(复现):

1.RandomRSA:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
from gmpy2 import mpz, isqrt, powmod, invert, is_prime,jacobi
import concurrent.futures
import tqdm
import os
from Crypto.Util.number import *
import sympy

p, a, b = 170302223332374952785269454020752010235000449292324018706323228421794605831609342383813680059406887437726391567716617403068082252456126724116360291722050578106527815908837796377811535800753042840119867579793401648981916062128752925574017615120362457848369672169913701701169754804744410516724429370808383640129, 95647398016998994323232737206171888899957187357027939982909965407086383339418183844601496450055752805846840966207033179756334909869395071918100649183599056695688702272113280126999439574017728476367307673524762493771576155949866442317616306832252931038932232342396406623324967479959770751756551238647385191314, 122891504335833588148026640678812283515533067572514249355105863367413556242876686249628488512479399795117688641973272470884323873621143234628351006002398994272892177228185516130875243250912554684234982558913267007466946601210297176541861279902930860851219732696973412096603548467720104727887907369470758901838
n, c = 5593134172275186875590245131682192688778392004699750710462210806902340747682378400226605648011816039948262008066066650657006955703136928662067931212033472838067050429624395919771757949640517085036958623280188133965150285410609475158882527926240531113060812228408346482328419754802280082212250908375099979058307437751229421708615341486221424596128137575042934928922615832987202762651904056934292682021963290271144473446994958975487980146329697970484311863524622696562094720833240915154181032649358743041246023013296745195478603299127094103448698060367648192905729866897074234681844252549934531893172709301411995941527, 2185680728108057860427602387168654320024588536620246138642042133525937248576850574716324994222027251548743663286125769988360677327713281974075574656905916643746842819251899233266706138267250441832133068661277187507427787343897863339824140927640373352305007520681800240743854093190786046280731148485148774188448658663250731076739737801267702682463265663725900621375689684459894544169879873344003810307496162858318574830487480360419897453892053456993436452783099460908947258094434884954726862549670168954554640433833484822078996925040310316609425805351183165668893199137911145057639657709936762866208635582348932189646

# 模数 p 和多项式的系数 a, b, 以及 n
p = mpz(p) # LCG 中的模数
a = mpz(a) # LCG 的乘数
b = mpz(b) # LCG 的增量
n = mpz(n) # RSA 模数


# 求解方程中的 x
def solve_quadratic_mod(a, b, c, p):
"""求解模数 p 下的二次方程 a*x^2 + b*x + c ≡ 0 (mod p)"""
# 计算判别式 Δ = b^2 - 4ac (mod p)
discriminant = (b * b - 4 * a * c) % p

# 判断判别式是否有解
if jacobi(discriminant, p) != 1:
return None # 没有平方根,二次方程无解

sqrt_discriminant = sympy.nthroot_mod(discriminant, 2, p)

# 计算 2a 的逆元
inv_2a = invert(2 * a, p)

# 求解方程 x = (-b ± sqrt(Δ)) / 2a (mod p)
x1 = ((-b + sqrt_discriminant) * inv_2a) % p
x2 = ((-b - sqrt_discriminant) * inv_2a) % p
return x1, x2


# 并行处理多个 c1 值
def process_c1_range(c1_start, c1_end):
results = []
for c1 in range(c1_start, c1_end):
for c2 in range(1000):
# 构建模数下的二次方程
b_prime = (b + c2 + a * c1) % p
c_prime = (c1 * (b + c2) - n) % p

# 求解二次方程
res = solve_quadratic_mod(a, b_prime, c_prime, p)

# 检查解是否存在
if res:
x1, x2 = res
p1_x1 = (x1 + c1) % p
p2_x1 = (a * x1 + b + c2) % p
p1_x2 = (x2 + c1) % p
p2_x2 = (a * x2 + b + c2) % p

# 检查是否为素数并且满足 p1_x1 * p2_x1 == n
if is_prime(p1_x1) and is_prime(p2_x1) and p1_x1 * p2_x1 == n:
results.append((c1, c2, x1))
if is_prime(p1_x2) and is_prime(p2_x2) and p1_x2 * p2_x2 == n:
results.append((c1, c2, x2))
return results


# 多进程执行主函数
def main():
results = []

num_cpus = os.cpu_count() # 获取可用CPU核数
chunk_size = 10 # 每个任务处理10个c1
total_c1 = 1000 # c1的总范围

with concurrent.futures.ProcessPoolExecutor(max_workers=num_cpus) as executor:
futures = []

# 将c1范围分块提交给进程池
for c1_start in range(0, total_c1, chunk_size):
c1_end = min(c1_start + chunk_size, total_c1)
futures.append(executor.submit(process_c1_range, c1_start, c1_end))

# 收集结果
for future in tqdm.tqdm(concurrent.futures.as_completed(futures)):
result = future.result()
if result:
results.extend(result)
break # 找到结果后提前退出

# 输出找到的结果
if results:
print("找到的结果: ", results)
c1, c2, x = results[0]
pp = x + c1
qq = (a * x + b + c2) % p
print((x + c1) * (a * x + b + c2) % p == n % p)
print(is_prime(pp), is_prime(qq), pp * qq == n)
d = invert(65537, (pp - 1) * (qq - 1))
print(long_to_bytes(pow(c, d, pp * qq)))
else:
print("没有找到符合条件的 c1 和 c2")


# 运行主函数
if __name__ == '__main__':
main()