2023江西省大学生信息安全大赛 Crypto

文章目录

cry1

题目描述:

from Crypto.Util.number import *
import gmpy2
from flag import flag
assert flag[:5]==b'flag{'

m1 = bytes_to_long(flag[:20])
p  = getPrime(512)
p1 = gmpy2.next_prime(p)
q  = getPrime(512)
q1 = gmpy2.next_prime(q)
n1 = p*q*p1*q1
print('n1 =',n1)
e = 0x10001
c1 = pow(m1,e,n1)
print('c1 =',c1)


m2 = bytes_to_long(flag[20:])
p2 = getPrime(1024)
q2 = getPrime(1024)
print('p2+q2 =',p2+q2)
print('p2*q2 =',p2*q2)
n2 = p2*p2*q2*q2*q2
print('n2 =',n2)
c2 = pow(m2,e,n2)
print('c2 =',c2)

#n1 = 3966981482745621447573089670807887891869583949641744977093538676656291199447798825799694415879452962971797985511333210005897373869781085298464032669921247755023254086745384065540031416702161055895064799937757947302382867901164507685443200056578802762060508297285923488289877147824029887593666980609508098160584016905857901229877991690184067854045856533280341994975603076157731667728086073206066954357796555871719369778645692150128530639659718300546162750544736819790584115192348977429548842081029357676165797335831504468389547666976748923985828040165872267548769577658691275124686144178021785756107526128685452817903
#c1 = 1194665027563633062248581414560162334231852657988896481199205225478086169508134844926960609919530568608047201361602513231599587985142728739985022871537341396665792181934824177683056725718147641996810309468387559099991432798708480493055930064688470581268403910906634767274835956335855653277313816597112701002136866259658334492071771159534631999698607858634100499972122697477809060312398073023686659910677774113190587685238832554982788701760885981333395017846485726510194874591192291680324719177202811786286323221308310999092370504677807562276354028892789759945040633130992248611355593126431211900348225151260056636038

#p2+q2 = 266602143729882981597182998997224623290240634626309739252060429493234393505180603725109173867571748513010024993718842415402007795633436833254001553200525810422865674533959359934226721277698199919897743276588493287676681205106674683385469952505662678016401254294342958412920322134776802474451702844229115222680
#p2*q2 = 17494300024196206589880435772259026346926331618851438253806145674985681497666992277726602870868267776260764335006515070419799369850350950019372955749120768017037178366085992938410952802073741909572233060011087451424040511940913863759715037952258825342028741412405355707207407990563721288078401970938786888032363443671773148633031560492194616785778208774456698898364821336202750187534783889125178608386607484523538681231741116880296330683191604920555071870275934577581994789262909470356697155158727882415709865346563864976994148405400893748454601904591015652783536107507544525855725618550821483918719894505412248460951
#n2 = 45870991260506230422273101364786721309625832332915352437485787070254748058774362520531816817189645906811430140045423064227658556959497293662120063866721612989484423457120292706426042183327269396950521287654159094260474529678078497777165446439362921956226900992594874292692671036802041696596593204087143742827145166501224524612228704515918104136228914065760587899477077809605445745675043432899532392103632161021911185204653001665663591125102324207364430180755942361522783519296811134958454560498120619564651133055025304436949693516037357271686005459354079622056341689981322676642017326005022045445192216032258404188724087156877641242153435659959337507460018789057234628434636718219922413567952281364187102094646647074416970246885244981296308073851590998003892308269462886868221471538480612746056903318228300827686310150964290395246632347830851696626407121490228825136069905530589241234693217670504560051419967035556482276129009709594555881457143546861184789113911452951221086756311230089576692797006578995213271375718643570903247882435717425060376176258381307661725315708240888727157358668901438870549463713462903285355144487513054430660154112545328617944581968469529480380096360715470450093321764192187370815537488672741081769883974223851554827926962095549677155313086803793550158246044276042395357734177888671276226747033366277753575774544624814560093516390923678729469957973225726056235135489452763784977994673782657710252742361025108178636284547388512578069092262396427136966310083721677710766753661569552637470064375074112294278537167633
#c2 = 7002627683745136817859860591002535770688227209517127343997766464141624485147678454369190699776901866814420652456270233533369281551571287338549120522024386337813419944601805682510881329270377929502814070274501059206737672091091210578521021284243958657347558828580092551815423921263229522092780315376687785948605676648821221019701214008552273319746359903880791947155259855966944950568029286448030101814010293205797665614846516625545077679563463397521406169738061773015754133238425482320682623161665168784160617762068909300973722432160148791442988347358628603704189947813390775950251183674594191633204264352477878281333317704822589641876860439166012148658188057150466639437560588494659186018704807077381877542469885650866843498997141601121272358773338887424302849308038161452004381427377616737171957036938406939970961096175520244507528259901020630595817447680820957986185204452710109074766211936449590188250741000982179394881852839864477221637759977140200821169690258437513393769790226292814452559857872299887764009699019663741845022739873029662394884769749427319759696933564110701646698123060784643960838125505162234025384310579280329864753122197056648677766657824195232425122036861965548047816241034163773366826785851848260257579113812426327486832082999457074494920074537621852398285350310944136047016546895570489894782730361970596875669627870936318891653026559079241098684950869440022375065668284730791821066804992966440873588525706461301601875391448391721311973057933914578422065067445933824468033597193852076621647478299376892673727069214

