2023-06-03 陕西省技能大赛 crypto 复现

奇怪的sar

题目描述:

from Crypto.Util.number import *

key = 'flag{**********}'

bits = 1024
msg = bytes_to_long(key.encode())

e = 65537
p = getPrime(bits)
q = getPrime(bits)
n = p * q

def encrypt1(msg, e, n):
    c = pow(msg, e, n)
    return c

seed = p ^ q
a = getPrime(bits)
b = getPrime(bits)
n1 = getPrime(bits)

def encrypt2(seed):
    enc = []
    for i in range(10):
        seed = (a * seed + b) % n1
        enc.append(seed)
    return enc
    
c = encrypt1(msg, e, n)
enc = encrypt2(seed)
print("n = ", n)
print("c = ", c)
print("n1 = ", n1)
print("enc = ", enc)
n =  24044063028844014127418595700558729326190738802687551098858513077613750188240082663594575453404975706225242363463089392757425008423696150244560748490108425645064339883915929498539109384801415313004805586193044292137299902797522618277016789979196782551492020031695781792205215671106103568559626617762521687128199445018651010056934305055040748892733145467040663073395258760159451903432330506383025685265502086582538667772105057401245864822281535425692919273252955571196166824113519446568745718898654447958192533288063735350717599092500158028352667339959012630051251024677881674246253876293205648190626145653304572328397
c =  14883053247652228283811442762780942186987432684268901119544211089991663825267989728286381980568977804079766160707988623895155236079459150322336701772385709429870215701045797411519212730389048862111088898917402253368572002593328131895422933030329446097639972123501482601377059155708292321789694103528266681104521268192526745361895856566384239849048923482217529011549596939269967690907738755747213669693953769070736092857407573675987242774763239531688324956444305397953424851627349331117467417542814921554060612622936755420459029769026126293588814831034143264949347763031994934813475762839410192390466491651507733968227
n1 =  137670797028117726329534659376416493367957852768263083700434198723955223922183386928456013703791817601151754417828367188186912209697081337658512940425529211281290630976671911327606706953154608427885071841566358882014021242768190762103365969320014710368160869517966437591299370072284930202718943785099916898209
enc =  [101737402423360536260958229788866250367716256968287178187558336481872788309727545478736771692477306412259739856568227009850831432381180909815512654609798228982433082928392936844193974517574281026029228179913579225687286945054175762659252515268270399329404664775893089132101252158524000295899895962104782878103, 37355684997487259669354747104430314505839306993101096210478266975184357608742619438151118843905165289324251734149329596611854110739738607745107961453008343886403511257039401245484528985856920723694142989180291902939107642020398816995584650913417698279936585230648639613028793148102494100898288564799111024672, 58677759595639211550435023449462812079890625834313820227189340593596480924226619376872336960357021314847975570175387751632125898437020801920862764666175594874885587518469384576361008639967382152477408865298759987606155830674598034578657554841283906976808719095766296677147076808250022898199866472085742989883, 61841632061818470036288407041172200048676249787061823756736224887116113640875444187463656719652972233582538657844183320242896612625995507633237074900538692102956750184024574603018257213912795847625926653585010890014291951218199774765624860625726555381815237888483974246173727262881650634287497285246796321130, 7618244158597756867387754433401378508070531356170836765779245254233413235386172690733378371343899289510629513166609513857423499004879497768588665836034791151090648182168421570449377835494883902907064269417199065924565304966242954268460876762295575715334403142360198583318323418975108290758222653083011275844, 106276841058222138994123556391380518368163552919305398852484130331884811278068151915582752795463570013359693610495645946230044828403849434903415989487924763756589202218361370725532394478569304449884620166937809374355282324069422109879874964479199929174533104879048175102339134830614476339153367475243140156049, 54574757236475194407137831004617398270525645136836468973535243574661043352422598443323384197261529289829451787586618886007968913414366545291507686451774653217577858375086817168124727394445167274831801876424578654786480330913650363551771258617533162477541882336257099777912519011890593910515860435759936717781, 15567087904962670212229825713697043597876172881256160613623383896576159414077875401117959132252949501643234465895697270909085179587988268864498823765197994781747034644583869111599516151129007414228897958635533561248099927507725880289417298814703767549313482346652043188826434944367260731729064673486516315207, 10757138067445225320504771816863593606847219020279502671965413470243269270456133564739090471033889069283122519782525412134604896073598293410977787230108853737796640474070194546344190858079847734817109910030714675258996740807873872365037296486121580542250452443305370358407408558223735250474249180772656905880, 68097848963949068260912124852455363245291187860801223898468533992003737157497436432969031551088942445561676359631354280979357356539429863946694570097104716411407829017684705171462511875250672979623888463245258237680782731827727876526411531354910982579164963119481534453651300645314177478026462894232377307020]

