椭圆曲线加密算法ECC(笔记)

Python3.8

Python 是一种高级、解释型、通用的编程语言,以其简洁易读的语法而闻名,适用于广泛的应用,包括Web开发、数据分析、人工智能和自动化脚本

本文旨在进行原理理解。

密钥交换

公钥体制的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)而不是数,为简化,使用阉割版椭圆曲线公式 

y^{2}=x^{3}+ax+b (mod\, p)

举例说明,图片来源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

部分图像来自该视频截图。

您可能感兴趣的与本文相关的镜像

Python3.8

Python3.8

Conda
Python

Python 是一种高级、解释型、通用的编程语言,以其简洁易读的语法而闻名,适用于广泛的应用,包括Web开发、数据分析、人工智能和自动化脚本

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值