题目分析:
第一部分费马分解
第二部分解方程

import gmpy2
from Crypto.Util.number import *
n = 3966981482745621447573089670807887891869583949641744977093538676656291199447798825799694415879452962971797985511333210005897373869781085298464032669921247755023254086745384065540031416702161055895064799937757947302382867901164507685443200056578802762060508297285923488289877147824029887593666980609508098160584016905857901229877991690184067854045856533280341994975603076157731667728086073206066954357796555871719369778645692150128530639659718300546162750544736819790584115192348977429548842081029357676165797335831504468389547666976748923985828040165872267548769577658691275124686144178021785756107526128685452817903
c = 1194665027563633062248581414560162334231852657988896481199205225478086169508134844926960609919530568608047201361602513231599587985142728739985022871537341396665792181934824177683056725718147641996810309468387559099991432798708480493055930064688470581268403910906634767274835956335855653277313816597112701002136866259658334492071771159534631999698607858634100499972122697477809060312398073023686659910677774113190587685238832554982788701760885981333395017846485726510194874591192291680324719177202811786286323221308310999092370504677807562276354028892789759945040633130992248611355593126431211900348225151260056636038
e = 65537
def factor(n):
    li = []
    a = gmpy2.iroot(n, 2)[0]
    while 1:
        b2 = a * a - n
        if gmpy2.is_square(b2):
            b = gmpy2.iroot(b2,2)[0]
            p1q1 = a + b
            p2q2 = a - b
            li.append([p1q1,p2q2])
            if len(li) == 2:
                # li = [[p1q1,p2q2],[p1q2,p2q1]] p1 * q1更小,更先遍历到,所以其在前面
                break
        a += 1
    return li
li = factor(n)
x1,y1 = li[0]
x2,y2 = li[1]
p1 = gmpy2.gcd(x1,x2)
p2 = gmpy2.gcd(y1,y2)
q1 = y2 // p2
q2 = x2 // p1
phi = (p1 - 1)*(p2 - 1)*(q1 - 1)*(q2-1)
d = gmpy2.invert(e,phi)
m = pow(c,d,n)
print(long_to_bytes(m))

