[網鼎杯2020青龍組] you_raise_me_up


解題過程

1. 題目給的代碼如下:

 1 #!/usr/bin/env python
 2 # -*- coding: utf-8 -*-
 3 from Crypto.Util.number import *
 4 import random
 5 
 6 n = 2 ** 512
 7 m = random.randint(2, n-1) | 1
 8 c = pow(m, bytes_to_long(flag), n)
 9 print 'm = ' + str(m)
10 print 'c = ' + str(c)
11 
12 # m = 391190709124527428959489662565274039318305952172936859403855079581402770986890308469084735451207885386318986881041563704825943945069343345307381099559075
13 # c = 6665851394203214245856789450723658632520816791621796775909766895233000234023642878786025644953797995373211308485605397024123180085924117610802485972584499

讀完代碼可以得到一個表達式:

  c = mbytes_to_long(flag) mod n

2. 那么現在已知c, m, n求離散對數:

  bytes_to_long(flag) = log(m mod n) (c mod n)

sage中的discrete_log可以幫我們計算出結果[1],使用方法為:

  bytes_to_long(flag) = discrete_log((c mod n), (m mod n))  或

  bytes_to_long(flag) = discrete_log(c, (m mod n))

3. 將得到的數值long_to_bytes(flag)即可得到:flag{5f95ca93-1594-762d-ed0b-a9139692cb4a}

1 from Crypto.Util.number import *
2 flag = 56006392793405651552924479293096841126763872290794186417054288110043102953612574215902230811593957757
3 print long_to_bytes(flag)

Reference

[1] https://blog.csdn.net/qq_39642801/article/details/104158699?utm_medium=distribute.pc_relevant.none-task-blog-baidujs-4


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM