ECC椭圆曲线学习

ECC椭圆曲线学习

Elliptic Curve Cryptography

一、数学问题:离散对数难以求解?

给定大素数 p 、 g 、 y = g x m o d p 。 给定大素数p、g、y=g^x mod p 。\\ 给定大素数pgy=gxmodp
如果已知 x ,要求 y ,很容易计算得到,但是如果知道 y ,要求 x ,那么就很困难了。 如果已知x,要求y,很容易计算得到,但是如果知道y,要求x,那么就很困难了。\\ 如果已知x,要求y,很容易计算得到,但是如果知道y,要求x,那么就很困难了。
这里的对数不是常规的对数而是离散对数。所以逆向求解非常困难。 这里的对数不是常规的对数而是离散对数。所以逆向求解非常困难。\\ 这里的对数不是常规的对数而是离散对数。所以逆向求解非常困难。

  • p在ECC代表模数(用来取模的数)。
  • g是代表生成元(高中学习的基数,在ECC中称之为基点)。
  • 生成元是数论和抽象代数中的术语。在一个群中(他是一种特殊的代数结构,包含一个操作用来组合群的元素)中,如果存在一个元素g,其各个整数次幂可以生成群中的所有元素(包括群的单位元和其逆元),那么这个元素g就被称为该群的生成元。

例如: 假设我们有一个模 p 的乘法群, p 是一个质数,群的元素是 { 1 , 2 , 3 , . . . , p − 1 } 。在这个群中有一个元素 g , 能够使得 { g 1 , g 2 , g 3 , . . . , g p − 1 } 模 p 下能生成群中所有的元素, 我们成 g 为一个生成元。 实例: p = 5 那么乘法群为: { 1 , 2 , 3 , 4 , 5 } 例如:\\ 假设我们有一个模p的乘法群,\\p是一个质数,群的元素是\{1,2,3,...,p-1\}。在这个群中有一个元素g,\\能够使得\{g^1,g^2,g^3,...,g^{p-1}\} 模p下能生成 群中所有的元素,\\我们成g为一个生成元。\\\\\\ 实例:\\ p = 5 那么乘法群为:\{1,2,3,4,5\}\\ 例如:假设我们有一个模p的乘法群,p是一个质数,群的元素是{1,2,3,...,p1}。在这个群中有一个元素g能够使得{g1,g2,g3,...,gp1}p下能生成群中所有的元素,我们成g为一个生成元。实例:p=5那么乘法群为:{1,2,3,4,5}
生成元 g 为 2 , { 2 1 , 2 2 , 2 3 , 2 4 , 2 5 } 模 5 的结果为 { 2 , 4 , 3 , 1 , 5 } 可以看到里面所有的元素都在乘法群中,所以 g 为这个乘法群的生成元 生成元g 为 2, \{2^1,2^2,2^3,2^4,2^5\} 模 5的 结果为\{2,4,3,1,5\} \\ 可以看到里面所有的元素都在乘法群中,所以g为这个乘法群的生成元 生成元g2{21,22,23,24,25}5的结果为{2,4,3,1,5}可以看到里面所有的元素都在乘法群中,所以g为这个乘法群的生成元

二、什么是椭圆曲线?

2.1、椭圆曲线的标准方程

y 2 = x 3 + a x + b y^2 = x^3 + ax +b y2=x3+ax+b

2.2、椭圆曲线的坐标图

image-20240415125348962

import numpy as np
import matplotlib.pyplot as plt

# 设定参数
a = -1
b = 1

# 定义x范围
x = np.linspace(-2, 2, 400)

# 计算正负 y 值
y_positive = np.sqrt(x**3 + a * x + b)
y_negative = -np.sqrt(x**3 + a * x + b)

# 画图
plt.figure(figsize=(8,8))
plt.plot(x, y_positive, 'r')  # 画出正值部分
plt.plot(x, y_negative, 'r')  # 画出负值部分
plt.title('Elliptic Curve y^2 = x^3 + {}x + {}'.format(a,b))
plt.grid()
plt.show()

三、椭圆曲线密码(ECC)加解密过程

3.1、生成密钥

首先选择一个椭圆曲线、并定义其域(一般是大素数)。然后选择曲线上的一点作为基点G,私钥是选择的神秘数字d,公钥是基点乘以私钥后的点P。(既P = d*G)

例如:

(1) 选择一个椭圆曲线
椭圆曲线为 y 2 = x 3 + 0 ∗ x + 7 ( m o d 233 ) 其中 a = 0 , b = 7 , G F ( 233 ) 。 所以椭圆曲线为 y 2 = x 3 + 7 ( m o d 233 ) 椭圆曲线为y^2 = x^3+0*x+7 (mod 233)\\ 其中a=0,b=7,GF(233)。\\ 所以椭圆曲线为y^2 = x^3+7(mod 233)\\ 椭圆曲线为y2=x3+0x+7(mod233)其中a=0,b=7,GF(233)所以椭圆曲线为y2=x3+7(mod233)
(2)选择一个基点