n2 = 45870991260506230422273101364786721309625832332915352437485787070254748058774362520531816817189645906811430140045423064227658556959497293662120063866721612989484423457120292706426042183327269396950521287654159094260474529678078497777165446439362921956226900992594874292692671036802041696596593204087143742827145166501224524612228704515918104136228914065760587899477077809605445745675043432899532392103632161021911185204653001665663591125102324207364430180755942361522783519296811134958454560498120619564651133055025304436949693516037357271686005459354079622056341689981322676642017326005022045445192216032258404188724087156877641242153435659959337507460018789057234628434636718219922413567952281364187102094646647074416970246885244981296308073851590998003892308269462886868221471538480612746056903318228300827686310150964290395246632347830851696626407121490228825136069905530589241234693217670504560051419967035556482276129009709594555881457143546861184789113911452951221086756311230089576692797006578995213271375718643570903247882435717425060376176258381307661725315708240888727157358668901438870549463713462903285355144487513054430660154112545328617944581968469529480380096360715470450093321764192187370815537488672741081769883974223851554827926962095549677155313086803793550158246044276042395357734177888671276226747033366277753575774544624814560093516390923678729469957973225726056235135489452763784977994673782657710252742361025108178636284547388512578069092262396427136966310083721677710766753661569552637470064375074112294278537167633
c2 = 7002627683745136817859860591002535770688227209517127343997766464141624485147678454369190699776901866814420652456270233533369281551571287338549120522024386337813419944601805682510881329270377929502814070274501059206737672091091210578521021284243958657347558828580092551815423921263229522092780315376687785948605676648821221019701214008552273319746359903880791947155259855966944950568029286448030101814010293205797665614846516625545077679563463397521406169738061773015754133238425482320682623161665168784160617762068909300973722432160148791442988347358628603704189947813390775950251183674594191633204264352477878281333317704822589641876860439166012148658188057150466639437560588494659186018704807077381877542469885650866843498997141601121272358773338887424302849308038161452004381427377616737171957036938406939970961096175520244507528259901020630595817447680820957986185204452710109074766211936449590188250741000982179394881852839864477221637759977140200821169690258437513393769790226292814452559857872299887764009699019663741845022739873029662394884769749427319759696933564110701646698123060784643960838125505162234025384310579280329864753122197056648677766657824195232425122036861965548047816241034163773366826785851848260257579113812426327486832082999457074494920074537621852398285350310944136047016546895570489894782730361970596875669627870936318891653026559079241098684950869440022375065668284730791821066804992966440873588525706461301601875391448391721311973057933914578422065067445933824468033597193852076621647478299376892673727069214
p2_add_q2 = 266602143729882981597182998997224623290240634626309739252060429493234393505180603725109173867571748513010024993718842415402007795633436833254001553200525810422865674533959359934226721277698199919897743276588493287676681205106674683385469952505662678016401254294342958412920322134776802474451702844229115222680
p2_mul_q2 = 17494300024196206589880435772259026346926331618851438253806145674985681497666992277726602870868267776260764335006515070419799369850350950019372955749120768017037178366085992938410952802073741909572233060011087451424040511940913863759715037952258825342028741412405355707207407990563721288078401970938786888032363443671773148633031560492194616785778208774456698898364821336202750187534783889125178608386607484523538681231741116880296330683191604920555071870275934577581994789262909470356697155158727882415709865346563864976994148405400893748454601904591015652783536107507544525855725618550821483918719894505412248460951
p2_q2 = gmpy2.iroot(p2_add_q2 ** 2 - 4 * p2_mul_q2,2)[0]
q2 = (p2_add_q2 + p2_q2) // 2
p2 = (p2_add_q2 - p2_q2) // 2
d2 = inverse(e,p2*(p2 - 1) * q2 * q2 * (q2 - 1))
print(long_to_bytes(m) + long_to_bytes(pow(c2,d2,n2)))
# flag{187a444d9a611a71a329d4fcdda5e32b}

cry2

题目描述:

from secret import flag
from Crypto.Util.number import bytes_to_long, getRandomNBitInteger, getPrime
import os

data1 = flag[:19] + os.urandom(64 - 19)

a = []

for i in range(0, 64, 4):
    a.append(bytes_to_long(data1[i:i+4]))

m = getPrime(32)
c = [getRandomNBitInteger(31) for _ in range(16)]

