椭圆曲线基本学习
书籍:密码学原理与实践 第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
最后签名:
验证算法
- 计算消息值摘要
- 计算
- 判断
正确性
首先计算 :
=> =>
所以 :
因此可以推导:
所以如果, 则 验签通过,否则 摘要有误