椭圆曲线基本学习
书籍:密码学原理与实践 第6章
椭圆曲线方程
群与阿贝尔群
是一个 群 (Group) 如果该集合上定义了一种运算
:
-
封闭性:
,则
;
-
结合律:
,
;
- 存在单位元
, 使得
,
;
- 每一个元素存在逆元:对于集合内任意元素
满足
,记做
如果该群还满足:
-
交换律:
,
则该群被称为阿贝尔群.
有限域
是一个 域(Field) 如果该集合上定义了两种运算
-
封闭性:
,则
-
结合律:
,
- 存在加法单位元
,使得
,
- 存在乘法单位元
,使得
,
-
交换律:
,
,
-
逆元: 对于集合内任意元素
满足
, 记做
,
无意义
-
分配律:
;
注意:加法逆元定义减法,乘法逆元定义除法
有限域指的是元素有限的域,属于计算机和密码学的基本数学原理之一
典型的有限域例子:,
为质数,
定义 (+):
定义 ():
计算 : 拓展欧几里得算法
椭圆曲线上的群
- 曲线上的点的集合组成群
-
无穷远点为单位元
- 点
与它的逆
关于直线
对称
-
加法定义:
,如果这三点是非0点,且在同一条直线上(即一条直线与该曲线相交于三点,无穷远点为0)
加法同样需要满足结合律.
几何意义上的加法
最重要的情况:
- 如果
,物理意义是切线, 与曲线交于另一点
, 满足:
- 如果
直线的第三点刚好为
,则也将包含一条切线,计算相同:
代数意义上的加法
不同两点相加
, 求
曲线方程:
计算斜率
-
曲线方程连立上直线方程
=>
铭记三次求根公式之三根之和是二次项系数的相反数:
由于斜率
,
相同两点相加
,求
和上面基本相同,但计算直线斜率需要根据切线计算
对曲线方程两边求隐微分:
=>
将带入,获得斜率:
所以 ,
标量积
,求
,
将
用二进制表示;以151为例子,
根据上面两项计算规则,分别计算
计算
,对
做相同点相加即可
同理计算
,
, 依次类推,每计算到一个二进制中为
的阶数, 完成一次两点相加即可
曲线上的有限域
取几何曲线上的坐标,
,
是一个质数,形成一条离散曲线:
从连续曲线上的加法可以推出有限域上的加法公式:
, 求
若
曲线上的循环子群
循环子群的阶
对于离散曲线上的任意点, 存在最小的
使得
, 此时
称作以
为基点的循环子群的阶
找基点的方法
- 计算椭圆曲线的阶
(Schoof's algorithm: https://en.wikipedia.org/wiki/Schoof%27s_algorithm)
- 选择一个阶为
的子群。n必须是素数且必须是
的因子
- 计算辅因子
- 在曲线上选择一个随机的点
- 计算
,点乘
- 如果
, 返回4, 否则找到基点
, 子群的阶为
,
被称为辅因子
原理: 根据拉格朗日定理, 整除
且
为质因子,且任意点
满足
, 则:
恒成立, 那么若
,则
作为基点的阶一定为
. (
一定是素数, 否则不成立)
曲线上的离散对数问题
对于曲线上的基点 , 已知
计算
是容易的
但是已知, 计算
是很困难的
ECDH & ECDSA
ECDH
- CA选用共同曲线,并下发相同基点
,其阶数为
, 则私钥的取值范围为
- Alice随机选择私钥
,计算 Pubkey:
, 通过非安全信道传递给Bob
- Bob随机选择私钥
,计算 Pubkey:
,通过非安全信道传递给Alice
- Alice和Bob分别计算
, 共享秘密成功
秘密共享成功后可以每次通信时明文传递salt, 每次通过 ,得到具体通信对称秘钥,加密通讯(TLS/SSL)
通过服务器动态生成的ECDH一般称作ECDHE
ECDSA
定义依然继承上文, 为
作为基点的子群阶数
定义 为表示
需要的比特数;注意计算DSA时,若摘要值的比特数
,则需要截取摘要值的低
进行签名.
符号标记
截取前n-bits函数 :
截取后的摘要值:,
需要选择安全摘要算法:内部要求SHA-256以上
私钥:
公钥:
签名算法
随机选择
计算
计算数字
, 若
则返回1
计算
, 如果
,返回1
最后签名:
验证算法
- 计算
- 计算
- 计算
若,验签成功,否则失败
正确性
我们尝试计算的其实还是,若此时
是正确摘要值,则有:
带入上式
所以若 发生改变,则此时计算出来的
随机数相等下的私钥复原
若每次取出的随机数 都相等:
获取两份签名与摘要: 和
容易得到:
之后通过 计算
:
之后计算 就很简单了:
通过签名恢复公钥
若已知曲线上 对应的两点
,则可以从签名
中恢复公钥
:
注意 或者
, 分别作为备选带入上式,同时
:
or
实现方法
点压缩:增加2bit来标识,一个用来标识 或者
,另一个标识
是基数还是偶数:
因为关于
轴对称,
, 所以
为一基一偶,可用一个bit标识
这样可以达到多用增加一个byte(04标记等),来达成无需传递公钥即可验签
相关算法与代码:https://busy.org/@oflyhigh/397bw1
伪造签名
构造e方法
- 随机选择
, 计算
- 计算
- 若
为伪造摘要值, 可伪造合法签名
正确性:
将带入
由于,校验通过
相关算法与代码:https://github.com/GoldSaintEagle/ECDSA-SM2-Signing-Attack
SM2签名
标记不变, 是消息的摘要值(国密要求摘要使用SM3),
是私钥,
是公钥
签名算法
随机选择
计算
计算数字
, 若
则返回1
计算
, 如果
,返回1
最后签名:
验证算法
- 计算消息值摘要
- 计算
- 判断
正确性
首先计算 :
=> =>
所以 :
因此可以推导:
所以如果, 则
验签通过,否则
摘要有误