rounds = 128

for i in range(rounds):
    a.append(sum([each1 * each2 for each1, each2 in zip(a[-16:], c)]) % m)


cipher1 = a[-18:]

print(cipher1)
print(c)


data2 = flag[19:] + os.urandom(64 - 19)
a = []

for i in range(0, 64, 4):
    a.append(bytes_to_long(data2[i:i+4]))

m = getPrime(32)
c = [getRandomNBitInteger(31) for _ in range(16)]


for i in range(rounds):
    a.append(sum([each1 * each2 for each1, each2 in zip(a[-16:], c)]) % m)


cipher2 = a[-32:]

print(cipher2)
print(m)
# the output of the script as below:

'''
[2199688033, 1733982273, 2340009304, 341778705, 141397521, 114146069, 1710478976, 1200581510, 674386550, 1414979565, 290847439, 256601736, 2331547089, 897119738, 178613062, 1720471649, 616427594, 544210529]
[2104146372, 1169870735, 1425650947, 1749984551, 1582304232, 1331221932, 1449589754, 1413682635, 1585939504, 1148610847, 1399605118, 1637600426, 1772374424, 1856830856, 1511628613, 1310495010]
[125847918, 2417334413, 1479312364, 13669300, 324930796, 1472038793, 1903723741, 906601651, 188498780, 2038819942, 1861425194, 2275664507, 1014997925, 1754940075, 2666538416, 2695310750, 1562541673, 1530702119, 2514600978, 2047025289, 2639956382, 2125821715, 1445739288, 399780363, 1278278502, 1306977195, 2444888125, 1851399130, 2430949982, 2141453522, 947262643, 1739029419]
2788729477
'''

题目分析:
part1:
相当于: a 17 ≡ a 1 ∗ c 1 + a 2 ∗ c 2 + . . . + a 16 ∗ c 16 m o d    m a 18 ≡ a 2 ∗ c 1 + a 3 ∗ c 2 + . . . + a 17 ∗ c 16 m o d    m 其中 a , c 均已知, g c d 后得到 m 求到 m 后解方程求得所有的 a ,至此第一部分的 f l a g 就出来了 相当于:\\ a_{17} \equiv a_1 * c_1 + a_2 * c_2 + ...+ a_{16} * c_{16} \mod m\\ a_{18} \equiv a_2 * c_1 + a_3 * c_2 + ...+ a_{17} * c_{16} \mod m\\ 其中a,c均已知,gcd后得到m\\ 求到m后解方程求得所有的a,至此第一部分的flag就出来了 相当于:a17a1c1+a2c2+...+a16c16modma18a2c1+a3c2+...+a17c16modm其中a,c均已知,gcd后得到m求到m后解方程求得所有的a,至此第一部分的flag就出来了
exp:

from Crypto.Util.number import *
from gmpy2 import *
c1 = [2104146372, 1169870735, 1425650947, 1749984551, 1582304232, 1331221932, 1449589754, 1413682635, 1585939504, 1148610847, 1399605118, 1637600426, 1772374424, 1856830856, 1511628613, 1310495010]
a_18 = [2199688033, 1733982273, 2340009304, 341778705, 141397521, 114146069, 1710478976, 1200581510, 674386550, 1414979565, 290847439, 256601736, 2331547089, 897119738, 178613062, 1720471649, 616427594, 544210529]

a = []
a11 = sum([each1 * each2 for each1, each2 in zip(a_18[-18:-2], c1)]) - a_18[-2]
a22 = sum([each1 * each2 for each1, each2 in zip(a_18[-17:-1], c1)]) - a_18[-1]
m = gcd(a11,a22)

for i in range(126):
    P.<x> = PolynomialRing(Zmod(m))
    f = x * c1[0]
    for j in range(15):
        f += c1[j + 1] * a_18[j]
    f -= a_18[15]
    t = f.roots()[0][0]
    a_18 = [t] + a_18
m1 = b''
for i in a_18:
    m1 += long_to_bytes(int(i))
