Loading

sagemath密码学

sage学习

1.基本的环和域

整数域,有理数域和实数域

ZZ(3)
QQ(0.25)
RR(2^0.5)

生成虚数单位i

i=ComplexField().gen();(2+i)*(4+3*i)

复数域

CC(1,2)

构造多项式环

返回具有给定属性和变量名的全局唯一的单变量或多元多项式环

定义在整数域上的多项式环R,变量为w ; ZZ也可换成其他数域

R.<w> = PolynomialRing(ZZ)
(1 + w)^3

有限环

RN=IntegerModRing(63) ; RN
FR=Integers(17) ; FR

自身的代数扩展

exR=FR[w]/(w^2+3)
exR=FR.extension(w^2+3) ; exR

以python整数的形式返回所有可逆元素的列表

FR.list_of_elements_of_multiplicative_group()

假设环的乘法群是循环的,返回这个环的乘法群的生成元

FR.multiplicative_generator()

返回这个环的一个随机元素

FR.random_element()

上述几种方法对如下的域同样支持

#有限域 
#素数域 
G1=GF(37);G1 
#伽罗瓦域 G2=GF(3^5);G2

2.数论基本函数

同时求商与余数

q,r=divmod(12,5)

求公约数

d=gcd(12,5)

扩展欧几里得算法

d,u,v=xgcd(12,5)
print("d:{0} u:{1} v:{2}".format(d,u,v))

12在模5下的逆

u=inverse_mod(12,5)

生成[lb,ub)之间的随机素数

注意ub在前,lb在后,lb可缺省为0

可通过这种方式生成128位的随机素数

p=random_prime(2L**128,2L**127)

判断是否为素数

is_prime(65537)

第20个素数

nth_prime(20)

计算x^y mod n

z=power_mod(12,5,17)
z=pow(12,5,17)

欧拉函数

euler_phi(111)

中国剩余定理

A=[a1,...,an] , M=[m1,...,mn]

ai = x mod mi , i = 1,...,n

crt([1,2,3,4],[7,5,12,23])

求自身的n次根

FR(12).nth_root(7,all='True')

求多项式的根

roots方法必须作用在域上

R.<x> = PolynomialRing(G1) 
xt=G1(12) 
yt=xt^6 
f=x^6-yt 
f.roots()

求离散对数

\[x^{2} \equiv 5 \bmod 41 \]

x=mod(5,41)
r=x.nth_root(22)

输出表达式近似值

result=pi^2
result.numerical_approx()

素数分布(Pi(x))

\[\frac{\pi(x)}{x / \operatorname{In}(x)} \]

result=prime_pi(1000)/(1000/log(1000))
result.numerical_approx() #1.16050288686900

创建整数域中的椭圆曲线

\[y^{2}=x^{3}+a_{4} x+a_{6} \]

a4=2;a6=3;F=GF(7);
E=EllipticCurve(F,[0,0,0,a4,a6])
print(E.cardinality()) #6
print(E.points()) #[(0 : 1 : 0), (2 : 1 : 1), (2 : 6 : 1), (3 : 1 : 1), (3 : 6 : 1), (6 : 0 : 1)]

创建点

point1=E([2,1])
point2=E([3,6])
print(point1+point2)#(6 : 0 : 1)
print(point1-point2)#(2 : 6 : 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
#也可以使用符号
AY
#解线性方程组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.离散椭圆曲线

以国密SM2算法使用的椭圆曲线为例;

p=ZZ('FFFFFFFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000FFFFFFFFFFFFFFFF',16)
a=ZZ('FFFFFFFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000FFFFFFFFFFFFFFFC',16)
b=ZZ('28E9FA9E9D9F5E344D5A9E4BCF6509A7F39789F515AB8F92DDBCBD414D940E93',16)
#有限域GF(p)上的椭圆曲线y^2 = x^3 + a*x + b mod p
E=EllipticCurve(GF(p),[0,0,0,a,b])
#基点
g=E([ZZ('32c4ae2c1f1981195f9904466a39c9948fe30bbff2660be1715a4589334c74c7',16),ZZ('bc3736a2f4f6779c59bdcee36b692153d0a9877cc62a474002df32e52139f0a0',16)])
#基点的阶
n=ZZ('FFFFFFFEFFFFFFFFFFFFFFFFFFFFFFFF7203DF6B21C6052B53BBF40939D54123',16)
#生成密钥
sk=random_prime(2*n//3,n//3)
#生成公钥
G=sk*g

5.离散对数

前言:求解以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)

6. coppersmith算法

coppersmith算法介绍链接

使用sage实现coppersmith相关攻击,GitHub链接

最后,sage的官方文档链接

posted @ 2023-01-24 22:56  vconlln  阅读(1142)  评论(0编辑  收藏  举报