secp256k1-ecc


椭圆曲线算法可以看作是定义在特殊集合下数的运算,满足一定的规则。
椭圆曲线在如 下两个域中定义:Fp 域和 F2m 域。

Fp 域,素数域,p 为素数;
F2m 域:特征为 2 的有限域,称之为二元域或者二进制扩展域。该域中,元素的个数为 2m 个。

椭圆曲线标准文档如下:
1) X9.62
   Public Key Cryptography For The Financial Services Industry: The Elliptic Curve
  Digital Signature Algorithm (ECDSA);
2) SEC1
   SEC 1:Elliptic Curve Cryptography;
3) SEC2
   SEC 2: Recommended Elliptic Curve Domain Parameters;
4) NIST
   (U.S.) National Institute of Standards and Technology,美国国家标准。
   这些标准一般都描述了 Fp 域和 F2m 域、椭圆曲线参数、数据转换、密钥生成以及
   推荐了多种椭圆曲线。

一些术语说明:
1) 椭圆曲线的阶(order of a curve)
   椭圆曲线所有点的个数,包括无穷远点;
2) 椭圆曲线上点的阶(order of a point)
   P 为椭圆曲线上的点,nP=无穷远点,n 取最小整数,既是 P 的阶;
3) 基点(base point)
   椭圆曲线参数之一,用 G 表示,是椭圆曲线上都一个点;
4) 余因子(cofactor)
   椭圆曲线的余因子,用 h 表示,为椭圆曲线点的个数/基点的阶
5) 椭圆曲线参数:
   素数域:
   (p,a,b,G,n,h)
       其中,p 为素数,确定 Fp,a 和 b 确定椭圆曲线方程,G 为基点,
       n 为 G 的阶, h 为余因子。
   二进制扩展域:
   (m,f(x),a,b,G,n,h)
       其中,m 确定 F2m,f(x)为不可约多项式,a 和 b 用于确定椭圆曲线方程,G 为基点,
       n 为 G 的阶, h 为余因子。

6) 椭圆曲线公钥和私钥
   椭圆曲线的私钥是一个随机整数,小于 n;
   椭圆曲线的公钥是椭圆曲线上的一个点: Q = 私钥 * G。




有一天张三挑出了两个数字,123,456。
由于张三会乘法,于是乎张三计算出了:
123 * 456 = 56088
于是张三告诉你:
123 * ??? = 56088

你是个天资卓绝的人,但是没办法,上天不允许你会除法,因此你没法知道张三说的???是什么。
当然了,别人也不知道,因为张三没有告诉其他人???是啥。

过了几天,你打算告诉张三一个秘密,67。但是你又不想别人知道。于是聪明绝顶的你随手选了一个数字222。计算出:
123 * 222 = 27306
56088 * 222 + 67 = 12451603
然后你对张三说:
123 * ??? = 27306
56088 * ??? + x = 12451603
当然,你聪明绝顶,张三聪明秃顶,于是张三一寻思:

123 * ??? * 456 = 56088 * ???
这上下一减,x = 12451603 - 27306 * 456 = 67

哎妈呀,这x就这么被传递过来了。

tips:上面那些都踏马怎么得到的?


细细想想:
假设张三公钥为K1,阶为G,私钥为:Q1
你的公钥为K2,阶为G,私钥为Q2
双方相互交换公钥。
张三手里握着自己的私钥Q1和你的公钥K2,你手里握着自己的私钥Q2和张三的公钥K1
则:设X1=Q1×K2=Q1×(Q2×G)
X2=Q2×K1=Q2×(Q1×G)
以上两个式子是相等的,即X1=X2

也可以这么理解:
Q1×K2=Q1×(Q2×G)=Q1×Q2×G=Q1×G×Q2=(Q1×G)×Q2=K1×Q2=Q2×K1


1)、张三知道的:123 * 456 = 56088 ,你知道的:123 * ??? = 56088
所以张三的公钥是56088,选择的G是:123
张三手里的信息是:自己的私钥:456
你手里的信息是:张三的公钥:56088
2)、你发给张三的信息:

123 * ??? = 27306
56088 * ??? + x = 12451603
你同样选择了123作为G,张三也知道了你的公钥是27306
你手里的信息:自己的私钥:222
张三知道的:你的公钥:27306

综上:
张三:私钥:456、G:123、公钥:56088
你:  私钥:222、G:123、公钥:27306

张三拿他的私钥×你的公钥,结果为:456×27306
123 * ??? = 27306
带上上式:456×27306=456×123 * ??? =
而张三私钥×G=张三的公钥,张三公钥为56088,所以上式可变化为:
456×27306=456×123×???=56088×???

结合:56088 * ??? + x = 12451603

所以x=12451603-56088×???=12451603-456*27306=67





如果我们把上面的过程写成数学公式的话,就是

G * k = K (G,K公开,k保密)
(k就是传说中的密钥,K就是传说中的公钥,G一般在算法里写死了,也叫做曲线参数)

c1 = G * M
c2 = K * M + x (M随机选取,x为要加密的数字,M和x都保密)

x = c2 - c1 * k(这里应该写成是证明这个等式成立)
= K * M + x - G * M * k
= G * M * k + x - G * M * k (消除左右两侧的G * M * k)
= x