print(m1)
# flag{f7f6a51e3d941d

part2:
相当于: ( a 1 a 2 ⋯ a 16 a 2 a 3 ⋯ a 17 ⋮ ⋮ ⋮ ⋮ a 16 a 17 ⋯ a 31 ) ∗ ( c 1 c 2 ⋮ c 16 ) = ( a 17 a 18 ⋮ a 32 ) 里面所有的 a 已知,矩阵乘法求解得 c c , m 已知那后面就和 p a r t 1 一样解方程就可得所有 a 至此第二部分的 f l a g 就出来了,拼接即可得完整 f l a g 相当于:\\ \begin{pmatrix} a_1&a_2&\cdots&a_{16}\\ a_2&a_3&\cdots&a_{17}\\ \vdots&\vdots&\vdots&\vdots\\ a_{16}&a_{17}&\cdots&a_{31} \end{pmatrix} * \begin{pmatrix} c_1\\ c_2\\ \vdots\\ c_{16} \end{pmatrix} = \begin{pmatrix} a_{17}\\ a_{18}\\ \vdots\\ a_{32} \end{pmatrix}\\ 里面所有的a已知,矩阵乘法求解得c\\ c,m已知那后面就和part1一样解方程就可得所有a\\ 至此第二部分的flag就出来了,拼接即可得完整flag 相当于: a1a2a16a2a3a17a16a17a31 c1c2c16 = a17a18a32 里面所有的a已知,矩阵乘法求解得cc,m已知那后面就和part1一样解方程就可得所有a至此第二部分的flag就出来了,拼接即可得完整flag
exp:

a_32 = [125847918, 2417334413, 1479312364, 13669300, 324930796, 1472038793, 1903723741, 906601651, 188498780, 2038819942, 1861425194, 2275664507, 1014997925, 1754940075, 2666538416, 2695310750, 1562541673, 1530702119, 2514600978, 2047025289, 2639956382, 2125821715, 1445739288, 399780363, 1278278502, 1306977195, 2444888125, 1851399130, 2430949982, 2141453522, 947262643, 1739029419]
m = 2788729477
aa = []
for i in range(0,16):
    aa.append(a_32[i:i+16])

A = matrix(GF(m),aa).T
AA = matrix(GF(m),a_32[-16:])
c = A.solve_left(AA)
print(c.list())
# [1162334523, 1250279192, 1605960640, 1646964644, 1086318334, 1676385886, 1423189613, 1755606767, 1710054667, 1129214634, 1604252049, 1956841384, 1552185150, 1901546343, 1551861021, 1853487300]

from Crypto.Util.number import *
c2 = [1162334523, 1250279192, 1605960640, 1646964644, 1086318334, 1676385886, 1423189613, 1755606767, 1710054667, 1129214634, 1604252049, 1956841384, 1552185150, 1901546343, 1551861021, 1853487300]
a_32 = [125847918, 2417334413, 1479312364, 13669300, 324930796, 1472038793, 1903723741, 906601651, 188498780, 2038819942, 1861425194, 2275664507, 1014997925, 1754940075, 2666538416, 2695310750, 1562541673, 1530702119, 2514600978, 2047025289, 2639956382, 2125821715, 1445739288, 399780363, 1278278502, 1306977195, 2444888125, 1851399130, 2430949982, 2141453522, 947262643, 1739029419]

m = 2788729477
    
for i in range(112):
    P.<x> = PolynomialRing(Zmod(m))
    f = x * c2[0]
    for j in range(15):
        f += a_32[j] * c2[j + 1]
    f -= a_32[15]
    t = f.roots()[0][0]
    a_32 = [t] + a_32
m2 = b''
for i in a_32:
    m2 += long_to_bytes(int(i))
print(m2)
# e39f4ca291e8133d25}    

得:flag{f7f6a51e3d941de39f4ca291e8133d25}

浅记一下:

考点:费马分解,gcd,解方程,矩阵求解

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值