为什么本站点的ECC-DH对称密钥与OpenSSL不同

我正在使用(这个网站的) Javascript库和OpenSSL Ruby来计算Elliptic Curve Diffie Hellman的对称密钥。

但是,根据我的结果,OpenSSL Ruby只生成一个密钥,而不像具有X和Y对称密钥的网站上的密钥。 我很困惑,因为我的OpenSSL对称密钥与网站上的那些x和y中的任何一个都不匹配。

使用secp224r1曲线得到的对称(共享密钥)密钥:

Ruby OpenSSL

  13506351678569412185536677668115375188438201041599149052762191980775 

使用Site的JS库

 x: 26210366144026557327555572210249241206666031403062020900473236895358 y: 19676808255388748321882118528911150828003358302170965920476006073155 

我的问题是:

1)为什么OpenSSL Ruby只产生一个键,而该大小产生两个键:x和y(因为我假设x和y不会相互连接,因为与Ruby对称相比,bitsize会太长键)

2)有没有办法将两个对称密钥(上面的OpenSSL和JSBN-EC库)相互转换? 我所有的转换尝试都失败了。

我一直在努力工作一周,现在用JSBN-EC库实现Ruby OpenSSL。 我也试过(SJCL库)但是类似的结果(对称键不匹配)。 请帮忙。

我已经设法在客户端(JSBN-EC)和服务器OpenSSL Ruby上使用对称密钥来解决这个问题

我发现我的问题实际上在于代码本身。 修复之后,我最终在OpenSSL Ruby上得到了一个对称密钥,如下所示:

 #Ruby: OpenSSL ... ... symm_key = ec.dh_compute_key(point) symm_key.unpack('B*').first.to_i(2) #Converts to binary, then to integer #--> 6922380353406615622038660570577625762884344085425862813095878420328 

而在客户端使用JSBN-EC

 #Javascript: JSBN-EC ... ... var curve = get_curve(); var P = new ECPointFp(curve, curve.fromBigInteger(server_pub_key_x), curve.fromBigInteger(server_pub_key_y)); var a = client_priv_key; var S = P.multiply(a); console.log('SYMM_KEY X: '+S.getX().toBigInteger().toString()); //--> 6922380353406615622038660570577625762884344085425862813095878420328 console.log('SYMM_KEY Y: '+S.getY().toBigInteger().toString()); //--> 14426877769799867628378883482085635535383864283889042780773103726343 

因此,从它的外观来看,与Ruby OpenSSL值匹配的对称密钥是JSBN-EC对称密钥的X值。

 6922380353406615622038660570577625762884344085425862813095878420328 == 6922380353406615622038660570577625762884344085425862813095878420328 

我不知道现在的Y值是多少。 看起来我不需要它。 干杯! 🙂

Interesting Posts