题目分析:

  • 首先encrypt2一看就是典型的lcg,这种题之前遇到过,详细思路请参考 lcg例题分析,这里就不过多赘述,直接上解题代码了:
import gmpy2
from Crypto.Util.number import *
from itertools import *
c =  14883053247652228283811442762780942186987432684268901119544211089991663825267989728286381980568977804079766160707988623895155236079459150322336701772385709429870215701045797411519212730389048862111088898917402253368572002593328131895422933030329446097639972123501482601377059155708292321789694103528266681104521268192526745361895856566384239849048923482217529011549596939269967690907738755747213669693953769070736092857407573675987242774763239531688324956444305397953424851627349331117467417542814921554060612622936755420459029769026126293588814831034143264949347763031994934813475762839410192390466491651507733968227
n1 =  137670797028117726329534659376416493367957852768263083700434198723955223922183386928456013703791817601151754417828367188186912209697081337658512940425529211281290630976671911327606706953154608427885071841566358882014021242768190762103365969320014710368160869517966437591299370072284930202718943785099916898209
output =  [101737402423360536260958229788866250367716256968287178187558336481872788309727545478736771692477306412259739856568227009850831432381180909815512654609798228982433082928392936844193974517574281026029228179913579225687286945054175762659252515268270399329404664775893089132101252158524000295899895962104782878103, 37355684997487259669354747104430314505839306993101096210478266975184357608742619438151118843905165289324251734149329596611854110739738607745107961453008343886403511257039401245484528985856920723694142989180291902939107642020398816995584650913417698279936585230648639613028793148102494100898288564799111024672, 58677759595639211550435023449462812079890625834313820227189340593596480924226619376872336960357021314847975570175387751632125898437020801920862764666175594874885587518469384576361008639967382152477408865298759987606155830674598034578657554841283906976808719095766296677147076808250022898199866472085742989883, 61841632061818470036288407041172200048676249787061823756736224887116113640875444187463656719652972233582538657844183320242896612625995507633237074900538692102956750184024574603018257213912795847625926653585010890014291951218199774765624860625726555381815237888483974246173727262881650634287497285246796321130, 7618244158597756867387754433401378508070531356170836765779245254233413235386172690733378371343899289510629513166609513857423499004879497768588665836034791151090648182168421570449377835494883902907064269417199065924565304966242954268460876762295575715334403142360198583318323418975108290758222653083011275844, 106276841058222138994123556391380518368163552919305398852484130331884811278068151915582752795463570013359693610495645946230044828403849434903415989487924763756589202218361370725532394478569304449884620166937809374355282324069422109879874964479199929174533104879048175102339134830614476339153367475243140156049, 54574757236475194407137831004617398270525645136836468973535243574661043352422598443323384197261529289829451787586618886007968913414366545291507686451774653217577858375086817168124727394445167274831801876424578654786480330913650363551771258617533162477541882336257099777912519011890593910515860435759936717781, 15567087904962670212229825713697043597876172881256160613623383896576159414077875401117959132252949501643234465895697270909085179587988268864498823765197994781747034644583869111599516151129007414228897958635533561248099927507725880289417298814703767549313482346652043188826434944367260731729064673486516315207, 10757138067445225320504771816863593606847219020279502671965413470243269270456133564739090471033889069283122519782525412134604896073598293410977787230108853737796640474070194546344190858079847734817109910030714675258996740807873872365037296486121580542250452443305370358407408558223735250474249180772656905880, 68097848963949068260912124852455363245291187860801223898468533992003737157497436432969031551088942445561676359631354280979357356539429863946694570097104716411407829017684705171462511875250672979623888463245258237680782731827727876526411531354910982579164963119481534453651300645314177478026462894232377307020]
inv = gmpy2.invert(output[1] - output[0],n1) % n1
a = (output[2] - output[1]) * inv % n1
b = (output[1] - a * output[0]) % n1
inv_a = gmpy2.invert(a,n1)
seed = (output[0] - b) * inv_a % n1
print(seed)
  • 得到seed = p ^ q,又n = p * q,想不到其他方法那就爆破,从低位开始爆破(这个爆破也不知道要怎么讲,大家自行对照代码琢磨吧)
  • 解法一:
