椭圆曲线加密算法及实例分析
- 格式:pdf
- 大小:108.14 KB
- 文档页数:3
密码学椭圆曲线的嵌入例题密码学中,椭圆曲线是一种常用的加密算法,它基于椭圆曲线上的离散对数问题,具有高度安全性和效率。
下面是一个关于椭圆曲线的嵌入例题,从多个角度进行全面的回答。
例题,假设我们有一个椭圆曲线E,其方程为y^2 = x^3 + ax + b,其中a和b是曲线的参数。
现给定曲线E的参数为a = 2,b = 3,求曲线E的所有点。
回答:从代数的角度来看,我们可以通过将参数a和b代入椭圆曲线方程来求解曲线E的所有点。
将a = 2,b = 3代入方程y^2 = x^3 + ax + b,得到y^2 = x^3 + 2x + 3。
然后我们可以使用数值计算的方法,例如穷举法或者使用计算机程序,来找到满足该方程的所有整数点或有理数点。
通过计算,我们可以找到曲线E的所有点。
从几何的角度来看,椭圆曲线是一个平面上的曲线,其点的集合形成了一个封闭的曲线。
曲线E的所有点包括无穷远处的一个特殊点O,以及其他有限个点。
这些点具有特定的几何性质,例如曲线上的两个点可以通过曲线的斜率来连接,得到曲线上的另一个点。
通过使用这些几何性质,我们可以逐步确定曲线E的所有点。
从密码学的角度来看,椭圆曲线的嵌入是指将曲线E定义在一个有限域上,以便在密码学中应用。
常用的有限域是有限素数域GF(p),其中p是一个素数。
在密码学中,曲线E的参数a和b以及有限域的素数p被选取为保密的参数,以确保曲线的安全性。
通过在有限域上定义椭圆曲线,我们可以进行各种密码学操作,例如点的加法、倍乘等,从而实现加密和签名等功能。
从计算机科学的角度来看,椭圆曲线的嵌入是指将曲线E的参数和点的坐标表示为计算机可以处理的格式。
通常,我们使用有限域上的二进制表示来表示椭圆曲线的参数和点的坐标。
例如,可以使用二进制位串来表示参数a和b,以及点的坐标x和y。
在计算机中,我们可以使用特定的算法和数据结构来实现椭圆曲线的各种操作,例如点的加法、倍乘等。
这样,我们可以在计算机系统中高效地进行椭圆曲线的计算和应用。
椭圆曲线密码学算法原理与实现椭圆曲线密码学算法是当前计算机安全领域中广泛使用的一种加密算法。
与传统的RSA算法相比,椭圆曲线密码学算法具有较高的安全性和更短的密钥长度,同时也更加适用于小型设备和无线通信领域。
本文将对椭圆曲线密码学算法的原理、优势以及实现进行介绍。
一、椭圆曲线密码学算法原理椭圆曲线密码学算法是基于椭圆曲线运算的一种加密算法。
在椭圆曲线上,可以定义加法和乘法等运算操作,从而构建出密钥系统。
具体来讲,椭圆曲线密码学算法使用的是离散对数问题,即找到一个整数k,使得G=kP,其中G和P是椭圆曲线上的点,k是密钥。
在使用椭圆曲线密码学算法时,有两个关键要素,分别是公钥和私钥。
公钥是任何人都可以获得的,而私钥只有信息发送者才能获得。
当信息发送者需要发送加密信息时,会使用接收者的公钥对信息进行加密,接收者收到信息后再使用自己的私钥进行解密。
这种方法可以保证信息在传输过程中不被他人窃取。
二、椭圆曲线密码学算法的优势椭圆曲线密码学算法相对于传统的RSA算法,有以下的优势:1. 更高的安全性。
使用椭圆曲线密码学算法时,需要使用的密钥长度较短,但是却具有比较高的安全性。
这是因为椭圆曲线操作比传统的大数因子分解更难以破解。
2. 适用于小型设备和无线通信领域。
使用传统的RSA算法时,需要较长的密钥,这在小型设备和无线通信领域会造成很大的问题。
而椭圆曲线密码学算法可以使用更短的密钥长度,可以在小尺寸的设备上使用,如智能卡和移动设备等。
3. 更高的运算速度。
相比传统的RSA算法,使用椭圆曲线密码学算法进行加密和解密的运算速度更快,可以更加高效地完成加密解密操作。
三、椭圆曲线密码学算法的实现椭圆曲线密码学算法的实现涉及到一系列的数学运算,包括椭圆曲线上的点的加法、乘法、求逆以及扩域操作等。
下面简单介绍一下椭圆曲线密码学算法的实现过程。
1. 密钥的生成。
在使用椭圆曲线密码学算法时,需要生成一对公钥和私钥。
生成公钥时,需要选择一个椭圆曲线和基点,然后随机选取一个整数作为私钥。
椭圆曲线加密算法的研究与实现椭圆曲线加密算法是目前应用最广泛的公钥加密算法,具有难以破解、高效快速、安全稳定等特点,是构建安全的密钥交换协议和数据传输机制的基础,目前在军事、政府、金融、电信等领域应用越来越广泛,因此,研究椭圆曲线加密算法具有重要的现实意义。
一、椭圆曲线加密算法的基础原理椭圆曲线加密算法是建立在参数检验上的一种数论函数的安全加密算法。
它的基本思想是,在一个高维空间,首先选定一条椭圆曲线,然后根据其参数定义一个数位函数,最后用这个函数来进行加密解密。
其参数包括椭圆曲线上的整数点、椭圆曲线的参数、离散对数求解器、变换矩阵、模量等。
椭圆曲线加密算法通过对椭圆曲线参数的不同构造出不同的密钥,每次传输都可以构造出不同的加密算法,保证了每次传输的安全性。
二、椭圆曲线加密算法的研究及实现(一)研究1.椭圆曲线原理的研究:研究椭圆曲线的定义,研究椭圆曲线参数的等价定义,研究椭圆曲线参数对密钥安全性的影响;2.椭圆曲线算法实现的研究:研究加密算法的矩阵变换过程,研究其实现中的算法、数据结构;3.椭圆曲线算法安全性的研究:研究不同的攻击策略,探究破解椭圆曲线加密算法的方法;4.椭圆曲线密钥的优化研究:探究优化椭圆曲线密钥的有效方法;(二)实现1.建加密编码结构:建立椭圆曲线参数的数据结构;2.写加密解密程序代码:编写算法实现加密解密程序,代码实现矩阵变换;3.试椭圆曲线加密算法:测试算法对密钥安全性、加密效率、传输安全性等的效果,并对结果做出评估;4.椭圆曲线加密算法进行优化:对椭圆曲线的参数进行分析,通过优化参数提高椭圆曲线算法的安全性。
三、结论椭圆曲线加密算法是目前应用最为广泛的公钥加密算法,对于建立安全的密钥交换协议和数据传输机制具有重要的现实意义。
研究者应该深入研究椭圆曲线加密算法的原理、实现、安全性和优化,为椭圆曲线加密算法的应用提供保障和支持。
椭圆曲线加密算法例题椭圆曲线加密算法(Elliptic Curve Cryptography,简称ECC)是一种基于椭圆曲线数学的公钥加密算法。
下面是一个简单的椭圆曲线加密算法的例题:假设Alice和Bob想要使用椭圆曲线加密算法进行通信。
他们首先选择一个合适的椭圆曲线参数,包括一个椭圆曲线方程和一个基点G。
1. 密钥生成:Alice选择一个随机数a作为她的私钥,并计算出她的公钥A=aG。
Bob选择一个随机数b作为他的私钥,并计算出他的公钥B=bG。
2. 加密过程:Alice想要发送一条消息M给Bob,她首先选择一个随机数k,并计算出点C1=kG和C2=M+kA,其中kA表示点A乘以k。
Alice将C1和C2一起发送给Bob。
3. 解密过程:Bob收到C1和C2后,使用他的私钥b计算出点C'=C2-bC1。
由于椭圆曲线上的点的加法运算具有群的性质,因此C'就等于M+kA-bkA=M+(k-bk)A。
由于A=aG,所以C'就等于M+(k-bk)aG。
由于k和b都是随机数,所以k-bk也是一个随机数,记为k'。
因此,C'就等于M+k'aG。
Bob再计算出M'=C'-k'A。
由于A=aG,所以M'就等于M+k'aG-k'aG=M。
因此,Bob成功解密出了Alice发送的消息M。
以上是一个简单的椭圆曲线加密算法的例题。
在实际应用中,椭圆曲线加密算法还需要考虑更多的安全性和效率问题,例如选择合适的椭圆曲线参数、防止重放攻击等。
此外,还需要使用合适的密码学哈希函数和随机数生成器等技术来保证算法的安全性。
ecc椭圆曲线加密算法原理宝子们!今天咱们来唠唠一个超酷的加密算法——ECC椭圆曲线加密算法。
这玩意儿听起来就很神秘,对不对?咱先从基础概念说起哈。
椭圆曲线呢,可不是咱平常看到的椭圆哦。
在数学的奇妙世界里,它是由一个方程定义的曲线。
这个方程大概是这个样子的:y² = x³ + ax + b(这里的a和b是一些常数啦)。
不过呢,这个曲线不是随便画在平面上就行的,还有一些特殊的规则。
比如说,这个曲线得是光滑的,不能有尖尖的角或者奇怪的断点。
那这个椭圆曲线和加密有啥关系呢?这就很有趣啦。
想象一下,在这个椭圆曲线上有好多好多的点。
这些点就像是一个个小秘密的藏身之处。
我们在这个曲线上定义一种特殊的运算,叫做“点加”运算。
这个“点加”可不是简单的把两个点加起来哦。
它有一套自己独特的计算方法。
比如说,我们有两个点P和Q在椭圆曲线上。
要计算P + Q呢,我们得先画一条直线穿过P和Q(如果P和Q是同一个点的话,那这条直线就是曲线在这个点的切线哦,是不是很神奇?)。
这条直线会和椭圆曲线相交于另一个点,我们把这个点叫做R'。
然后呢,我们把R'关于x轴对称的点就是P + Q啦。
这个运算规则虽然有点复杂,但是很有规律呢。
好啦,现在我们来看看怎么用这个椭圆曲线来加密。
我们有一个发送者,比如说小明,和一个接收者,比如说小红。
首先呢,小红要在椭圆曲线上选一个秘密的点,这个点就像是她的小钥匙,只有她自己知道。
然后呢,她把椭圆曲线的一些公开信息,比如曲线的方程、一个公开的基点(这个基点就是曲线上一个大家都知道的点啦)发给小明。
小明要发送一个消息给小红。
他把这个消息变成一个椭圆曲线上的点M(这个转换过程也有一些小技巧哦)。
然后呢,小明随便选一个整数k,这个k就像是他临时想出来的一个小密码。
他计算C1 = k * 基点(这里的*就是我们前面说的点加运算,不过是重复k次啦),C2 = M + k * 小红的秘密点。
椭圆曲线加密算法(⼀)椭圆曲线加密和签名算法简述椭圆曲线密码学,简称ECC。
是⼀种建⽴公开加密的算法,也就是⾮对称加密。
和RSA类似。
被公认在给定密钥长度下最安全的加密算法。
应⽤范围很⼴,主要的三个技术TLS、PGP、SSH都在使⽤它,特别是以BTC为代表的数字货币。
椭圆曲线椭圆曲线并不是我们⾼中时学习的椭圆形状,其名字的由来是应为椭圆曲线的描述⽅程,类似于计算⼀个椭圆周长的⽅程。
这⾥⽤来加密的椭圆曲线的定义是⼀个特殊情况。
椭圆曲线暂时可以简单的理解为:其中:a和b决定了曲线在坐标系的不同形状。
举个例⼦:当b=1,a的取值从2到-3时,曲线的形状如下:特殊曲线:当a=b=0时(左),或a=-3,b=2时(右),这两条都不是符合标准的曲线。
阿贝尔群数学上,群是指定义了⼆元操作运算并且⽤符号“+”表⽰的⼀个集合。
则必须满⾜以下要求:封闭性:如果a和b都是群成员,那么a+b也是群成员。
组合性:(a+b)+c=a+(b+c)单位元:存在确切的⼀个值可以保证 a+0=0+a=a成⽴,我们称之为单位元逆元:每个成员都有⼀个相反数:对于任意值a必定存在b使得a+b=0这样的群我们称之为阿贝尔群。
另外阿贝尔群还应该满⾜交换律a+b=b+a我们所熟知的在整数范围内的加法运算(Z,+)就是阿贝尔群封闭性:a、b属于整数,a+b也属于整数组合性:(a+b)+c=a+(b+c)单位元:0值就是单位元逆元:a的逆元就是-a所以(Z,+)是⼀个阿贝尔群。
椭圆曲线的加法假设我们有这样⼀条椭圆曲线y2=x3-x,曲线上有两点P、Q,过P和Q做⼀条直线,交椭圆曲线于R'点,再过R'点做垂直于X轴的直线,交椭圆曲线于另⼀点R,我们定义P+Q=R。
当P=Q时候,则是过P点的切线交于椭圆曲线于R',此时R=2P,如图所⽰:当有k个相同的点P相加时,记做kP,如:P+P+P=2P+P=3P,如图:椭圆曲线密码利⽤上述“运算”中的“椭圆曲线上的离散多数问题”,就像RSA利⽤“⼤数质因数分解”⼀样。
椭圆曲线密码算法原理及其应用密码学是保障个人信息安全的重要领域,而椭圆曲线密码算法作为一种新的密码算法,在这方面扮演着越来越重要的角色。
本文将介绍椭圆曲线密码算法的基本原理、优势以及应用。
一、基本原理椭圆曲线密码算法是一种基于椭圆曲线数学理论而产生的密码算法,其基础理论是椭圆曲线离散对数问题。
所谓离散对数问题是指对于一个有限域$GF(q)$上的椭圆曲线$E$和其中的一个点$P$,在椭圆曲线上选择另一个点$Q$,求解在有限域$GF(q)$上,使得$Q=nP$的$n$的过程。
而这个过程是不可逆的,即求解$Q$到$P$的离散对数是困难的,因此椭圆曲线密码算法因此而诞生。
椭圆曲线密码算法可以参照传统公钥密码算法的框架设计,即包含公钥和私钥两部分。
一个椭圆曲线密码体制要求选择一个椭圆曲线$E$,再分别选择两个$E$上的点$P$和$Q$,称为基点和公钥点。
基点$P$作为私钥的一部分,而公钥点$Q$仅作为公钥的一部分,即:- 公钥:$(E,P,Q)$- 私钥:$P$发送者想对一条长为$m$的消息进行加密,首先选择一个小于$q$的整数$k$作为随机数,使得$P$乘以$k$所得到的点$K=kP$不能在椭圆曲线上表达为$Q$的$n$倍。
在此基础上,发送者计算:- 加密的密文:$c=(K,m+kn)$接收者收到密文$c$后,使用私钥$P$计算:- 解密后的明文:$m=\frac{c_2-k \cdot H(c_1)}{k}$其中$H(c_1)$是消息$c_1$的哈希值。
二、优势椭圆曲线密码算法相较于传统公钥密码算法,有以下优势:1. 可以使用短密钥长度其安全性和传统公钥密码算法一样好,但是它的密钥长度可以比传统的RSA或Diffie-Hellman密钥长度更短,API级别的椭圆曲线密码算法只需要32个字节密钥长度,远远低于传统算法的384位以上。
2. 速度较快相对于RSA或者Diffie-Hellman,椭圆曲线密码算法是一种更快速的密码算法,因为它不需要执行复杂且昂贵的模操作,而是直接在椭圆曲线上进行数学运算。
椭圆曲线加密算法的研究与实现椭圆曲线加密算法(Elliptic Curve Cryptography,简称ECC)是一种基于椭圆曲线数学原理的公钥加密算法,它可以在保证安全性的同时,大幅度缩短密钥长度,提高加密效率,并且具有抗量子计算攻击的特性,因此备受关注和应用。
本文就该算法的基本原理、优缺点和实现方案做一简单介绍。
一、基本原理。
椭圆曲线加密算法的基本原理是基于椭圆曲线离散对数问题(Elliptic Curve Discrete Logarithm Problem,简称ECDLP),其与RSA算法中大质数分解问题(Integer Factorization Problem,简称IFP)的关系类似。
椭圆曲线离散对数问题需要在椭圆曲线上求解离散对数,即找到一个整数k,使得Gk等于给定的点P,其中G是椭圆曲线上的一个基点,P是已知椭圆曲线上的一个点。
这个问题的复杂度是指用多少时间、空间和计算量解决问题,其中最常见的指数算法是Pollard Rho算法,时间复杂度是O(√n)。
二、优缺点。
与传统的RSA算法相比,椭圆曲线加密算法具有以下几个优点:1.密钥长度短。
公有参数长度可以设为160、192、224或256比特,相对于1024、2048比特的RSA密钥而言,密钥长度少了很多,这使ECC更适合于使用小型移动设备进行的加密通信。
2.运行速度快。
ECC加密和解密速度很快,通常可以达到RSA算法的2-4倍,可以在保障安全的前提下提高性能。
3.抵抗量子计算攻击。
在类经典计算机上很难攻击ECC,而椭圆加密是量子攻击下不易破解的加密算法之一。
三、实现方案。
ECC加密算法的实现主要涉及以下几个方面:1.选取椭圆曲线。
根据椭圆曲线参数的选择,设定基点、模数、参数a和b,还需考虑椭圆曲线的性质和安全性。
2.生成密钥对。
通过选取椭圆曲线上的随机整数k,生成一对密钥,其中一个私钥为k,公钥是基点G的k倍,即P=kG。
私钥必须妥善保管,公钥可公开。
椭圆曲线密码算法的设计与分析椭圆曲线密码算法(Elliptic Curve Cryptography, ECC)是一种基于椭圆曲线数学问题的公钥密码体制。
相比传统的RSA和DSA等公钥密码体制,ECC具有更短的密钥长度和更高的安全性,因此在现代密码学中被广泛应用。
本文将从椭圆曲线密码算法的基本原理、设计思想、应用领域以及安全性等方面进行分析和讨论。
一、基本原理1. 椭圆曲线椭圆曲线是由一组满足特定数学方程的点构成的曲线,其数学方程一般形式为:y^2 = x^3 + ax + b。
椭圆曲线上的点可以进行加法和乘法运算,构成一个代数结构。
椭圆曲线的加法运算有闭合性、交换律、结合律等性质,使得其成为构建密码体制的基础。
2. 椭圆曲线上的离散对数问题椭圆曲线上的离散对数问题(Elliptic Curve Discrete Logarithm Problem, ECDLP)是指找到满足P = kG的整数k,其中P和G分别为椭圆曲线上的点。
ECDLP是一种困难问题,即使在现代计算机条件下,也需要消耗大量的计算资源才能解决。
二、设计思想1. 基于硬问题的安全性与RSA和DSA等公钥密码体制不同,椭圆曲线密码算法是基于椭圆曲线上的离散对数问题的困难性而安全的。
目前来看,对于给定的椭圆曲线参数,没有已知的高效算法可以有效解决ECDLP问题。
因此,ECC可以提供较高的安全性,同时使用更短的密钥长度,减少了计算、存储和传输的开销。
2. 允许更短的密钥长度相比传统的RSA和DSA等公钥密码体制,ECC可以使用更短的密钥长度来达到相同的安全性。
例如,一个256位的椭圆曲线密钥可以提供与一个2048位RSA密钥相当的安全性。
这使得ECC在资源受限的环境下更加实用。
3. 高效的加密和解密运算椭圆曲线上的加法和乘法运算可以通过一些高效的算法来进行,使得密钥生成、加密和解密等运算更快速和高效。
这对于移动设备和无线网络等资源受限的环境来说,具有重要意义。
ECC椭圆曲线加密算法—加解密(SageMath实现)简介ECC椭圆曲线加密,它的安全性基于椭圆曲线上的离散对数问题。
⽐特币和⽬前的⼆代居民⾝份证都采⽤了ECC作为加密算法。
ECC椭圆曲线函数为:y2=x3+ax+b (mod p)ECC算法如下:椭圆曲线Ep(a,b)(p为模数),基点(⽣成元)G(x,y),G点的阶数n,私钥k,公钥K(x,y),随机整数r,明⽂为⼀点m(x,y),密⽂为两点c1(x,y)和c2(x,y)(其中基点G,明⽂m,密⽂c1、c2都是椭圆曲线E上的点)选择私钥k(k<n)得到公钥K = k*G选择随机整数r(r<n)加密:c1 = m+r*Kc2 = r*G解密:m = c1-k*c2(= c1-r*K)SageMath可以直接计算椭圆曲线加法和椭圆曲线乘法。
椭圆曲线运算(SageMath):点u(x,y),整数a,点v(x,y),点w(x,y)a_inv = inverse_mod(a,p) #a_inv是a关于模p的乘法逆元a_invv = a*uu = v*a_invw = u+v加解密脚本SageMath加密脚本:'''加密椭圆曲线选取时,模数p应是⼀个⼤质数常⽤的有⼏个公开的椭圆曲线,如Secp256k1、Secp256r1等'''p = 115792089210356248762697446949407573530086143415290314195533631308867097853951a = 115792089210356248762697446949407573530086143415290314195533631308867097853948b = 41058363725152142129326129780047268409114441015993725554835256314039467401291E = EllipticCurve(GF(p),[a,b]) #建⽴椭圆曲线EG = E(101981543389703054444906888236965100227902100585263327233246492901054535785571,105947302391877180514060433855403037184838385483621546199124860815209826713886) #选择⼀点作为⽣成元n = G.order() #G的阶数k = 78772200542717449282831156601030024198219944170436309154595818823706214492400K = k*Gr = 3546765m = E(80764032034929976879602863302323059647882062252124869895215418422992624743795,4964654783828069942602279691168356721024126126864424301508238062949726916347) #取E上⼀点m作为明⽂c1 = m+r*Kc2 = r*Gprint(c1)print(c2)SageMath解密脚本:'''解密'''p = 115792089210356248762697446949407573530086143415290314195533631308867097853951a = 115792089210356248762697446949407573530086143415290314195533631308867097853948b = 41058363725152142129326129780047268409114441015993725554835256314039467401291k = 78772200542717449282831156601030024198219944170436309154595818823706214492400E = EllipticCurve(GF(p),[a,b]) #建⽴椭圆曲线Ec1 = E(55527726590533087179712343802771216661752045890626636388680526348340802301667,99976146729305231192119179111453136971828647307627310904093286590128902629941)c2 = E(85460365972589567444123006081329559170090723413178386022601904195400422637884,58249081362527056631776731740177334121295518073095154119886890634279528757192)m = c1-k*c2print(m)其他使⽤Crypto.PublicKey.ECC⽣成ECC密钥:from Crypto.PublicKey import ECC#⽣成ECC密钥key = ECC.generate(curve='NIST P-256') #使⽤椭圆曲线NIST P-256#输出密钥(包括私钥k,基点G)print(key)#公钥(point_x,point_y是基点G的坐标)print(key.public_key())#椭圆曲线print(key.curve)#私钥kprint(key.d)#导出为pem密钥⽂件print(key.export_key(format='PEM'))#导⼊密钥⽂件key = ECC.import_key(f.read())通过fastecdsa.Curve可以查到公开椭圆曲线的参数import fastecdsa.curve as curve#P-384的acurve.P384.a#P-384的bcurve.P384.bProcessing math: 100%#P-384的pcurve.P384.p⼏种公开椭圆曲线参数:#NIST P-256(Secp256r1)#p = 2^224(2^32 − 1) + 2^192 + 2^96 − 1p = 115792089210356248762697446949407573530086143415290314195533631308867097853951a = 115792089210356248762697446949407573530086143415290314195533631308867097853948b = 41058363725152142129326129780047268409114441015993725554835256314039467401291#Secp256k1(⽐特币使⽤)#p = 2^256 − 2^32 − 2^9 − 2^8 − 2^7 − 2^6 − 2^4 − 1 = 2^256 – 2^32 – 977p = 115792089237316195423570985008687907853269984665640564039457584007908834671663a = 0b = 7#NIST P-384#p = 2^384 – 2^128 – 2^96 + 2^32 – 1p = 39402006196394479212279040100143613805079739270465446667948293404245721771496870329047266088258938001861606973112319a = -3b = 27580193559959705877849011840389048093056905856361568521428707301988689241309860865136260764883745107765439761230575#NIST P-521p = 6864797660130609714981900799081393217269435300143305409394463459185543183397656052122559640661454554977296311391480858037121987999716643812574028291115057151a = -3b = 1093849038073734274511112390766805569936207598951683748994586394495953116150735016013708737573759623248592132296706313309438452531591012912142327488478985984 SageMath取椭圆曲线上随机⼀点:E = EllipticCurve(GF(p),[a,b])E.random_point() #取椭圆曲线E上随机⼀点sagemath计算椭圆曲线上的离散对数问题(数据量不能太⼤)a = 1234577b = 3213242p = 7654319E = EllipticCurve(GF(p),[a,b])G = E(5234568, 2287747) #⽣成元#k = 1584718K = E(2366653, 1424308) #公钥#求解私钥,⾃动选择bsgs或Pohlig Hellman算法discrete_log(K,G,operation='+')#求解私钥,Pollard rho算法discrete_log_rho(K,G,operation='+')#求解私钥,Pollard Lambda算法,能够确定所求值在某⼀⼩范围时效率较⾼discrete_log_lambda(K,G,(1500000,2000000),operation='+')使⽤openssl查看ECC的pem密钥⽂件信息#查看ECC私钥信息openssl ec -in p384-key.pem -text -noout#查看ECC公钥信息openssl ec -pubin -in public.pem -text -noout。
椭圆曲线技术工作原理解析
大多数加密资产使用与比特币完全相同的椭圆曲线,称为secp256k1 。
这使得重新使用比特币的许多椭圆曲线库和工具成为可能。
椭圆曲线密码学(英语:Elliptic Curve Cryptography,缩写为ECC)是一种基于椭圆曲线数学的公开密钥加密算法。
下图示例大多数加密资产使用与比特币完全相同的椭圆曲线,称为secp256k1 。
这使得重新使用比特币的许多椭圆曲线库和工具成为可能。
椭圆曲线技术用于创建由私钥派生出来的公钥。
椭圆曲线技术工作原理
以一个随机生成的数字_k_的私钥开始,我们通过将它乘以称为_generator point_ G_的曲线上的预定点,在曲线上的其他位置产生另一个点,这是相应的公钥_K。
生成点被指定为+secp256k1+标准的一部分,对于+secp256k1+的所有实现始终相同,并且从该曲线派生的所有密钥都使用相同的点_G_:
K = k * G
k 是私钥
G 是预定点
K 是生成的公钥,曲线上的某一点
由于所有比特币用户曲线上的预定点总是相同的,私钥k乘以G将得到的公钥K始终相同.k和K之间的关系是固定的,但这种情况只存在于单向运算,即只能从k到K。
这就是比特币地址(从K派生)可以与任何人共享并且不会泄露用户的私钥(k)的原因。
为了将一个点与整数相乘可视化,我们将使用比实数更简单的椭圆曲线来描述,旨在找到曲线上的预定点G的多个kG。
这个运算逻辑与将G自身连续相加k次相同。
在椭圆曲线中,向自身添加一个点相当于在点上绘制切线并再次找到它与曲线相交的位置,然后在x轴上反映该点。
椭圆曲线密码椭圆曲线取y^2=x^3+4x+20 mod 29因为素数p=29比较小,可以穷举计算出来它有37个解点,(0,7),(0,22),(1,5),(1,24),(2,6),(2,23),(3,1),(3,28),(4,19),(4,10),(5,7),(5,22),(6,12),(6,17),(8,10),(8,19),(10,4),(10,25),(13,23),(13,6), (14,6),(14,23),(15,2),(15,27),(16,2),(16,27),(17,10),(17,19), (19,16),(19,13),(20,3),(20,26), (24,7), (24,22), (27,2), (27,27),I=(Infinity,Infinity)现在ECC加密。
公开描述参数T=(p=29,a=4,b=20,G=(13,23),n=37,h=1)。
这里取的是G=(13,23)做循环群E的生成元,E为37阶群,由上面37个解点组成。
p和n比较小,可以穷举计算出来G的1-n次方,也就是循环群E的元素:G = (13, 23), 2G = (27, 27), 3 G = (24, 7), 4 G = (20, 3),5G = (16, 27), 6 G = (5, 7), 7 G = (15, 2), 8 G = (17, 19),9G = (0, 22), 10 G = (10, 4), 11 G = (1, 24), 12 G = (14, 23),13 G = (2, 6), 14 G = (8, 19), 15 G = (4, 19), 16 G = (19, 13),17 G = (3, 28), 18 G = (6, 17), 19 G = (6, 12), 20 G = (3, 1),21G = (19, 16), 22 G = (4, 10), 23 G = (8, 10), 24 G = (2, 23),25G = (14, 6), 26 G = (1, 5), 27G = (10, 25), 28 G = (0, 7),29G = (17, 10), 30 G = (15, 27), 31 G = (5, 22), 32 G = (16, 2),33G = (20, 26), 34 G = (24, 22), 35 G = (27, 2), 36 G = (13, 6),37 G = I现在开始加密。
椭圆曲线加密算法代码及解析在椭圆曲线加密中,利用了某种特殊形式的椭圆曲线,即定义在有限域上的椭圆曲线。
其方程如下:y2=x3+ax+b(mod p)这里p是素数,a和b为两个小于p的非负整数,它们满足:4a3+27b2(mod p)≠0 其中,x,y,a,b ∈Fp,则满足式(2)的点(x,y)和一个无穷点O就组成了椭圆曲线E。
椭圆曲线离散对数问题ECDLP定义如下:给定素数p和椭圆曲线E,对 Q=kP,在已知P,Q的情况下求出小于p的正整数k。
现在我们描述一个利用椭圆曲线进行加密通信的过程:1、用户A选定一条椭圆曲线Ep(a,b),并取椭圆曲线上一点,作为基点G。
2、用户A选择一个私有密钥k,并生成公开密钥K=kG。
3、用户A将Ep(a,b)和点K,G传给用户B。
4、用户B接到信息后,将待传输的明文编码到Ep(a,b)上一点M(将M转化为十进制整数m,然后令椭圆曲线中点的横坐标为m,根据曲线方程计算出纵坐标,便得到了一个点。
),并产生一个随机整数r(r<n)。
5、用户B计算点C1=M+rK;C2=rG。
6、用户B将C1、C2传给用户A。
7、用户A接到信息后,计算C1-kC2,结果就是点M。
因为C1-kC2=M+rK-k(rG)=M+rK-r(kG)=M再对点M进行解码就可以得到明文。
过程分析:1、将给出的椭圆上的两点G,K相加求得第三点M。
P跟Q有两种情况。
分P=Q 和P不等于Q时。
2、求M的过程中进行求模运算。
第一,将分数利用最小公倍数求模。
第二,负数求模,先将负号拿出来,求完再将负号加上。
根据公式将λ解出。
3、将X3Y3求出。
循环算出nG,求出C1C2(密文)。
C1=rG,C2=M+rK。
M为明文,公开密钥K=kG代码部分:#include <iostream>using namespace std;//求两数的最小公倍数int f1(int a, int b){int c=a;while( c%a!=0 || c%b!=0)c++;return c;}//求modint mod (int a, int b){int c;if(a>0)c=a%b;else{while(a<b)a=a+b;c=a%b;}return c;}//求λint f2(int x1,int y1,int x2,int y2,int a,int p) {int b,b1,b2,q;//b1为分子,b2为分母if( x1==x2 && y1==y2)//如果λ两点相等{b1=3*x1*x1+a;b2=2*y1;if(b1<0)b1=-mod(-b1,p);elseb1=mod(b1,p);if(b2<0){b2=mod(-b2,p);q=-f1(b2,p+1)/b2;}else{b2=mod(b2,p);q=f1(b2,p+1)/b2;}b2=f1(b2,p+1)/b2;b=b1*b2;b=mod(b,p);}else{b1=y2-y1;b2=x2-x1;if(b1<0)b1=-mod(-b1,p);elseb1=mod(b1,p);if(b2<0){b2=mod(-b2,p);q=-f1(b2,p+1)/b2;}else{b2=mod(b2,p);q=f1(b2,p+1)/b2;}b=b1*q;b=mod(b,p);}return b;}//求两点横坐标的和int sumx(int x1,int y1,int x2,int y2,int k,int a,int p){int x3,y3,i;if(k==1){x3=(f2(x1,y1,x2,y2,a,p))*(f2(x1,y1,x2,y2,a,p))-x1-x2;x3=mod(x3,p);}else{for(i=1;i<=k-1;i++){x3=(f2(x1,y1,x2,y2,a,p))*(f2(x1,y1,x2,y2,a,p))-x1-x2;x3=mod(x3,p);y3=(f2(x1,y1,x2,y2,a,p)*(x1-x3))-y1;y3=mod(y3,p);x2=x1;x1=x3;y2=y1;y1=y3;}}return x3;}//求两点纵坐标的和int sumy(int x1,int y1,int x2,int y2,int k,int a,int p){int x3,y3,i,u=x1,v=y1,m=x2,n=y2;if(k==1){x3=f2(u,v,m,n,a,p)*f2(u,v,m,n,a,p)-u-m;x3=mod(x3,p);y3=f2(u,v,m,n,a,p)*(u-x3)-v;y3=mod(y3,p);}else{for(i=1;i<=k-1;i++){x3=f2(u,v,m,n,a,p)*f2(u,v,m,n,a,p)-u-m;x3=mod(x3,p);y3=f2(u,v,m,n,a,p)*(u-x3)-v;y3=mod(y3,p);m=x1;u=x3;n=y1;v=y3;}}return y3;}//加密过程void encry(int x1,int y1,int x2,int y2,int k, int a, int p,int r) {int c1x,c1y,bx,by,bx1,by1,mbx,mby;c1x=sumx(x1,y1,x1,y1,r,a,p);c1y=sumy(x1,y1,x1,y1,r,a,p);bx1=sumx(x1,y1,x1,y1,k,a,p);by1=sumy(x1,y1,x1,y1,k,a,p);bx=sumx(sumx(x1,y1,x1,y1,k,a,p),sumy(x1,y1,x1,y1,k,a,p),sumx(x1,y 1,x1,y1,k,a,p),sumy(x1,y1,x1,y1,k,a,p),r,a,p);by=sumy(sumx(x1,y1,x1,y1,k,a,p),sumy(x1,y1,x1,y1,k,a,p),sumx(x1,y 1,x1,y1,k,a,p),sumy(x1,y1,x1,y1,k,a,p),r,a,p);mbx=sumx(x2,y2,bx,by,1,a,p);mby=sumy(x2,y2,bx,by,1,a,p);cout<<"(C1,C2)="<<"(("<<c1x<<","<<c1y<<"),("<<mbx<<","<<mby<<"))" ;}void main(){cout<<"令曲线方程格式为y^2=x^3+ax+b"<<endl;int a,b,c,d,m,n,x,y,r;cout<<"请输入a的值:";cin>>a;cout<<"请输入b的值:";cin>>b;cout<<"请给定一个素数P:";cin>>c;cout<<"请给定一个秘密正数k:";cin>>d;cout<<"令曲线上点的格式为(x1,y1):"<<endl;cout<<"请输入x1的值:";cin>>m;cout<<"请输入y1的值:";cin>>n;cout<<"令消息的格式为(x2,y2)"<<endl;cout<<"请输入x2的值:";cin>>x;cout<<"请输入y2的值:";cin>>y;cout<<"请任选一个整数r:";cin>>r;cout<<"加密消息为:";encry(m,n,x,y,d,a,c,r);cout<<endl;}程序开始运行的界面:。