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()

求离散对数#

x25mod41

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

输出表达式近似值#

result=pi^2
result.numerical_approx()

素数分布(Pi(x))#

π(x)x/In(x)

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

创建整数域中的椭圆曲线#

y2=x3+a4x+a6

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的官方文档链接

作者:chinjinyu

出处:https://www.cnblogs.com/vconlln/p/17066506.html

版权:本作品采用「署名-非商业性使用-相同方式共享 4.0 国际」许可协议进行许可。

posted @   vconlln  阅读(1242)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 零经验选手,Compose 一天开发一款小游戏!
· 一起来玩mcp_server_sqlite,让AI帮你做增删改查!!
more_horiz
keyboard_arrow_up light_mode palette
选择主题
menu
点击右上角即可分享
微信分享提示