NSSCTF密码题
解题思路
1.题目包含两个文件:一个是sage文件,另一个是txt。sage文件内的代码内容如下
// sage code
load('never_gonna.sage')
import numpy as np
n = len(flag)
p = next_prime(4396 // 7)
Zp = Zmod(p)
assert give_you_up.__class__.__name__ == 'Matrix_modn_dense_double'
assert give_you_up.nrows() == n
assert give_you_up.ncols() == n
assert give_you_up.base_ring() == Zp
assert isinstance(let_you_down, list)
for i in range(n):
make_you_cry = Zp(flag[i])
say_goodbye = let_you_down[i]
assert say_goodbye.__class__.__name__ == 'Vector_modn_dense'
assert say_goodbye.length() == n
assert say_goodbye.base_ring() == Zp
assert give_you_up * say_goodbye == make_you_cry * say_goodbye, (i, say_goodbye)
print(give_you_up)
galf = np.array(list(flag))
run_around = np.argsort(galf)
desert_you = np.argsort(run_around)
print(desert_you)
2.对比另一个txt文件的内容,我们可以简单推测一下代码的内容推测内容如下:其中give_you_up为文件中前35行的数组,最后一行输出的是desert_you,代码中的n为35,p为631,Zp对应Zmod函数
# load('never_gonna.sage')
import numpy as np
from sympy import *
give_you_up=[[190,567,69,241,81,519,489,211,204,53,71,38,547,319,398,373,216,31,587,572,343,159,111,200,503,286,162,374,426,579,606,448,590,49,605],
......
......
......
[119,494,280,481,296,336,320,98,523,335,501,407,530,416,36,526,300,162,121,391,363,70,409,257,569,380,565,294,466,357,29,455,471,132,495]]
desert_you=[18,22,21,13,23,14,33,15,6,29,7,8,20,25,9,16,10,26,12,19,11,0,17,31,28,30,32,1,24,5,2,27,3,4,34]
n = 35
# p = next_prime(4396 // 7)
p= nextprime(628)#631
# Zp = Zmod(p)
3.同时对照着数据类型:
say_goodbye.class.name == ‘Vector_modn_dense’,assert give_you_up.class.name == ‘Matrix_modn_dense_double’
以及 np.argsort函数可以尝试逆向运算得到flag数组的值(这一步未进行尝试)