import gmpy2
from Crypto.Util.number import *
from itertools import *
p_xor_q = 39428646082513135314545544161912595458975375891528176714825766497155482031976852156313956476772023258684487799640179241987139554034654104867011313090105438798561154654679825702410748780286094326639330840289843154525176685892323447168072417654823748596238888125898914210332775882916911771786984574407163323116
e = 65537
n =  24044063028844014127418595700558729326190738802687551098858513077613750188240082663594575453404975706225242363463089392757425008423696150244560748490108425645064339883915929498539109384801415313004805586193044292137299902797522618277016789979196782551492020031695781792205215671106103568559626617762521687128199445018651010056934305055040748892733145467040663073395258760159451903432330506383025685265502086582538667772105057401245864822281535425692919273252955571196166824113519446568745718898654447958192533288063735350717599092500158028352667339959012630051251024677881674246253876293205648190626145653304572328397
c =  14883053247652228283811442762780942186987432684268901119544211089991663825267989728286381980568977804079766160707988623895155236079459150322336701772385709429870215701045797411519212730389048862111088898917402253368572002593328131895422933030329446097639972123501482601377059155708292321789694103528266681104521268192526745361895856566384239849048923482217529011549596939269967690907738755747213669693953769070736092857407573675987242774763239531688324956444305397953424851627349331117467417542814921554060612622936755420459029769026126293588814831034143264949347763031994934813475762839410192390466491651507733968227

