1. 程式人生 > 實用技巧 >Sagemath在ctf密碼學中的使用

Sagemath在ctf密碼學中的使用

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)