我使用(this site's) 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不会相互连接,因为与之相比,bitsize将会过长Ruby对称密钥)
2)有没有办法将两个对称密钥(上面的OpenSSL和JSBN-EC库)相互转换?我所有转换的尝试都失败了。
我一直在努力工作一周,现在用JSBN-EC库实现Ruby OpenSSL。我也试过了(SJCL library)但结果相似(对称键不匹配)。请帮忙。
答案 0 :(得分:1)
我已经设法在客户端(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值是多少。看起来我不需要它。干杯! :)