• MoeCTF2022 部分Crypto 复现


    Signin

    题目:

    1. from Crypto.Util.number import *
    2. from secret import flag
    3. m=bytes_to_long(flag)
    4. p=getPrime(512)
    5. q=getPrime(512)
    6. print('p=',p)
    7. print('q=',q)
    8. n=p*q
    9. e=65537
    10. c=pow(m,e,n)
    11. print('c=',c)
    12. #p= 12408795636519868275579286477747181009018504169827579387457997229774738126230652970860811085539129972962189443268046963335610845404214331426857155412988073
    13. #q= 12190036856294802286447270376342375357864587534233715766210874702670724440751066267168907565322961270655972226761426182258587581206888580394726683112820379
    14. #c= 68960610962019321576894097705679955071402844421318149418040507036722717269530195000135979777852568744281930839319120003106023209276898286482202725287026853925179071583797231099755287410760748104635674307266042492611618076506037004587354018148812584502385622631122387857218023049204722123597067641896169655595

    用基础方法解不出来,原因是e与phi_n不互素,又phi_n = (p-1)*(q-1),求gcd(e,(p-1))和gcd(e,(q-1)),发现e与p-1互素。把e*d = 1 mod (p-1)*(q-1)和m = c ^ d mod p*q拆开,利用含p的部分求解即可:

    e*d = 1 mod (p-1)

    m = c ^ d mod p

    代码如下:

    1. from gmpy2 import *
    2. from Crypto.Util.number import *
    3. e = 65537
    4. p = 12408795636519868275579286477747181009018504169827579387457997229774738126230652970860811085539129972962189443268046963335610845404214331426857155412988073
    5. q = 12190036856294802286447270376342375357864587534233715766210874702670724440751066267168907565322961270655972226761426182258587581206888580394726683112820379
    6. c = 68960610962019321576894097705679955071402844421318149418040507036722717269530195000135979777852568744281930839319120003106023209276898286482202725287026853925179071583797231099755287410760748104635674307266042492611618076506037004587354018148812584502385622631122387857218023049204722123597067641896169655595
    7. n = p*q
    8. phi_n = (p-1)*(q-1)
    9. print(gcd(e,q-1))
    10. d = invert(e,(p-1))
    11. m = pow(c,d,p)
    12. print(long_to_bytes(m))

    一次就好

    题目:

    1. from Crypto.Util.strxor import strxor
    2. from Crypto.Util.number import *
    3. from gmpy2 import powmod,next_prime
    4. from FLAG import flag
    5. import codecs
    6. c = b'Just once,I will accompany you to see the world'
    7. flag = flag.ljust(len(c),'#')
    8. key = strxor(flag.encode(), c)
    9. m = bytes_to_long(key)
    10. p = getPrime(512)
    11. q = next_prime(p)
    12. N = p*q
    13. e = 0x10001
    14. gift = powmod(m, e, N)
    15. print(gift)
    16. print(N)
    17. # gift = 127749242340004016446001520961422059381052911692861305057396462507126566256652316418648339729479729456613704261614569202080544183416817827900318057127539938899577580150210279291202882125162360563285794285643498788533366420857232908632854569967831654923280152015070999912426044356353393293132914925252494215314
    18. # N = 164395171965189899201846744244839588935095288852148507114700855000512464673975991783671493756953831066569435489213778701866548078207835105414442567008315975881952023037557292470005621852113709605286462434049311321175270134326956812936961821511753256992797013020030263567313257339785161436188882721736453384403

    ljust的作用是将原字符串左对齐,用空格填充至指定长度。

    strxor的作用:搞不太懂,当作异或 

    可以知道p、q相近,则|p-q|很小,进而 \frac{(p-q)^2}{4}也很小,即 \frac{(p+q)^2}{4}与 N 相差很小,从而\frac{p+q}{2}\sqrt{N}相差很小

    \frac{(p+q)^2}{4} - N = \frac{(p+q)^2}{4} -pq = \frac{(p-q)^2}{4}

    这里都是近似等于

    因此,我们可以爆破差值delt,即\frac{(p-q)^2}{4},计算delt + N是否为完全平方数,如果为完全平方数,那么delt + N = \frac{(p+q)^2}{4}

    \sqrt{delt} = \frac{p-q}{2} \\ \sqrt{delt + N } = \frac{p+q}{2}

    1. from gmpy2 import *
    2. from Crypto.Util.number import *
    3. from Crypto.Util.strxor import strxor
    4. e = 0x10001
    5. gift = 127749242340004016446001520961422059381052911692861305057396462507126566256652316418648339729479729456613704261614569202080544183416817827900318057127539938899577580150210279291202882125162360563285794285643498788533366420857232908632854569967831654923280152015070999912426044356353393293132914925252494215314
    6. N = 164395171965189899201846744244839588935095288852148507114700855000512464673975991783671493756953831066569435489213778701866548078207835105414442567008315975881952023037557292470005621852113709605286462434049311321175270134326956812936961821511753256992797013020030263567313257339785161436188882721736453384403
    7. c = b'Just once,I will accompany you to see the world'
    8. delt = 0
    9. while True:
    10. if iroot(N+delt**2, 2)[1] == True:
    11. x = iroot(N+delt**2, 2)[0]
    12. p = delt + x
    13. break
    14. delt += 1
    15. q = N//p
    16. d = invert(e,(p-1)*(q-1))
    17. m = powmod(gift, d, N)
    18. key = long_to_bytes(m)
    19. flag = strxor(key, c)
    20. print(flag)

    参考记录官方wp  

    EZ_CBC

    题目:

    1. from Crypto.Util.number import *
    2. import random
    3. from secret import flag
    4. IV = bytes_to_long(b'cbc!')
    5. K = random.randrange(1,1<<30)
    6. assert flag[:7] == b'moectf{'
    7. assert flag[-1:] == b'}'
    8. block_length = 4
    9. flag = flag + ((block_length - len(flag) % block_length) % block_length) * b'\x00'
    10. plain_block = [flag[block_length * i: block_length * (i + 1)] for i in range(len(flag) // block_length)]
    11. c = []
    12. c0 = (IV ^ bytes_to_long(plain_block[0])) ^ K
    13. c.append(c0)
    14. for i in range(len(plain_block)-1):
    15. c.append(c[i] ^ bytes_to_long(plain_block[i+1]) ^ K)
    16. print(c)
    17. '''
    18. [748044282, 2053864743, 734492413, 675117672, 1691099828, 1729574447, 1691102180, 657669994, 1741780405, 842228028, 1909206003, 1797919307]
    19. '''

     分组加密、采用CBC的分组模式,有待学习

    {\displaystyle P_{i}=D_{K}(C_{i})\oplus C_{i-1}}

    {\displaystyle C_{0}=IV}

    解密:

    1. c = [748044282, 2053864743, 734492413, 675117672, 1691099828, 1729574447, 1691102180, 657669994, 1741780405, 842228028, 1909206003, 1797919307]
    2. m = [bytes_to_long(b'moec')]
    3. k = IV ^ m[0] ^ c[0]
    4. for i in range(1,len(c)):
    5. m.append(k^c[i]^c[i-1])
    6. for i in range(len(m)):
    7. print(long_to_bytes(m[i]).decode(),end='')

    参考记录官方wp 

    Smooth

    题目:

    1. from Crypto.Util.number import sieve_base,isPrime,getPrime
    2. import random
    3. from secret import flag
    4. def get_vulnerable_prime():
    5. p=2
    6. while True:
    7. for i in range(136):
    8. smallp=random.choice(sieve_base)
    9. p*=smallp
    10. if isPrime(p+1):
    11. return p+1
    12. P=get_vulnerable_prime()
    13. Q=getPrime(2048)
    14. N=P*Q
    15. e=0x10001
    16. for i in range(1,P-1729):
    17. flag=flag*i%P
    18. c=pow(flag,e,N)
    19. print("c=",hex(c))
    20. print("N=",hex(N))
    21. '''
    22. c= 0x3cc51d09c48948e2485820f6758fb10c7693c236acc527ad563ba8369c50a0bc3f650f39a871ee7ef127950ed916c5f4dc69894e11caf9d178cd7e8f9bf9af77e1c69384cc5444da64022b45636eeb5b7a221792880dd242be2bb99be3ed02c430c2b77d4912bec1619d664e066680910317c2bb0c87fafdf25f0a2400103278f557b8eca51d3b67d61098f1ab68da072bb2810596180afbc81a840cd24efef4d4113235160e725a5af4824dc716d758b3bc792f2458e979398e001b27e44d21682e2ef80ae94e21cd09a12e522ca2e569df72f012fa40341645445c6e68c6233a8a39e5b91eb14b1ccfa61c9bad25e8e3285a22da27cd506ddd63f207517a4e8ede00b104d8806ff4c0e3162c3de69169d7e584952655272b96d39d242bb83019c7eab1ceb0b4b287591e1e0a5b6378e70340a82d3430c5925d215f31fda6d9d0bccea240591b22a3d0f6b5bf4ddf1243d71aca0fd53045c352c8c5497ebcdbd7ac11083d63aba7c053604fda2430c317a4e04702b5ad539e110f101165b21dcd9fdb5ba7324acdba6a506244ce7c911197dfe067441fe7488d164c050f45ef6476aaf399cedde1793cceb8c21d88ec8ecf5e17df27586713d7dd9566ec5023cfef75422b73e2d5a932c661b3cfdf9c4bda12b64380d2be1aa957c3e1416e068937bafe79b8cf303296792388e9c197702e11e7ded6088ae992d352b23a4a27
    23. N= 0xdc77f076092cbe81c44789ccfc1b2ca55eabae65f44cf34382799e8bbb42d4d6c032bd897c21df1da401929d82deb56264823a757f6cacf63e0037146026cbab32ab9e4abc783dcabaac2b7ccc439937be3ab0fbf149524ff29ef0fe6f27e45215d74b40597c70e8207159dc7f542c2a6828500016480053dfc2d8dbf8fcdf6700640184c8f3318f7aab2e17e116edf680592f5eae951159bb8c20cfbd0cbab8b4b95925b5068038d0377a55a4d346ebbf53a1c2943b7c17e1b9d4a1b77916da2e15140b05b96655906942a07d04b7e25fa7521b3b7ae26eda68375a8b8ef2d5b4704a28168b236de97f24a663f0d0a3aeab47767dfe75a21662f5f25ef7f7d4b25c90fd7bcdd7137c23f03b6ea4209f8fb9b4628355e6ad62e6467d26666d3d1b0e6f078c5f3866413a6fcd3c1dc2ff3a5ab286e339d5c72f4d2f0473a4faddcba6b031bb6ec226fd4b319834b5029f09ea0ffeb5b6ed182d5a13675571b6708c38299118043390343e2f79edebd2ae0e0a765a3aebf776f54ca983cdae8547547cfc8430f7222aefa77301d7cc7c03b1451b6603028b21fea869d35138a9c83919985a91b3fdfa934f25a442cc10349b0ed6f2ee3955d40249e8b3fb9f1955534ee06cee41a3ad2d6ff7dbdb0f01e47b9e4d04f65232f5579135ae035e8ba2d1fe6465a730dcc8b9ba3a558ab38f040ea510757d25e92f886c50c24ad967f1
    24. '''

    choice用法:从非空序列中随机选取一个数据并带回,该序列可以是list、tuple、str、set。如果序列为空,则弹出IndexError错误。

    from Crypto.Util.number import sieve_base,不清楚。

    考察:Pollard‘s p-1 method 和Wilson定理,

    Pollard‘s p-1 method ,待学习

    Wilson定理:如果p是素数,则(p − 1) ! ≡ −1 (mod  p) 
    记录官方wp:

    1. from gmpy2 import powmod,gcd
    2. from Crypto.Util.number import long_to_bytes,inverse
    3. c= 0x3cc51d09c48948e2485820f6758fb10c7693c236acc527ad563ba8369c50a0bc3f650f39a871ee7ef127950ed916c5f4dc69894e11caf9d178cd7e8f9bf9af77e1c69384cc5444da64022b45636eeb5b7a221792880dd242be2bb99be3ed02c430c2b77d4912bec1619d664e066680910317c2bb0c87fafdf25f0a2400103278f557b8eca51d3b67d61098f1ab68da072bb2810596180afbc81a840cd24efef4d4113235160e725a5af4824dc716d758b3bc792f2458e979398e001b27e44d21682e2ef80ae94e21cd09a12e522ca2e569df72f012fa40341645445c6e68c6233a8a39e5b91eb14b1ccfa61c9bad25e8e3285a22da27cd506ddd63f207517a4e8ede00b104d8806ff4c0e3162c3de69169d7e584952655272b96d39d242bb83019c7eab1ceb0b4b287591e1e0a5b6378e70340a82d3430c5925d215f31fda6d9d0bccea240591b22a3d0f6b5bf4ddf1243d71aca0fd53045c352c8c5497ebcdbd7ac11083d63aba7c053604fda2430c317a4e04702b5ad539e110f101165b21dcd9fdb5ba7324acdba6a506244ce7c911197dfe067441fe7488d164c050f45ef6476aaf399cedde1793cceb8c21d88ec8ecf5e17df27586713d7dd9566ec5023cfef75422b73e2d5a932c661b3cfdf9c4bda12b64380d2be1aa957c3e1416e068937bafe79b8cf303296792388e9c197702e11e7ded6088ae992d352b23a4a27
    4. N= 0xdc77f076092cbe81c44789ccfc1b2ca55eabae65f44cf34382799e8bbb42d4d6c032bd897c21df1da401929d82deb56264823a757f6cacf63e0037146026cbab32ab9e4abc783dcabaac2b7ccc439937be3ab0fbf149524ff29ef0fe6f27e45215d74b40597c70e8207159dc7f542c2a6828500016480053dfc2d8dbf8fcdf6700640184c8f3318f7aab2e17e116edf680592f5eae951159bb8c20cfbd0cbab8b4b95925b5068038d0377a55a4d346ebbf53a1c2943b7c17e1b9d4a1b77916da2e15140b05b96655906942a07d04b7e25fa7521b3b7ae26eda68375a8b8ef2d5b4704a28168b236de97f24a663f0d0a3aeab47767dfe75a21662f5f25ef7f7d4b25c90fd7bcdd7137c23f03b6ea4209f8fb9b4628355e6ad62e6467d26666d3d1b0e6f078c5f3866413a6fcd3c1dc2ff3a5ab286e339d5c72f4d2f0473a4faddcba6b031bb6ec226fd4b319834b5029f09ea0ffeb5b6ed182d5a13675571b6708c38299118043390343e2f79edebd2ae0e0a765a3aebf776f54ca983cdae8547547cfc8430f7222aefa77301d7cc7c03b1451b6603028b21fea869d35138a9c83919985a91b3fdfa934f25a442cc10349b0ed6f2ee3955d40249e8b3fb9f1955534ee06cee41a3ad2d6ff7dbdb0f01e47b9e4d04f65232f5579135ae035e8ba2d1fe6465a730dcc8b9ba3a558ab38f040ea510757d25e92f886c50c24ad967f1
    5. def p_1_smooth(N):
    6. a = 2;n = 2
    7. while True:
    8. a = powmod(a, n, N)
    9. res = gcd(a-1, N)
    10. if res != 1 and res != N:
    11. return res
    12. n += 1
    13. p=p_1_smooth(N)
    14. q=N//p
    15. phi=(p-1)*(q-1)
    16. d=inverse(0x10001,phi)
    17. m=pow(c,d,N)
    18. for i in range(p-1729,p):
    19. m=m*i%p
    20. m=(-m)%p
    21. print(long_to_bytes(m))

    0RSA0

    题目:

    1. from Crypto.Util.number import *
    2. from flag import flag
    3. assert flag[0:7] == b'moectf{'
    4. assert flag[-1:] == b'}'
    5. flag = flag[7:-1]
    6. assert len(flag) == 32
    7. m1 = bytes_to_long(flag[0:16])
    8. m2 = bytes_to_long(flag[16:32])
    9. def enc1(m):
    10. p = getPrime(512)
    11. q = getPrime(512)
    12. n = p * q
    13. e = 3
    14. c = pow(m,e,n)
    15. return n,e,c
    16. def enc2(m):
    17. p = getPrime(512)
    18. q = getPrime(512)
    19. e = 65537
    20. d = inverse(e,(p-1)*(q-1))
    21. n = p * q
    22. dp2 = d % (p-1)
    23. c = pow(m,e,n)
    24. return n,e,c,dp2
    25. n1,e1,c1 = enc1(m1)
    26. n2,e2,c2,dp2 = enc2(m2)
    27. print("n1="+ str(n1))
    28. print("e1="+ str(e1))
    29. print("c1="+ str(c1))
    30. print("n2="+ str(n2))
    31. print("e2="+ str(e2))
    32. print("c2="+ str(c2))
    33. print("dp2="+ str(dp2))
    34. '''
    35. n1=133024413746207623787624696996450696028790885302997888417950218110624599333002677651319135333439059708696691802077223829846594660086912881559705074934655646133379015018208216486164888406398123943796359972475427652972055533125099746441089220943904185289464863994194089394637271086436301059396682856176212902707
    36. e1=3
    37. c1=1402983421957507617092580232325850324755110618998641078304840725502785669308938910491971922889485661674385555242824
    38. n2=159054389158529397912052248500898471690131016887756654738868415880711791524038820158051782236121110394481656324333254185994103242391825337525378467922406901521793714621471618374673206963439266173586955520902823718942484039624752828390110673871132116507696336326760564857012559508160068814801483975094383392729
    39. e2=65537
    40. c2=37819867277367678387219893740454448327093874982803387661058084123080177731002392119369718466140559855145584144511271801362374042596420131167791821955469392938900319510220897100118141494412797730438963434604351102878410868789119825127662728307578251855605147607595591813395984880381435422467527232180612935306
    41. dp2=947639117873589776036311153850942192190143164329999603361788468962756751774397111913170053010412835033030478855001898886178148944512883446156861610917865
    42. '''

    enc1:低指数解密,直接开方即可 

    enc2:dp泄露,利用脚本即可

  • 相关阅读:
    文章解读与仿真程序复现思路——电力自动化设备EI\CSCD\北大核心《多时间尺度下计及综合需求响应和碳捕集-电转气联合运行的综合能源系统优化调度》
    GitLab 卸载步骤 - 完全卸载
    Leetcode第142题—环形链表Ⅱ
    Squid代理服务器应用
    最强cron解析器
    知识图谱:信息抽取简易流程
    浙江大学利用 SVM 优化触觉传感器,盲文识别率达 96.12%
    TGRS 2023.11遥感预训练模型的再思考:基于实例感知的遥感场景分类视觉提示
    java毕业设计电商项目mybatis+源码+调试部署+系统+数据库+lw
    7月开始!2022年洪山区“5G+工业互联网”技术改造奖励申报条件和申报材料
  • 原文地址:https://blog.csdn.net/Luiino/article/details/127702178