定义与基础运算

有限域椭圆曲线定义

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基础】有限域椭圆曲线定义与计算方式相关推荐

  1. ap 目标检测算法map_目标检测算法的评估指标:mAP定义及计算方式

    前面依次介绍了: 本节介绍目标检测算法的评估指标:mAP定义及计算方式 mAP:mean Average Precision,平均精度均值,即AP(Average Precision)的平均值,它是目 ...

  2. Java基础-时间复杂度计算方式

    Java基础-时间复杂度计算方式 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任.   时间复杂度通常是衡量算法的优劣的,衡量算法的时间严格来讲是很难衡量的,由于不同的机器性能不用环境 ...

  3. 《利用python进行数据分析》读书笔记--第四章 numpy基础:数组和矢量计算

    第四章 Numpy基础:数组和矢量计算 第一部分:numpy的ndarray:一种多维数组对象 实话说,用numpy的主要目的在于应用矢量化运算.Numpy并没有多么高级的数据分析功能,理解Numpy ...

  4. 凉亭瓦片计算方式_凉亭简介

    凉亭瓦片计算方式 There are many tools and libraries available today that makes our development task easier. ...

  5. 【基础版】大学计算机-计算思维导论

    超星尔雅[基础版]大学计算机-计算思维导论章节测验答案,下面就是按照章节顺序的题目 计算机.计算与计算思维 1[单选题]人类应具备的三大思维能力是指_____.答案:实验思维.理论思维和计算思维 A. ...

  6. 如何高效设计游戏——关于战斗力计算方式的总结

    该文章来自用户转载  点击阅读原文 前言 有关于角色的战斗力,大家都不会陌生,几乎每一款游戏都有在计算相关角色的战斗力. 无论采用何种形式.方法,目的只有一个,就是想让玩家比较轻松直接的对比出角色的综 ...

  7. ECC有限域椭圆曲线加密算法实例---构建椭圆曲线的循环群,利用椭圆曲线离散对数问题实现信息的加密解密,签名和验证

    一个简单的实例:A向B发送信息的加解密,签名和验证 通过有限域椭圆曲线构建一个循环群,利用椭圆曲线的离散对数问题实现对信息加解密,原理和实现参考链接:有限域上的椭圆曲线加密|附加解密cpp代码_哔哩哔 ...

  8. 【Azure】微软 Azure 基础解析(六)计算服务中的虚拟机 VM、虚拟机规模集、Azure Functions 与 Azure 容器(ACI)

    本系列博文还在更新中,收录在专栏:「Azure探秘:构建云计算世界」 专栏中. 本系列文章列表如下: [Azure]微软 Azure 基础解析(三)描述云计算运营中的 CapEx 与 OpEx,如何区 ...

  9. 3种场景下的相关性计算方式,热力图优化展示

    导语:相关系数衡量的是两个变量同时变化的程度和方向,比如身高和体重,体重一般随着身高增加而增加,在很多情况下,我们处理的对象都是连续变量与连续变量之间的关系,但是还有离散变量与离散变量,连续变量与离散 ...

最新文章

  1. python网络爬虫开发从入门到精通pdf-Python 3网络爬虫开发实战PDF高清完整版下载...
  2. 0909初学编译原理
  3. boost::stable_sort相关的测试程序
  4. 二十四种设计模式:访问者模式(Visitor Pattern)
  5. jquery hover事件中 fadeIn和fadeOut 效果不能及时停止
  6. 好色之旅-画图三字经
  7. 020-python函数和常用模块-文件操作
  8. 【预测模型】基于蝙蝠算法优化最小二乘支持向量机lssvm实现数据预测matlab代码
  9. JS 字符串去除首尾空格
  10. Zotero | zotero与endnote题录与pdf文件的完整互转(2)
  11. 【教程】最新微信视频号视频批量下载保存方法,非常简单的方法
  12. html 防网页假死,html5 Web开发:防止浏览器假死的方法
  13. python[爬虫]爬取百万条新浪新闻 新浪滚动新闻中心(多进程)
  14. python发朋友圈突破朋友圈限制_用Python发一个高逼格的朋友圈
  15. 比较几种步进电机加减速控制方案
  16. DB DBS和DBMS的区别
  17. Android日历移植小结
  18. post请求改成body_Post 方法参数写在body中和写在url中有什么区别?
  19. 烟台大学—贺利坚的计算机课程教学链接
  20. 易模3D建模教程| 20min教会你人像3D建模

热门文章

  1. 如何挑选靠谱的小程序商城免费模板?
  2. C语言中p, *p, p, *p, **p的理解-初级
  3. 瓦伦达心态——再谈工作中的专注和心态
  4. 后缀为.epub的是什么格式的文件
  5. Python安装教程和Pycham教程
  6. java方法 判断今天是工作日/周末/节假日
  7. LiveQing私有云端流媒体-拉转直播功能
  8. 低成本快速开发 LoRa 终端:从 1 到 10000
  9. 基于AT91SAM9G20构建嵌入式Linux系统
  10. 信用卡降额冻结封卡,如何摆脱银行风控?