ACTF 2023 部分WP

打印 上一主题 下一主题

主题 863|帖子 863|积分 2589

来自密码手的哀嚎:
玩不了一点,太难了。
CRYPTO

MDH

Description
Malin’s Diffile-Hellman Key Exchange.
task.sage
  1. from hashlib import sha256
  2. from secret import flag
  3. r = 128
  4. c = 96
  5. p = 308955606868885551120230861462612873078105583047156930179459717798715109629
  6. Fp = GF(p)
  7. def gen():
  8.     a1 = random_matrix(Fp, r, c)
  9.     a2 = random_matrix(Fp, r, c)
  10.     A = a1 * a2.T
  11.     return (a1, a2), A
  12. sk_alice, pk_alice = gen()
  13. sk_bob, pk_bob = gen()
  14. shared = (sk_alice[0].T * pk_bob * sk_alice[1]).trace()
  15. ct = int(sha256(str(int(shared)).encode()).hexdigest(), 16) ^^ int.from_bytes(flag, 'big')
  16. with open('output.txt', 'wb') as f:
  17.     f.write(str(ct).encode() + b'\n')
  18.     f.write(str(list(pk_alice)).encode() + b'\n')
  19.     f.write(str(list(pk_bob)).encode() + b'\n')
复制代码
output.txt
  1. 8308943029741424587523612386337754255889681699670071706719724435165094611096603769021839263
  2. [(248911473252706126701034292146541373251616513930062195044617795903221826522, 2006663512374471656012713476848952481708164609054161957903243961884729327, 34477445744870695124522330116853976140397756578144976256418933561356297270, 134510431748375978099734325290614896206741166021565864231628975299374894934, 263052897010932566643732419798564392599203662525075356313352360336696893126, 141993015830421728697942660480086149608207938704594224742919997457007731362, 2884941569385999952542152446419918040970038754772386008722345958209977361, 251929132317823958330447233877195880589103297101688031807949769646459583779, 202402171486986340762120037260332866100215659317408872569460852300216859639, 299869910419680584431600458234987314403629236129755735947187138970557973965, 32123365781587714822724172153965985134547746672138349976513502380627017939,........
复制代码
分析一下:
shared = (sk_alice[0].T * pk_bob * sk_alice[1]).trace()
也就是说shared = ((a1)T  * b1 * (b2)T * a2 ).trace()
已知Pk_alice = a1 * (a2)T 和Pk_bob = b1 * (b2)T
线性代数学的好的我们可以根据矩阵的迹的性质:Tr(A) = Tr(AT) ,Tr(AB) = Tr(BA)
因此我们可以把shared 内容交换下顺序得到 shared = ((a1)T  * a2 * (b2)T * b1 ).trace()
即shared = (Pk_alice.T * Pk_bob).trace()
exp:
  1. from hashlib import sha256
  2. p = 308955606868885551120230861462612873078105583047156930179459717798715109629
  3. Fq = GF(p)
  4. f = open("output.txt",'r')
  5. data = f.readlines()
  6. ct = eval(data[0])
  7. pk_alice = eval(data[1])
  8. pk_bob = eval(data[2])
  9. pk_alice = Matrix(Fp,pk_alice)
  10. pk_bob = Matrix(Fq,pk_bob)
  11. shared = (pk_alice.T * pk_bob).trace()
  12. m = int(sha256(str(int(shared)).encode()).hexdigest(), 16) ^^ ct
  13. flag = bytes.fromhex(hex(m)[2:])
  14. print(flag)
  15. # ACTF{do_you_know_f0rm2l1n_1s_4w3s0m3!}
复制代码
EasyRSA

Description
EasyRSA
  1. from secret import flag
  2. from Crypto.Util.number import *
  3. def genKey(nbits, dbits):
  4.     bbits = (nbits // 2 - dbits) // 2
  5.     while True:
  6.         a = getRandomNBitInteger(dbits)
  7.         b = getRandomNBitInteger(bbits)
  8.         c = getRandomNBitInteger(bbits)
  9.         p1 = a * b * c + 1
  10.         if isPrime(p1):
  11.             # print("p1 =", p1)
  12.             break
  13.     while True:
  14.         d = getRandomNBitInteger(dbits)
  15.         p2 = b * c * d + 1
  16.         if isPrime(p2):
  17.             # print("p2 =", p2)
  18.             break
  19.     while True:
  20.         e = getRandomNBitInteger(bbits)
  21.         f = getRandomNBitInteger(bbits)
  22.         q1 = e * d * f + 1
  23.         p3 = a * e * f + 1
  24.         if isPrime(q1) and isPrime(p3):
  25.             # print("p3 =", p3)
  26.             # print("q1 =", q1)
  27.             break
  28.     while True:
  29.         d_ = getRandomNBitInteger(dbits)
  30.         if GCD(a * b * c * d * e * f, d_) != 1:
  31.             continue
  32.         e_ = inverse(d_, a * b * c * d * e * f)
  33.         k1 = (e_ * d_ - 1) // (a * b * c * d * e * f)
  34.         assert e_ * d_ == (a * b * c * d * e * f) * k1 + 1
  35.         q2 = k1 * e * f + 1
  36.         q3 = k1 * b * c + 1
  37.         if isPrime(q2) and isPrime(q3):
  38.             # print("q2 =", q2)
  39.             # print("q3 =", q3)
  40.             # print("e =", e_)
  41.             # print("d =", d_)
  42.             break
  43.     n1 = p1 * q1
  44.     n2 = p2 * q2
  45.     n3 = p3 * q3
  46.    
  47.     assert pow(pow(0xdeadbeef, e_, n1), d_, n1) == 0xdeadbeef
  48.     assert pow(pow(0xdeadbeef, e_, n2), d_, n2) == 0xdeadbeef
  49.     assert pow(pow(0xdeadbeef, e_, n3), d_, n3) == 0xdeadbeef
  50.     return(e_, n1, n2, n3)
  51. nbits = 0x600
  52. dbits = 0x210
  53. m = bytes_to_long(flag)
  54. e, n1, n2, n3 = genKey(nbits, dbits)
  55. c = pow(m, e, n1)
  56. print("c =", c)
  57. print("e =", e)
  58. print("n1 =", n1)
  59. print("n2 =", n2)
  60. print("n3 =", n3)
  61. # c = 63442255298812942222810837512019302954917822996915527697525497640413662503768308023517128481053593562877494934841788054865410798751447333551319775025362132176942795107214528962480350398519459474033659025815248579631003928932688495682277210240277909527931445899728273182691941548330126199931886748296031014210795428593631253184315074234352536885430181103986084755140024577780815130067722355861473639612699372152970688687877075365330095265612016350599320999156644
  62. # e = 272785315258275494478303901715994595013215169713087273945370833673873860340153367010424559026764907254821416435761617347240970711252213646287464416524071944646705551816941437389777294159359383356817408302841561284559712640940354294840597133394851851877857751302209309529938795265777557840238332937938235024502686737802184255165075195042860413556866222562167425361146312096189555572705076252573222261842045286782816083933952875990572937346408235562417656218440227
  63. # n1 = 473173031410877037287927970398347001343136400938581274026578368211539730987889738033351265663756061524526288423355193643110804217683860550767181983527932872361546531994961481442866335447011683462904976896894011884907968495626837219900141842587071512040734664898328709989285205714628355052565784162841441867556282849760230635164284802614010844226671736675222842060257156860013384955769045790763119616939897544697150710631300004180868397245728064351907334273953201
  64. # n2 = 327163771871802208683424470007561712270872666244394076667663345333853591836596054597471607916850284565474732679392694515656845653581599800514388800663813830528483334021178531162556250468743461443904645773493383915711571062775922446922917130005772040139744330987272549252540089872170217864935146429898458644025927741607569303966038195226388964722300472005107075179204987774627759625183739199425329481632596633992804636690274844290983438078815836605603147141262181
  65. # n3 = 442893163857502334109676162774199722362644200933618691728267162172376730137502879609506615568680508257973678725536472848428042122350184530077765734033425406055810373669798840851851090476687785235612051747082232947418290952863499263547598032467577778461061567081620676910480684540883879257518083587862219344609851852177109722186714811329766477552794034774928983660538381764930765795290189612024799300768559485810526074992569676241537503405494203262336327709010421
复制代码
分析如下:

于是有:

构造格:

调至平衡后,LLL即可得d,exp:

[code]#Sage#from gmpy2 import *c = 63442255298812942222810837512019302954917822996915527697525497640413662503768308023517128481053593562877494934841788054865410798751447333551319775025362132176942795107214528962480350398519459474033659025815248579631003928932688495682277210240277909527931445899728273182691941548330126199931886748296031014210795428593631253184315074234352536885430181103986084755140024577780815130067722355861473639612699372152970688687877075365330095265612016350599320999156644e_ = 272785315258275494478303901715994595013215169713087273945370833673873860340153367010424559026764907254821416435761617347240970711252213646287464416524071944646705551816941437389777294159359383356817408302841561284559712640940354294840597133394851851877857751302209309529938795265777557840238332937938235024502686737802184255165075195042860413556866222562167425361146312096189555572705076252573222261842045286782816083933952875990572937346408235562417656218440227n1 = 327163771871802208683424470007561712270872666244394076667663345333853591836596054597471607916850284565474732679392694515656845653581599800514388800663813830528483334021178531162556250468743461443904645773493383915711571062775922446922917130005772040139744330987272549252540089872170217864935146429898458644025927741607569303966038195226388964722300472005107075179204987774627759625183739199425329481632596633992804636690274844290983438078815836605603147141262181n2 = 442893163857502334109676162774199722362644200933618691728267162172376730137502879609506615568680508257973678725536472848428042122350184530077765734033425406055810373669798840851851090476687785235612051747082232947418290952863499263547598032467577778461061567081620676910480684540883879257518083587862219344609851852177109722186714811329766477552794034774928983660538381764930765795290189612024799300768559485810526074992569676241537503405494203262336327709010421n3 = 473173031410877037287927970398347001343136400938581274026578368211539730987889738033351265663756061524526288423355193643110804217683860550767181983527932872361546531994961481442866335447011683462904976896894011884907968495626837219900141842587071512040734664898328709989285205714628355052565784162841441867556282849760230635164284802614010844226671736675222842060257156860013384955769045790763119616939897544697150710631300004180868397245728064351907334273953201assert n1

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

正序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

我爱普洱茶

金牌会员
这个人很懒什么都没写!
快速回复 返回顶部 返回列表