Sagemath在ctf密碼學中的使用
阿新 • • 發佈:2020-09-14
1. 數論基本函式
#求x與y的公約數,x與y自行賦值,以下變數同理 d=gcd(x,y) #擴充套件的歐幾里得演算法,d=u*x+v*y d,u,v=xgcd(x,y) #若x與y互素,則u*x+v*y=1,記作u=x^-1 mod y u=inverse_mod(x,y) #生成[lb,ub)之間的隨機素數,注意ub在前,lb在後,lb可預設為0 p=random_prime(ub,lb) #判斷x是否為素數 is_prime(x) #第th個素數 nth_prime(th) #生成[x,y)之間的隨機整數,x可預設為1 ZZ.random_element(x,y) #計算x^y mod n z=power_mod(x,y,n) #尤拉函式 euler_phi(n) #中國剩餘定理,A=[a1,...,an],M=[m1,...,mn] ai=x mod mi,i=1,...,n x=crt(A,M)
2. 有限域
#定義一個有限域,p是一個素數
G1=GF(p)
#定義一個有限域2^n
G2=GF(2^n)
#擴充套件域
p=108848362000185157098908557633810357240367513945191048364780883709439999L
K.<w>=PolynomialRing(GF(p))
K.<w>=GF(p).extension(w^2+1)
3. 線性代數
#定義矩陣,預設定義在實數域 A = Matrix([[1,2,3,5],[3,2,1,2],[1,1,1,0],[3,7,2,2]]) A^-1 #定義在其他域上的矩陣,如有限域 A = Matrix(GF(13),[[1,2,3,5],[3,2,1,2],[1,1,1,0],[3,7,2,2]]) A^-1 #可以看到兩個逆矩陣不一樣 #定義向量,定義在有限域,預設定義在實數域 w = vector(GF(13),[1,1,4,3]) Y=A*w;Y Z=w*A;Z #解線性方程組AX=Y X = A.solve_right(Y);X #也可以使用符號\ A\Y #解線性方程組XA=Y X = A.solve_left(Z);X #格基約減 A = Matrix([[1,2,3,5],[3,2,1,2],[1,1,1,0],[3,7,2,2]]) #LLL演算法 A.LLL() #BKZ演算法 A.BKZ()
4. 離散對數
前言:求解以base為底,a的對數;ord為base的階,可以預設,operation可以是'+'與'*',預設為'*';bounds是一個區間(ld,ud),需要保證所計算的對數在此區間內。
#通用的求離散對數的方法 x=discrete_log(a,base,ord,operation) #求離散對數的Pollard-Rho演算法 x=discrete_log_rho(a,base,ord,operation) #求離散對數的Pollard-kangaroo演算法(也稱為lambda演算法) x=discrete_log_lambda(a,base,bounds,operation) #小步大步法 x=bsgs(base,a,bounds,operation)