ECC
椭圆曲线可以定义为所有满足方程 的点 (x,y) 所构成的集合。
ECC 算法的六要素
- a,b:椭圆曲线系数
- p:模数
- 基点 G(曲线上的一个点)
- G 的阶 n (n * G = O)
- 余因子 = 曲线的阶/G 的阶
ECC 算法的数学基础
- 椭圆曲线在素域 上的运算规则
- P+O=O+P=P;
- 若 P(,), Q(,) 满足 ,则 P+Q=O;
- 若 P(,), Q(,) 不满足上面的性质,则
- 若 ,;
- 若 ,.
- 椭圆曲线的乘法性质
- 若 (k<n),其中 k 是常数,Q、P 是曲线上的点,则通过 k,P 计算 Q 简单,但是通过 Q、P 推算 k 较为复杂。
OpenSSL 中的 ECC 库
- 创建 group
EC_GROUP *group=EC_GROUP_new(EC_GFp_simple_method());
- a,b,p 初始化 group
EC_GROUP_set_curve_GFp(group,p,a,b,ctx);
- 创建基点 G 并通过 tx,ty 初始化
G=EC_POINT_new(group);
EC_POINT_set_affine_coordinates_GFp(group,G,tx,ty,ctx);
- G,n,余因子 (1) 设置 group
EC_GROUP_set_generator(group, G, n, BN_value_one());
- 获得点 T 的坐标 (tx,ty)
EC_POINT_get_affine_coordinates_GFp(group,T,tx,ty,ctx)
- ECC 上的加法 T = T + G
EC_POINT_add(group,T,T,G,ctx)
- ECC 上的乘法 T = m * G
EC_POINT_mul(group,T,m,NULL,NULL,ctx)
- T = m * G + n * P
EC_POINT_mul(group,T,m,P,n,ctx)
ECC 加密解密
- 公钥 (公钥点) R = d * G
- 私钥 d (d < n)
- 加密 (r(x),s)
- r(x) = (k * G).x ,其中 k < n, r(x) 结果不能对 n 取模
- s = m * (k * R).x mod n, 其中 m 为明文
- 解密 (利用私钥 d)
- 通过 r(x) 推出点 r
- m = s / (r * d).x
= (m * (k * R).x) / (k * G * d).x
= (m * (kd * G).x) / (kd * G).x
= m
ECC 算法签名
- ecdsa(elliptic curve digital signature)
- 签名 (r,s)
- r = k * G
- s = (m + r * d)/k
- 验证: (m / s) * G + (r / s) * G == r
- ecnr
- 签名 (r,s)
- r = (k * G).x + m
- s = k - (r * d).x
- 验证: r - (s * G + r * R) == m
参考资料