我在用(本网站的)Javascript 库和 OpenSSL Ruby 用于计算椭圆曲线 Diffie Hellman 的对称密钥。
然而,从我的结果来看,OpenSSL Ruby 仅生成了一个密钥,这与网站上具有 X 和 Y 对称密钥的密钥不同。我很困惑,因为我的 OpenSSL 对称密钥与网站上的 x 和 y 之一都不匹配。
我使用的对称(共享秘密)密钥secp224r1
curve:
Ruby OpenSSL
13506351678569412185536677668115375188438201041599149052762191980775
使用站点的 JS 库
x: 26210366144026557327555572210249241206666031403062020900473236895358
y: 19676808255388748321882118528911150828003358302170965920476006073155
我的问题是:
1)为什么OpenSSL Ruby只产生一个密钥,而该大小产生两个密钥:x和y(因为我假设x和y不会彼此连接,因为与Ruby对称相比,位大小太长钥匙)
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值是多少。看来我不需要它了。干杯! :)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)