F = GF(233)           # 定义有限域
E = EllipticCurve(F, [0, 0, 0, 0, 7]) #生成椭圆曲线
E.gens()           #计算椭圆曲线的基点

生成基点基点 G ( 9 , 81 ) 生成基点基点 G(9,81) 生成基点基点G(9,81)

(3)选择一个私钥d
选择 d = 5 为私钥。 选择 d=5 为私钥。 选择d=5为私钥。
(4)计算公钥

F = GF(233)   # 定义有限域 
E = EllipticCurve(F, [0, 0, 0, 0, 7])   #生成椭圆曲线
G = E.gens()[0]   #计算椭圆曲线的基点G
d = 5             #设置私钥d为5
P = d*G             #计算公钥P
print(P)

得到公钥 P 点为 P ( 191 , 180 ) 得到公钥P点为P(191,180) 得到公钥P点为P(191,180)

3.2、加密

对消息进行椭圆曲线加密,先将消息转为为长整型数据 M , 然后将数据 M 转为椭圆曲线上的一个点 C ,假设 C 点的坐标为 ( X c , Y c ) , 那么 C 点坐标怎么算呢,我们需要取一个随机数 k X c = k G Y c = M + k P 所以 C 点为 C ( k G , M + k P ) , 其中 G 为基点, P 为 d G 。 这个 C ( k G , M + k P ) 点就是密文。 对消息进行椭圆曲线加密,先将消息转为为长整型数据M,\\然后将数据M转为椭圆曲线上的一个点C,假设C点的坐标为(X_c,Y_c),\\ 那么C点坐标怎么算呢,我们需要取一个随机数k\\ X_c = kG \\ Y_c = M + kP\\ 所以C点为C(kG,M+kP),其中G为基点,P为dG。\\ 这个C(kG,M+kP)点就是密文。 对消息进行椭圆曲线加密,先将消息转为为长整型数据M然后将数据M转为椭圆曲线上的一个点C,假设C点的坐标为(Xc,Yc)那么C点坐标怎么算呢,我们需要取一个随机数kXc=kGYc=M+kP所以C点为C(kG,M+kP),其中G为基点,PdG这个C(kG,M+kP)点就是密文。

3.3、解密

我们需要对 C ( k G , M + k P ) 进行解密。 k P = k d G M + k P = M + d ∗ k G 由于 k G 为 C 点横坐标( k G )已知, 所以我们只需要对 C 点的横坐标( k G )乘以私钥 d ,就是 k P 然后再用 C 点的纵坐标减去 k P 就是 M 。 然后将长整型数据转为消息,就是我们的明文。 我们需要对C(kG,M+kP)进行解密。\\ kP = kdG \\ M + kP = M + d*kG\\ 由于kG 为C点横坐标(kG)已知,\\所以我们只需要对C点的横坐标(kG)乘以私钥d,就是kP\\ 然后再用C点的纵坐标减去kP就是M。\\ 然后将长整型数据转为消息,就是我们的明文。 我们需要对C(kG,M+kP)进行解密。kP=kdGM+kP=M+dkG由于kGC点横坐标(kG)已知,所以我们只需要对C点的横坐标(kG)乘以私钥d,就是kP然后再用C点的纵坐标减去kP就是M然后将长整型数据转为消息,就是我们的明文。

3.4、通过P和Q难求私钥d

我们之前讲了离散对数难以求解,对于椭圆曲线离散对数( E C D L P ) 问题也是一样困难的。离散对数( D L P )讲了 y = g x m o d p 求解 x 是非常困难的 椭圆曲线离散对数( E C D L P )在椭圆曲线 y 2 = x 3 + a x + b 上的两个点 P , G , 想要求 P = k ∗ G 中的 k 是非常困难的。求没有算法可以直接求, 然后爆破 k 的话,如果 k 比较大,爆破的时间也非常长,所以我们认为非常困难。 我们之前讲了离散对数难以求解,对于椭圆曲线离散对数(ECDLP)\\问题也是一样困难的。 离散对数(DLP)讲了y = g^x mod p 求解x是非常困难的\\ 椭圆曲线离散对数(ECDLP) 在椭圆曲线y^2 = x^3 +ax + b上的两个点P,G,\\想要求P = k*G 中的k是非常困难的。 求没有算法可以直接求,\\然后爆破k的话,如果k比较大,爆破的时间也非常长,所以我们认为非常困难。 我们之前讲了离散对数难以求解,对于椭圆曲线离散对数(ECDLP问题也是一样困难的。离散对数(DLP)讲了y=gxmodp求解x是非常困难的椭圆曲线离散对数(ECDLP)在椭圆曲线y2=x3+ax+b上的两个点PG想要求P=kG中的k是非常困难的。求没有算法可以直接求,然后爆破k的话,如果k比较大,爆破的时间也非常长,所以我们认为非常困难。

  • 26
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值