为什么本站点的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值是多少。 看起来我不需要它。 干杯! 🙂