本文旨在进行原理理解。
密钥交换
公钥体制的RSA, diffie-hellman和ECC 的密钥交换思想都类似。利用diffie-hellman的例子引入

X,Y是A,B各自的私钥,是各自选的某个数(或点,后面都说数),有条件限制(用大素数弄的循环群里的数,求原根求出?尚不清楚,在问)。
r是公开的一个随机数或者点(ECC中的基点)。
f(私钥,随机数)是单向陷门函数,保证生成的数如e(A),不能倒推出私钥。
A:XA=f(X, r) 图中为r^Y
B:YB=f(Y, r)
A发出XA给B,B发出YB给A
A用 X 和 YB 生成共有密钥,图中为r^XY
B用 Y 和 XA 生成共有密钥,图中为r^XY
- 其中f 不可逆推出X
- 有XA,YB推不出共享密钥(r^XY)
椭圆曲线上的运算
定义
在ECC中,用点(x, y)而不是数,为简化,使用阉割版椭圆曲线公式
举例说明,图片来源B站

由于椭圆曲线的神奇设计,使它具有一些神奇特性——“点集”循环群(有自己理解的成分)
人为规定 找点方式 并命名。
加法运算
即C=A+B,则C为AB直线在曲线上的另一个交点关于X轴对称点。
这里有很多疑惑,比如说没有交点或者有多个交点怎么办?先不管,因为曲线设计者设计牛。

乘法运算
C=2A=A+A,当A B点无线接近,过它俩的线就是切线,与曲线交点去对称就能得到C,即2A。

3A=A+2A,这里用到的便是加法运算,即A和2A两点连线交曲线点取对称。

这样的运算重复进行便能得到 NA,N是个很大的数,显然N也不会太大,因为有MOD p和曲线参数特性限制,会使点重新落回原先的点上
(类似于diffie-hellman中把数限制在大素数P生成的循环群里)
【现在回答疑惑(没有交点或者有多个交点怎么办?对称后点不在曲线上?):
由于椭圆曲线的特性,没有交点只会是两点关于x轴对称情况(看图),多个点也不会,解方程可知,“点不在曲线上”看图可知曲线关于x轴对称并且对称前点必在曲线上】
例1

当运算到15A时,15A=7A+8A,由图像可知,15A=7A
【15A+(-7)A=8A=inf 说明15A与-7A关于对称,15A与7A重合】
例2
取p=23 y^2=x^3+x+1 mod 23 G(3,10)

计算点坐标

椭圆曲线的密钥交换

- 其中PA 不可逆推出X
- 有PA,PB推不出共享密钥(XYG),因为PA*PB=XYGG(点乘点了没这个运算吧)
代码实现(对例1)
(chatgpt辅助生成)
# 定义模 p 下的椭圆曲线加法
def elliptic_add(P, Q, p, a):
# 如果p,q中有无穷远点直接返回另一个点
# 否则判断P Q是否同个点,同个点判断是否在x轴上
# 不同点判断是否关于x轴对称
if P == 'inf':
return Q
if Q == 'inf':
return P
(x1, y1), (x2, y2) = P, Q
if P == Q:
# 使用加倍公式
if y1 == 0:
return 'inf' # 切线是垂直的
s = ((3 * x1**2 + a) * pow(2 * y1, -1, p)) % p
else:
# 使用加法公式
if x1 == x2:
return 'inf' # 这应当在 P == Q 已处理时不会发生
s = ((y2 - y1) * pow(x2 - x1, -1, p)) % p
x3 = (s**2 - x1 - x2) % p
y3 = (s * (x1 - x3) - y1) % p
return (x3, y3)
# 定义参数和起始点
p = 5 # 有限域的模
a = -1 # 曲线方程的参数
b = 1 # 曲线方程的参数
A = (0, 1) # 开始的点
current_point = A
multiples = [A] # 1A 是 A
# 计算 2A 到 8A
for i in range(2, 9): # 计算 2A 到 8A
current_point = elliptic_add(current_point, A, p, a)
multiples.append(current_point)
# 打印结果
for i, point in enumerate(multiples):
print(f"{i+1}A = {point}")

注:
- 传参传无穷远点时,传'inf'
- pow(x2-x1,-1,p)即求x2-x1模p的逆元,补充数论基础如下

- python中mod运算%,次方**
本文主要参考了B站视频【【ECC加密算法】| ECC加密原理详解| 椭圆曲线加密| 密码学| 信息安全】https://www.bilibili.com/video/BV1v44y1b7Fd?vd_source=33a3d9253f3eaae8520547ba343f9930
部分图像来自该视频截图。


被折叠的 条评论
为什么被折叠?



