【CTF基础】有限域椭圆曲线定义与计算方式
定义与基础运算
有限域椭圆曲线定义
Ep(a, b)表示椭圆曲线方程y**2 = x**3 + a*x + b,在有限域Fp中,表示所有在同余意义上满足该方程的(x, y)点,例如下图:(图片来自网络)
对椭圆曲线E23(1, 1),点P(3, 10)满足y**2 = 100 = 31 = x**3 + x + 1 (mod 23),故点P(3, 10)在曲线上
有限域椭圆曲线计算关系
椭圆曲线上两点P(x1, y1)和Q(x2, y2)的计算关系如下:
(1) -P:-P = (x1, -y1) = (x1, p-y1)
(2) P+Q:首先需要计算参数k,定义为:
当P=Q时,k = (3*x1**2+a) / (2*y1) = (3*x1**2+a) * inv((2*y1), p) (mod p)
当P!=Q时,k = (y2-y1) / (x2-x1) = (y2-y1) * inv((x2-x1), p) (mod p)
然后计算x3, y3满足
x3 = k2 - x1 - x2 (mod p)
y3 = k * (x1 - x3) - y1 (mod p)
定义为P(x1, y1) + Q(x2, y2) = R(x3, y3)
例题:
已知椭圆曲线E23(1, 1)上两点P(3, 10),Q(9, 7),求(1) -P,(2)P+Q,(3)2P
解答:
(1) -P = (3, -10) (mod 23) = (3, 13)
(2) k = (7-10) * inv((9-3), 23) (mod 23) = (-3) * 4 (mod 23) = 11
x3 = k2 - x1 - x2 (mod p) = 109 (mod 23) = 17
y3 = k * (x1 - x3) - y1 (mod p) = 89 (mod 23) = 20,P + Q = (17, 20)
(3) k = (3*3**2+1) * inv((2*10), 23) (mod 23) = 5 * 15 (mod 23) = 6
x3 = k2 - x1 - x2 (mod p) = 30 (mod 23) = 7
y3 = k * (x1 - x3) - y1 (mod p) =-34 (mod 23) = 12,2P = (7, 12)
有限域椭圆曲线的阶
接下来定义有限域椭圆曲线的阶。对于曲线上一点P,若存在最小的正整数n,使得nP = O(无穷远点),则称n为P的阶。例如,在曲线E23(1, 1)中,点P(3, 13)可计算的27P = (3, -13) = -P,因此28P = O,P的阶为28。所有形如kP的点构成了一个循环阿贝尔群,其阶数为29,其中生成元为P,如下图所示:(图片来自网络)
可见这些点分布是杂乱无章的,利用这一性质诞生出椭圆曲线加密的算法
有限域椭圆曲线加密算法
考虑K = kG,其中K、G为椭圆曲线Ep(a, b)上的点,n为G的阶(即nG = O),k为小于n的整数。根据加法法则,给定k、G计算K很容易;但反过来给定K、G,计算k则非常困难。实际使用中,p与n都会相当大,因此把n个解点逐一算出来是不可能的。上述描述中,称G为基点,k为私有密钥,K为公开密钥。通信算法如下:
- 1.Alice选定一条椭圆曲线E,并取椭圆曲线上一点作为基点G 假设选定E29(4,20),基点G(13,23) , 基点G的阶数n=37
- 2.Alice选择一个私有密钥k(k<n),并生成公开密钥K=kG
例如k = 25,K= kG = 25G = (14,6) - 3.Alice将E和点K、G传给Bob
- 4.Bob收到信息后,将待传输的明文编码到上的一点M(编码方法略),并产生一个随机整数r(r<n,n为G的阶数)
例如r=6,要加密的信息为m=3,因为M也要在E29(4,20)上,所以M=(3,28) - 5.Bob计算点C1=M+rK和C2=rG
C1 = M + 6K = M + 6 * 25 * G = M + 2G = (3,28) + (27,27) = (6,12)
C2 = 6G = (5,7) - 6.Bob将C1、C2传给Alice
- 7.Alice收到信息后,计算C1-kC2,结果就是点M
C1 - kC2 = (6,12) - 25C2 = (6,12) - 25 * (5,7)
= (6,12) - (27,27) = (6,12) + (27,2) = (3,28)
可以这样做的原因是:
C1 - kC2 = M + rK - krG = M + rkG - krG = M
通常将Fp上的一条椭圆曲线描述为T=(p,a,b,G,n,h)。其中p、a、b确定一条椭圆曲线;G为基点;n为点G的阶;h是椭圆曲线上所有点的个数m与n相除的商的整数部分。
例题:
已知椭圆曲线加密Ep(a,b)参数为
p = 15424654874903,a = 16546484,b = 4548674875,
G(6478678675,5636379357093),私钥为k = 546768,求公钥K(x,y)
解答:
主要功能代码部分见下:
#!/usr/bin/python
#encoding=utf-8
from gmpy2 import invertdef ECCnegative(x, y, p):return x, p-ydef ECCadd(x1, y1, x2, y2, p, a):if(x1==x2):if((y1+y2)%p==0):return -1, -1 # infinity returnelif(y1!=y2):print ("Input Error, Please check the input!")return -2, -2 # error input returnelse:k = ((3 * x1 * x1 + a) * invert(2 * y1, p)) % px3 = (k * k - x1 - x2) % py3 = (k * (x1 - x3) - y1) % preturn int(x3), int(y3)else:k = ((y2 - y1) * invert(x2 - x1, p))%px3 = (k * k - x1 - x2) % py3 = (k * (x1 - x3) - y1) % preturn int(x3), int(y3)def ECCmul(k, x, y, p, a):tempx, tempy = -1, -1nowx, nowy = x, ywhile(k != 0):mark = k & 1k = k >> 1if(mark == 1):if(tempx == -1):tempx, tempy = nowx, nowyelse:tempx, tempy = ECCadd(tempx, tempy, nowx, nowy, p, a)nowx, nowy = ECCadd(nowx, nowy, nowx, nowy, p, a)return tempx, tempy
结果为(13957031351290, 5520194834100)
(备注:本题为XUSTCTF2016原题,网上部分公开的代码是错误的,因为里边一个写法问题,导致and判断被当成了与运算,如下所示:
print (-1<0 & -1<0) False(代码中写法)
print (-1<0 and -1<0) True(正确写法)
在xctf平台刷题的时候请注意需要填写错误答案)
【CTF基础】有限域椭圆曲线定义与计算方式相关推荐
- ap 目标检测算法map_目标检测算法的评估指标:mAP定义及计算方式
前面依次介绍了: 本节介绍目标检测算法的评估指标:mAP定义及计算方式 mAP:mean Average Precision,平均精度均值,即AP(Average Precision)的平均值,它是目 ...
- Java基础-时间复杂度计算方式
Java基础-时间复杂度计算方式 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 时间复杂度通常是衡量算法的优劣的,衡量算法的时间严格来讲是很难衡量的,由于不同的机器性能不用环境 ...
- 《利用python进行数据分析》读书笔记--第四章 numpy基础:数组和矢量计算
第四章 Numpy基础:数组和矢量计算 第一部分:numpy的ndarray:一种多维数组对象 实话说,用numpy的主要目的在于应用矢量化运算.Numpy并没有多么高级的数据分析功能,理解Numpy ...
- 凉亭瓦片计算方式_凉亭简介
凉亭瓦片计算方式 There are many tools and libraries available today that makes our development task easier. ...
- 【基础版】大学计算机-计算思维导论
超星尔雅[基础版]大学计算机-计算思维导论章节测验答案,下面就是按照章节顺序的题目 计算机.计算与计算思维 1[单选题]人类应具备的三大思维能力是指_____.答案:实验思维.理论思维和计算思维 A. ...
- 如何高效设计游戏——关于战斗力计算方式的总结
该文章来自用户转载 点击阅读原文 前言 有关于角色的战斗力,大家都不会陌生,几乎每一款游戏都有在计算相关角色的战斗力. 无论采用何种形式.方法,目的只有一个,就是想让玩家比较轻松直接的对比出角色的综 ...
- ECC有限域椭圆曲线加密算法实例---构建椭圆曲线的循环群,利用椭圆曲线离散对数问题实现信息的加密解密,签名和验证
一个简单的实例:A向B发送信息的加解密,签名和验证 通过有限域椭圆曲线构建一个循环群,利用椭圆曲线的离散对数问题实现对信息加解密,原理和实现参考链接:有限域上的椭圆曲线加密|附加解密cpp代码_哔哩哔 ...
- 【Azure】微软 Azure 基础解析(六)计算服务中的虚拟机 VM、虚拟机规模集、Azure Functions 与 Azure 容器(ACI)
本系列博文还在更新中,收录在专栏:「Azure探秘:构建云计算世界」 专栏中. 本系列文章列表如下: [Azure]微软 Azure 基础解析(三)描述云计算运营中的 CapEx 与 OpEx,如何区 ...
- 3种场景下的相关性计算方式,热力图优化展示
导语:相关系数衡量的是两个变量同时变化的程度和方向,比如身高和体重,体重一般随着身高增加而增加,在很多情况下,我们处理的对象都是连续变量与连续变量之间的关系,但是还有离散变量与离散变量,连续变量与离散 ...
最新文章
- python网络爬虫开发从入门到精通pdf-Python 3网络爬虫开发实战PDF高清完整版下载...
- 0909初学编译原理
- boost::stable_sort相关的测试程序
- 二十四种设计模式:访问者模式(Visitor Pattern)
- jquery hover事件中 fadeIn和fadeOut 效果不能及时停止
- 好色之旅-画图三字经
- 020-python函数和常用模块-文件操作
- 【预测模型】基于蝙蝠算法优化最小二乘支持向量机lssvm实现数据预测matlab代码
- JS 字符串去除首尾空格
- Zotero | zotero与endnote题录与pdf文件的完整互转(2)
- 【教程】最新微信视频号视频批量下载保存方法,非常简单的方法
- html 防网页假死,html5 Web开发:防止浏览器假死的方法
- python[爬虫]爬取百万条新浪新闻 新浪滚动新闻中心(多进程)
- python发朋友圈突破朋友圈限制_用Python发一个高逼格的朋友圈
- 比较几种步进电机加减速控制方案
- DB DBS和DBMS的区别
- Android日历移植小结
- post请求改成body_Post 方法参数写在body中和写在url中有什么区别?
- 烟台大学—贺利坚的计算机课程教学链接
- 易模3D建模教程| 20min教会你人像3D建模