# 爆破p,q,从低位开始
plist,qlist = [0],[0]
mod = 1
for i in range(1024):
    mod *= 2
    next_plow,next_qlow = [],[]
    for pl,ql in zip(plist,qlist):
        for ph,qh in product([0,1],repeat = 2): # 得到(0,0),(0,1),(1,0),(1,1)
            p_mod = ph * (mod // 2) + pl
            q_mod = qh * (mod // 2) + ql
            if p_mod * q_mod % mod == n % mod and  p_mod ^ q_mod == p_xor_q % mod:
                next_qlow.append(q_mod)
                next_plow.append(p_mod)
    plist,qlist = next_plow,next_qlow

for p,q in zip(plist,qlist):
    if p * q == n:
        phi = (p-1)*(q-1)
        d = gmpy2.invert(e,phi)
        m = pow(c,d,n)
        print(long_to_bytes(m))
        break
       
# flag{y0u_kn0w_Pruning_and_lcg}
  • 解法二(异曲同工)
from Crypto.Util.number import *
from tqdm import tqdm
import gmpy2
n =  24044063028844014127418595700558729326190738802687551098858513077613750188240082663594575453404975706225242363463089392757425008423696150244560748490108425645064339883915929498539109384801415313004805586193044292137299902797522618277016789979196782551492020031695781792205215671106103568559626617762521687128199445018651010056934305055040748892733145467040663073395258760159451903432330506383025685265502086582538667772105057401245864822281535425692919273252955571196166824113519446568745718898654447958192533288063735350717599092500158028352667339959012630051251024677881674246253876293205648190626145653304572328397
c =  14883053247652228283811442762780942186987432684268901119544211089991663825267989728286381980568977804079766160707988623895155236079459150322336701772385709429870215701045797411519212730389048862111088898917402253368572002593328131895422933030329446097639972123501482601377059155708292321789694103528266681104521268192526745361895856566384239849048923482217529011549596939269967690907738755747213669693953769070736092857407573675987242774763239531688324956444305397953424851627349331117467417542814921554060612622936755420459029769026126293588814831034143264949347763031994934813475762839410192390466491651507733968227
n1 =  137670797028117726329534659376416493367957852768263083700434198723955223922183386928456013703791817601151754417828367188186912209697081337658512940425529211281290630976671911327606706953154608427885071841566358882014021242768190762103365969320014710368160869517966437591299370072284930202718943785099916898209
enc =  [101737402423360536260958229788866250367716256968287178187558336481872788309727545478736771692477306412259739856568227009850831432381180909815512654609798228982433082928392936844193974517574281026029228179913579225687286945054175762659252515268270399329404664775893089132101252158524000295899895962104782878103, 37355684997487259669354747104430314505839306993101096210478266975184357608742619438151118843905165289324251734149329596611854110739738607745107961453008343886403511257039401245484528985856920723694142989180291902939107642020398816995584650913417698279936585230648639613028793148102494100898288564799111024672, 58677759595639211550435023449462812079890625834313820227189340593596480924226619376872336960357021314847975570175387751632125898437020801920862764666175594874885587518469384576361008639967382152477408865298759987606155830674598034578657554841283906976808719095766296677147076808250022898199866472085742989883, 61841632061818470036288407041172200048676249787061823756736224887116113640875444187463656719652972233582538657844183320242896612625995507633237074900538692102956750184024574603018257213912795847625926653585010890014291951218199774765624860625726555381815237888483974246173727262881650634287497285246796321130, 7618244158597756867387754433401378508070531356170836765779245254233413235386172690733378371343899289510629513166609513857423499004879497768588665836034791151090648182168421570449377835494883902907064269417199065924565304966242954268460876762295575715334403142360198583318323418975108290758222653083011275844, 106276841058222138994123556391380518368163552919305398852484130331884811278068151915582752795463570013359693610495645946230044828403849434903415989487924763756589202218361370725532394478569304449884620166937809374355282324069422109879874964479199929174533104879048175102339134830614476339153367475243140156049, 54574757236475194407137831004617398270525645136836468973535243574661043352422598443323384197261529289829451787586618886007968913414366545291507686451774653217577858375086817168124727394445167274831801876424578654786480330913650363551771258617533162477541882336257099777912519011890593910515860435759936717781, 15567087904962670212229825713697043597876172881256160613623383896576159414077875401117959132252949501643234465895697270909085179587988268864498823765197994781747034644583869111599516151129007414228897958635533561248099927507725880289417298814703767549313482346652043188826434944367260731729064673486516315207, 10757138067445225320504771816863593606847219020279502671965413470243269270456133564739090471033889069283122519782525412134604896073598293410977787230108853737796640474070194546344190858079847734817109910030714675258996740807873872365037296486121580542250452443305370358407408558223735250474249180772656905880, 68097848963949068260912124852455363245291187860801223898468533992003737157497436432969031551088942445561676359631354280979357356539429863946694570097104716411407829017684705171462511875250672979623888463245258237680782731827727876526411531354910982579164963119481534453651300645314177478026462894232377307020]
# 计算seed方法一样
a=(enc[2]-enc[1])*inverse((enc[1]-enc[0]),n1)%n1
I=inverse(a,n1)
b=(enc[1]-a*enc[0])%n1
seed = (I*(enc[0]-b))%n1
pre_sol = [(1, 1)]
for i in tqdm(range(1, 1025)):
    cur_pow = (1 << (i+1))
    cur_sol = []
    for pre_p, pre_q in pre_sol:
        for s in range(2):
            for t in range(2):
                cur_p = pre_p + s * (1 << i)
                cur_q = pre_q + t * (1 << i)
                if (cur_p ^ cur_q == seed % cur_pow and cur_p*cur_q % cur_pow == n % cur_pow):
                    cur_sol.append((cur_p, cur_q))
    pre_sol = cur_sol
for p,q in tqdm(cur_sol):
    if n==p*q :
        phi = (p - 1) * (q - 1)
        e = 65537
        d = inverse(e, phi)
        m = pow(c, d, n)
        print(long_to_bytes(m))
        break

Ham3

题目描述:

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

p, q = getPrime(64), getPrime(64)
P = int(str(p) + str(q))
Q = int(str(q) + str(p))
PP = int(str(P) + str(Q))
QQ = int(str(Q) + str(P))
assert isPrime(PP) and isPrime(QQ)
n = PP * QQ
m = bytes_to_long(flag)
c = pow(m, 65537, n)
print('n =', n)
print('c =', c)
'''
n = 142672086626283587048017713116658568907056287246536918432205313755474498483915485435443731126588499776739329317569276048159601495493064346081295993762052633
c = 35771468551700967499031290145813826705314774357494021918317304230766070868171631520643911378972522363861624359732252684003796428570328730483253546904382041
'''

题目分析:

  • 此题用str()函数将p,q由二进制转为了10进制然后进行字符串的拼接
    PP = int( str( p ) + str( q ) + str( q ) + str( p ) )
    QQ = int( str( q ) + str( p ) + str( p ) + str( q ) )

  • 假设len( p ) = x, len( q ) = y

  • 那么
    P P = 1 0 x + 2 y ∗ p + 1 0 x + y ∗ q + 1 0 x ∗ q + p PP = 10^{x + 2y} * p + 10^{x + y} * q + 10^{x} * q + p PP=10x+2yp+10x+yq+10xq+p
    Q Q = 1 0 2 x + y ∗ q + 1 0 x + y ∗ p + 1 0 y ∗ p + q QQ = 10^{2x + y} * q + 10^{x + y} * p + 10^{y} * p + q QQ=102x+yq+10x+yp+10yp+q

  • 得到:
    P P ∗ Q Q = 1 0 3 x + 3 y ∗ p ∗ q + 1 0 3 x + 2 y ∗ p ∗ q + 1 0 2 x + 3 y ∗ p ∗ q + . . . + 1 0 x ∗ p ∗ q + 1 0 y ∗ p ∗ q + p ∗ q PP * QQ = 10^{3x + 3y} * p * q + 10^{3x + 2y} * p * q + 10^{2x + 3y} * p * q + ...+ 10^{x} * p * q + 10^{y} * p * q + p * q PPQQ=103x+3ypq+103x+2ypq+102x+3ypq+...+10xpq+10ypq+pq

  • 可以看出n是由p * q组成的,其中n的某一部分位数就是p * q,试过之后得到p,q的十进制长度在[19,20]之间,即 x,y ∈ [19,20],且 len(str(n)) = 156

  • 那么十进制长度len(str(10 ^ (3x + 3y) * p * q )) = 4x + 4y ∈ [152,160],要想4x + 4y = 156,那么x,y其中一个要为19,一个要为20

  • 所以[117,156],[97,136],[98,137],其中[138,156],即高19位(从138数到156共有19个数)没被覆盖到

  • 同理在这里插入图片描述
    其中[1,18],即低18位(从1数到18共有18个数)没有被覆盖到

  • p * q的10进制长度 = 19 + 20 = 39,已知的位数 = 18 + 19 = 37,所以爆破中间两位即可得到p*q

# sage
nbit = 64
n = 142672086626283587048017713116658568907056287246536918432205313755474498483915485435443731126588499776739329317569276048159601495493064346081295993762052633
high = str(n)[:19]
low = str(n)[-18:]
for i in range(10):
    for j in range(10):
        pq = int(high + str(i) + str(j) + low)
        f = factor(pq)
        if len(f) == 2 and f[0][0].nbits() == 64:
            p = f[0][0]
            q = f[1][0]
            print(p,q)

# python
p,q = 9937378783676979077,14357114660923972229
c = 35771468551700967499031290145813826705314774357494021918317304230766070868171631520643911378972522363861624359732252684003796428570328730483253546904382041
e = 65537
P = int(str(p) + str(q))
Q = int(str(q) + str(p))
PP = int(str(P) + str(Q))
QQ = int(str(Q) + str(P))
fai_n = (PP-1)*(QQ-1)
d = invert(e,fai_n)
m = pow(c,d,PP*QQ)
print(long_to_bytes(m))

# flag{HaMbu2g3r_1S_2ea1ll_D3lci0U3_By_R3A!!}

BigDataEnc

(ps:这题没写出来,出题人的wp,请原谅我不礼貌的拿来使用了,毕竟我是真写不了这么好)

题目描述:

If there were no modulo in the world, it would be as daunting as this challenge.
import pickle
from secret import flag
from Crypto.Util.number import *

N = 128
assert flag.startswith(b'flag{') and flag.endswith(b'}')


class BigDataEnc:
    def __init__(self, N):
        self.a = 1
        self.b = 1
        self.N = N

    def enc(self, flag):
        bits = bin(bytes_to_long(flag))[2:]
        LEN = len(bits)
        assert LEN == 254
        for i in range(LEN):
            t = getPrime(self.N)
            if int(bits[i]):
                self.b *= pow(t, 20)
                self.a *= pow(t, 23 + i)
            else:
                self.a *= pow(t, 20)
                self.b *= pow(t, 23 + i)

    def save(self):
        file_a = open('a', 'wb')
        file_b = open('b', 'wb')
        pickle.dump(str(self.a), file_a)
        pickle.dump(str(self.b), file_b)
        file_a.close()
        file_b.close()


CheckIn = BigDataEnc(N)
CheckIn.enc(flag[5:-1])
CheckIn.save()

题目分析:

为方便理解,不妨举例加密的明文信息二进制表示为1011,记N位随机素数为 t i t_i ti,则:
a = t 1 23 t 2 20 t 3 25 t 4 26 b = t 1 20 t 2 24 t 3 20 t 4 20 \begin{aligned} a &= t_1^{23}t_2^{20}t_3^{25}t_4^{26} \\ b &= t_1^{20}t_2^{24}t_3^{20}t_4^{20} \end{aligned} ab=t123t220t325t426=t120t224t320t420
题目给出 a 、 b a、b ab 求明文

对于 a 、 b a、b ab 有:
g = g c d ( a , b ) = t 1 20 t 2 20 t 3 20 t 4 20 = ( t 1 t 2 t 3 t 4 ) 20 g 1 = g 20 = t 1 t 2 t 3 t 4 \begin{aligned} g &= gcd(a, b) \\ &= t_1^{20}t_2^{20}t_3^{20}t_4^{20} \\ &= (t_1t_2t_3t_4)^{20} \\ g_1 &= \sqrt[20]{g} \\ &= t_1t_2t_3t_4 \end{aligned} gg1=gcd(a,b)=t120t220t320t420=(t1t2t3t4)20=20g =t1t2t3t4

对于 a , g , g 1 a, g, g_1 a,g,g1 有:
t m p a = a g = t 1 23 t 2 20 t 3 25 t 4 26 t 1 20 t 2 20 t 3 20 t 4 20 = t 1 3 t 3 5 t 4 6 b i g _ i n _ a = g c d ( t m p a , g 1 ) = t 1 t 3 t 4 \begin{aligned} tmp_a &= \frac{a}{g}\\ &= \frac{t_1^{23}t_2^{20}t_3^{25}t_4^{26}}{t_1^{20}t_2^{20}t_3^{20}t_4^{20}} \\ &= t_1^3t_3^5t_4^6 \\big\_in\_a &= gcd(tmp_a, g_1) \\ &= t_1t_3t_4\end{aligned} tmpabig_in_a=ga=t120t220t320t420t123t220t325t426=t13t35t46=gcd(tmpa,g1)=t1t3t4

即可利用 b i g _ i n _ a big\_in\_a big_in_a,恢复明文信息

具体的,可以从 i = ( 23 − 20 ) i=(23 - 20) i=(2320)开始,循环进行如下操作,直到 i = ( 23 + L E N − 20 ) i=(23+LEN - 20) i=(23+LEN20)

i = 23 − 20 = 3 t m p = b i g _ i n _ a i = b i g _ i n _ a 3 = t 1 3 t 3 3 t 4 3 t t = t m p a t m p = t 1 3 t 3 5 t 4 6 t 1 3 t 3 3 t 4 3 = t 3 2 t 4 3 t m p 1 = g c d ( t t , b i g _ i n _ a ) = t 3 t 4 若 t m p 1 ≠ b i g _ i n _ a : 1. 明文该位为 1 2. 求得该位 t = b i g _ i n _ a t m p 1 = t 1 3. 更新 t m p a = t m p a t i = t m p a t 3 = t 3 5 t 4 6 4. 更新 b i g _ i n _ a = t m p 1 = t 3 t 4 否则 : 明文该位为 0 \begin{aligned} i&=23-20=3\\ tmp &= big\_in\_a^i \\ &= big\_in\_a^3 \\ &= t_1^3t_3^3t_4^3\\ tt &= \frac{tmp_a}{tmp}\\ &= \frac{t_1^3t_3^5t_4^6}{t_1^3t_3^3t_4^3} \\ &=t_3^2t_4^3 \\ tmp_1 &= gcd(tt, big\_in\_a) \\ &= t_3t_4\\若 tmp_1 \neq big\_in\_a &: \\ &1.明文该位为1 \\ &2. 求得该位t= \frac{big\_in\_a}{tmp_1}=t_1 \\&3.更新tmp_a=\frac{tmp_a}{t^i}=\frac{tmp_a}{t^3}=t_3^5t_4^6 \\ &4.更新big\_in\_a=tmp_1=t_3t_4 \\否则&: \\ &明文该位为0\end{aligned} itmptttmp1tmp1=big_in_a否则=2320=3=big_in_ai=big_in_a3=t13t33t43=tmptmpa=t13t33t43t13t35t46=t32t43=gcd(tt,big_in_a)=t3t4:1.明文该位为12.求得该位t=tmp1big_in_a=t13.更新tmpa=titmpa=t3tmpa=t35t464.更新big_in_a=tmp1=t3t4:明文该位为0

以上为第一次循环,之后每次循环i加一

exp如下:

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

import sys
sys.set_int_max_str_digits(0)

t1 = time.time()
file_a = open('a','rb')
file_b = open('b','rb')
# c = pickle.load(file_a)
a = int(pickle.load(file_a))
b = int(pickle.load(file_b))
t2 = time.time()
flag_bits = ''
LEN = 254
g = gcd(a,b) # 所有素因子的20次方
g1 = iroot(g,20)[0] # 所有素因子的一次方
tmp_a = a // g # 消低次,得到高次方
big_in_a = gcd(tmp_a,g1) # 所有高次对应的素数的一次方
for i in range(23-20,LEN + 23 - 20):
    tmp = big_in_a ** i
    tt = tmp_a // tmp
    tmp1 = gcd(tt,big_in_a)
    if tmp1 != big_in_a:
        flag_bits += '1'
        t = big_in_a // tmp1
        tmp_a = tmp_a // (t ** i)
        big_in_a = tmp1
    else:
        flag_bits += '0'

flag = long_to_bytes(int(flag_bits,2)).decode()
flag = 'flag{' + flag + '}'
print(flag)
t3 = time.time()

print('read&convert time: ', t2 - t1)  # 约4s
print('total time: ', t3 - t1)  # 约6s

浅记一下:
刚开始看到题目的时候很懵,不知道要怎么解,还在想这又是考的那个知识点,搜集了一大圈发现并不是哪个知识点,就是纯纯的分析题。感觉这三道题都出的挺好的,很有层次感,嗯,是我这种弱鸡做不来的QAQ(虽然里面有一道国外的原题,但我并没有做过,所以并不妨碍我对此次题目的好感)

所以说,还是得多接触各类题型,拓展知识宽度,继续加油!

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值