[转] ECC算法
转自:https://zhuanlan.zhihu.com/p/103665076
ECC原理介绍
首先我们来学习一下ECC(椭圆曲线加密)的原理。ECC全称为“Ellipse Curve Ctyptography”,是一种基于椭圆曲线数学的公开密钥加密算法。椭圆曲线在密码学中的使用是在1985年由Neal Koblitz和Victor Miller分别独立提出的。与传统的基于大质数分解难题的加密算法不同,该加密方式基于 “离散对数” 这种数学难题。该算法的主要优势是可以使用更小的密钥病提供相当高等级的安全。ECC164位的密钥产生一个安全级,相当于RSA 1024位密钥提供的保密强度,而且计算量较小,处理速度更快,存储空间和传输带宽占用较少。目前我国居民二代身份证正在使用 256 位的椭圆曲线密码,虚拟货币比特币也选择ECC作为加密算法。
一、数学基础
(一)椭圆曲线
椭圆曲线,一般我们用如下方程定义:
其图像一般如下:
椭圆曲线的定义也要求曲线是非奇异的(即处处可导的)。几何上来说,这意味着图像里面没有尖 点、自相交或孤立点。代数上来说,这成立当且仅当判别式:
不为0.这里主要是满足其可导性。
(二)近世代数
群
群(group)是由一种集合以及一个二元运算所组成的,并且符合“群公理”。群公理包含下述四个性质的代数结构。这四个性质是:
- 封闭性:对于所有G中a, b,运算a·b的结果也在G中。
- 结合律:对于所有G中的a, b和c,等式 `(a·b)·c = a·(b·c)`成立。
- 单位元:存在G中的一个元素e,使得对于所有G中的元素a,总有等式`e·a = a·e = a`成立。
- 对于集合中所有元素存在逆元素
特殊的群:
满足交换律的群称为交换群(阿贝尔群),不满足交换律的群称为非交换群(非阿贝尔群)。
设 (G, · )为一个群,若存在一G内的元素g,使得
则称G关于运算“ · ”形成一个循环群。
元素的阶(order):
一个群内的一个元素a之阶(有时称为周期)是指会使得am = e的最小正整数m(其中的e为这个群的单位元素,且am为a的m次幂)。若没有此数存在,则称a有无限阶。有限群的所有元素有有限阶。
一个群G的阶被标记为ord(G)或|G|,他表示群内元素的个数,而一个元素的阶则标记为ord(a)或|a|。
有限域
  在数学中,有限域(finite field)或伽罗瓦域(Galois field,为纪念埃瓦里斯特·伽罗瓦命名)是包含有限个元素的域。与其他域一样,有限域是进行加减乘除运算都有定义并且满足特定规则的集合。有限域最常见的例子是当 p 为素数时,整数对 p 取模。有限域的元素个数称为它的阶(order)。可以看出域是满足更多运算的群。
这里我们规定一个有限域Fp
- 取大质数p,则有限域中有p-1个有限元:0,1,2...p-1
- Fp上的加法为模p加法`a+b≡c(mod p)`
- Fp上的乘法为模p乘法`a×b≡c(mod p)`
- Fp上的除法就是乘除数的乘法逆元`a÷b≡c(mod p)`,即 `a×b^(-1)≡c (mod p)`
- Fp的乘法单位元为1,零元为0
- Fp域上满足交换律,结合律,分配律
在这个域上我们希望使用椭圆曲线构造加密函数,但是考虑到曲线本身是连续的,不适合做加密,因此我们得想办法在椭圆曲线上构造一种离散的运算。这是我们可以构造一个阿贝尔群:
给定曲线
P,Q为曲线上的点,我们规定加法:
实P + Q = R是曲线上点的加法运算,任意取椭圆曲线上两点P、Q(若P、Q两点重合,则作P点的切线),作直线交于椭圆曲线的另一点R',过R'做y轴的平行线交于R,定义P+Q=R。这样,加法的和也在椭圆曲线上,并同样具备加法的交换律、结合律:
若P与Q点重合,则求P的切线交曲线的另一点为R‘。若有k个相同的点P相加,如3P = P + P + P
下面我们利用小学二年级就学过的微积分的知识求一下相关方程:
- 无穷远点 O∞是零元,有O∞+ O∞= O∞,O∞+P=P
- P(x,y)的负元是 (x,-y mod p)= (x,p-y) ,有P+(-P)= O∞
- P(x1,y1),Q(x2,y2)的和R(x3,y3) 有如下关系:
x3≡(k**2-x1-x2)(mod p)
y3≡(k(x1-x3)-y1)(mod p)
这里对等式两边求全微分,即可求出k = dy/dx
若P=Q 则 k=((3x^2+a)/2y1)mod p
这里PQ为不同的点,直接计算斜率
若P≠Q,则k=(y2-y1)/(x2-x1) mod p
若kP = O ∞ ,那么k就是点P的阶(order)
上面这个椭圆曲线上点的加法运算,就构成了一个阿贝尔群,数学基础到此结束。
二、ElGamal离散对数密码体制
我们来介绍一下基于离散对数的加密算法,首先密钥与公钥的生成步骤如下:
(一)公钥密钥生成:
1. Alice首先构造一条椭圆曲线E,在曲线上选择一点G作为生成元,并求G的阶为n,要求n必须为质数。此时构成了一个循环群\<G>。
2. Alice选择一个私钥k (k < n),生成公钥 Q = kG
3. Alice将公钥组E、Q、G发送给Bob
(二)加密过程
1、Bob收到信息后,将明纹编码为M,M为曲线上一点,并选择一个随机数r(r < n, n为G的阶)
2、Bob计算点Cipher1与Cipher2即两段密文,计算方法如下
- Cipher1 = M + rQ
- Cipher2 = rG
3、Bob把Cipher1和Cipher2发给Alice
(三) 解密过程
1、Alice收到密文后,为了获得M,只需要Cipher1 - k · Cipher2,因为
Cipher1 - k*Cipher2 = M + rQ - krG = M + rkG - krG = M
2、将M解码即可
(四)技术要求
在选择参数时有一下要求:
- 大质数p越大安全性越好,但是速度会降低,200位左右可以满足一般安全要求
- n应为质数
- 椭圆曲线上所有点的个数m与n相除的商的整数部分为h,h≤4;p≠n×h ;pt≠1(mod n) (1≤t<20)
- 满足椭圆曲线的判别式
三、代码实现
Python代码,参见原博客
C++可以调用Wolfssl库
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具