最近在忙一个项目,我们公司的一个卡产品,要用到ECIES(集成加密方案,elliptic curve integrate encrypt scheme),加解密。ECIES中的最重要一步就是ECDH,需要算出共享密钥。于是研究起来,这篇文章记录我的学习过程。
ECDH是EC是“elliptic curves”的意思,DH是“Diffie-Hellman”的意思。它实际上是密钥协商算法,而不是加解密算法。该算法可以用来解决如下问题:
- 在公网通道上如何进行安全的秘钥分派。
两端(Alice 和 Bob)想要安全的交换信息并且第三方不能获取到该信息。当然这也是TLS协议中的目的之一,举个例子。(其实下面的描述其实是ECDHE,而不是ECDH)
Alice 和 Bob 生成他们自己的私钥和公钥,即Alice 有 Pri_A、Pub_A = Pri_A * G;Bob有Pri_B、Pub_B = Pri_B*G。
Alice把Pub_A 发给Bob,Bob把Pub_B 发给Alice。这样Alice 有Pri_A,Pub_A ,Pub_B,Bob有Pri_B,Pub_B ,Pub_A。
Alice计算共享S = Pri_A * Pub_B(即自己的私钥乘上Bob的公钥),同样的,Bob计算S = Pri_B * Pub_A (自己的私钥乘上Alice的公钥)。两边计算的S是相同的。
S = Pri_A * Pub_B = Pri_A * (Pri_B * G) = Pri_B * (Pri_A * G) = Pri_B * Pub_A -------等式1
中间人只知道到Pub_A和Pub_B ,无法计算出共享密钥S。即离散对数问题为:中间人要计算 S,必须通过上述 等式1 中的一个等式来计算。显然必须知道Pri_A或者Pri_B,而中间人只知道Pub_A和Pub_B,即中间人为了获得Pri_A或者Pri_B需要从Pub_A或Pub_B中分离出Pri_A或者Pri_B,显然这就是之前所说的离散对数问题。
现在Alice和Bob得到了共享密钥,后续可以使用共享密钥进行对称加密进行数据传输。通常情况下,点S中x向量被作为共享密钥。
我们现在给出一个例子,设椭圆曲线为secp256r1(在SECG中被定义),它的参数如下:
Recommended Parameters secp256r1
The verifiably random elliptic curve domain parameters over Fp secp256r1 are specified by the sextuple T = (p, a, b, G, n, h) where the finite field Fp is defined by:
//Alice
Pri_A_str = 0x15E8B4FFD8006F81F98DB52A295F7C7E20BFEB275EB1492F689B481505937BD3
Pub_A_x_str = 0x5B4AA00013F86A113F204D8DF230C4810A6C3B45BF6481376316B04B4366BD6E
Pub_A_y_str = 0x27063102FDF91A8B208065FB9D823D318E2532DCD115DD7A61D327EA49DB763E
//Bob
Pri_B_str = 0x3EA18457C92D570552A4F63979DD6339C3566C896F7245EBC4B8D6010FB1D811
Pub_B_x_str = 0xD89B4456C9AFFA453B5C87CA67FD86079FB320AB35DE535E3380CE8C4CB7F951
Pub_B_y_str = 0x08D323F3F3DFFD7601C964E72559B890049DC3445184B44A3E28ACB1D5869AE9
设椭圆曲线为secp256r1
Alice计算的共享密钥=Pri_A*Pub_B=2E653DB8C1B9C2C4BA8A82CFAA8417D507146855C11F40BFEA3EC6B4647928D0
Bob 计算的共享密钥=Pri_B*Pub_A=2E653DB8C1B9C2C4BA8A82CFAA8417D507146855C11F40BFEA3EC6B4647928D0
网上找不到相关计算软件,我就用C#写了个程序,可以计算共享密钥,效果如下图
如上图,可见Alice跟Bob协商的共享密钥是一致的。
工具下载链接:
链接: ECDH产生共享密钥软件下载….
如果有需要,可付费修改,按需求提供计算软件。联系微信tianshanjinyou