最简单的椭圆曲线算法及加解密签名验签流程
一条椭圆曲线可以使用二元三次方程来表示,比如:y2 = x3 + ax + b
下图展示了一些合法的椭圆曲线:
椭圆曲线定义
定义椭圆曲线上两点相加为:给定曲线两点P,Q,P+Q等于P和Q两点的连线与曲线交点沿X轴的对称点,如果P=Q,则P+P等于P在曲线上的切线与曲线交点沿X轴的对称点。
下图演示了如何计算P+Q=R(P≠Q),将P和Q相连得到和曲线的另一个交点-R,再将-R沿X轴做对称得到最终结果R。
如果P和Q相等,下图演示了如何计算P+Q=2P=R(P=Q),使用P点的切线得到红点-R,沿着X轴做对称得到R点。
如果我们从某一点出发(所谓的单位元,比如正整数域的1,代表一个空间里的最基本单元),不停做自增操作(所谓群操作,比如++),枚举出整个空间的集合元素可以用下图表示:
G点是一般是固定算法推荐的点。随机生成稳定性不可靠
从G出发,不停做切线,找对称点,依次得到-2G,2G,-4G,4G,-8G,8G... 我们可以想象,如果直接给你一个点 Q ,而且Q = NG,你是无法直接回答N的数值是多少(因为是做的切线,无法轻易的反推回去)。N就是我们的私钥,Q就是我们的公钥。
N如果是奇数,比如是3,可以使用G点与2G点的连线交易椭圆曲线一点,然后在做x轴的对称点即为3G点
椭圆加解密流程
流程:
- 随机生成K
- 公钥即为KG
- 生成随机数R,(随机数是通过生成随机数r乘以基点G得到) 。同样的公钥同样的私钥所以每次加密都是不一样的。
加密就可以完成了C = M +r*k*G
- 加密好的数据发送给对方,应该包含两个内容,一个是密文C,另一个是随机数R.
- 解密时即可通过私钥k,得到明文 M = C-k*R
椭圆曲线签名验签流程
原理私钥签名,公钥验签。
G点是基准基点,然后通过一个随机数r,获取一个R=rG
模逆元是除法
私钥是k,公钥是kG
步骤:
- 通过消息散列h,随机数rG,私钥k,生成签名s= r(-1)(h+kx)。然后发送给接收者签名s和随机数rG
- 接收者验签,公钥kG,签名s,随机数rG,验证得到结果即为rG ,即表示比对成功。
椭圆曲线 秘钥交换协议ECDH
步骤:
A与B协商私钥
- A,B生成随机私钥a,b
- 首先协商生成一个基点G,发送给B
- 通过基点,各自发送自己的公钥 bG,aG
- 计算共享秘钥abG
- 窃听者无法计算出abG, 前向安全性