# p = 9620154777088870694266521670168986508003314866222315790126552504304846236696183733266828489404860276326158191906907396234236947215466295418632056113826161 # C = [7062910478232783138765983170626687981202937184255408287607971780139482616525215270216675887321965798418829038273232695370210503086491228434856538620699645,7096268905956462643320137667780334763649635657732499491108171622164208662688609295607684620630301031789132814209784948222802930089030287484015336757787801],[7341430053606172329602911405905754386729224669425325419124733847060694853483825396200841609125574923525535532184467150746385826443392039086079562905059808,2557244298856087555500538499542298526800377681966907502518580724165363620170968463050152602083665991230143669519866828587671059318627542153367879596260872]
v1,v2是随机的向量 \[
A = \begin{pmatrix}v_1 \\ v_2\end{pmatrix} \\
B = \begin{pmatrix}\lambda_1v_1 \\ \lambda_2v_2\end{pmatrix}
\]
from sage.allimport * from Crypto.Util.number import * from tqdm import tqdm from random import randint from Crypto.Cipher import AES from Crypto.Util.Padding import pad
print(f"p = {p}") print(f'C = {[i for i in C]}'.replace('(', '[').replace(')', ']')) print(f'D = {[i for i in D]}'.replace('(', '[').replace(')', ']')) print(f"msg = {msg}")
C = matrix(GF(p),C) D = matrix(GF(p),D) M,P = C.eigenmatrix_right() Mk,Pk = D.eigenmatrix_right() g = M[1][1] for i inrange(len(D[0])): h = Mk[i][i] Q = GF(p) g = Q(g) h = Q(h) try: k = discrete_log(h,g) print(k) key = pad(long_to_bytes(k), 16) aes = AES.new(key,AES.MODE_ECB) flag = aes.decrypt(msg) print(flag) except: pass
flag = os.getenv("LILCTF_FLAG", "LILCTF{default}")
nrows = 16 ncols = 32
A = [[random.randint(1, 1919810) for _ inrange(ncols)] for _ inrange(nrows)] x = [random.randint(1, 114514) for _ inrange(ncols)]
b = [sum(A[i][j] * x[j] for j inrange(ncols)) for i inrange(nrows)] print(A) print(b)
xx = list(map(int, input("Enter your solution: ").strip().split())) if xx != x: print("Oh, your linear algebra needs to be practiced.") else: print("Bravo! Here is your flag:") print(flag)
b = [2^100*i for i in b] M =2^100* Matrix(ZZ,A) M = M.stack(identity_matrix(32)) r = b + 32*[0] M = M.augment(vector(ZZ,r)).T x = M.BKZ(block_size=80)[0][16:] print(-x)
为了使得它成为短向量,配一个系数就行了 \[
\begin{pmatrix}2^{100}A &2^{100}b\\ E &
O\end{pmatrix}\begin{pmatrix}x \\-1
\end{pmatrix}=(0,..,0,x_1,x_2,..x_{32})
\]