javascript - 如何将椭圆曲线 Diffie-Hellman 与 JS 中的 SJCL 和 Ruby 中的 OpenSSL 结合使用

标签 javascript ruby-on-rails ruby openssl sjcl

使用 Elliptic-Curves Diffie-Hellman,我想连接客户端上的 SLCL - JS (documentation) 和服务器上的 OpenSSL - Ruby (documentation)

我发现了一个类似的问题here,但它并没有真正得到正确的回答,而且它也不是我真正想要的,因为它使用sjcl.ecc.elGamal.generateKeys(384, 10),而我希望使用sjcl.ecc.curves['c384'] <- NIST

尽管如此,我仍然使用并修改了他的代码来进行测试,因为我在使用 sjcl.ecc.curves['c384'] 生成单个公共(public)点 key 时遇到了问题,这就是我想到的。

//Javascript
keypair = sjcl.ecc.elGamal.generateKeys(384, 10);
console.log(keypair.pub._point.toBits()); //Changed from his serialize()

这输出到

[-1992414123, 638637875, 1917312913, 73389700, -425224557, 743777818, 970253455, 723842951, -1751664279, 982132367, -1949786746, 1067402923, -869929568, 157928816, 1651634060, 1968161300, -216192372, -1858642177, -1345910998, -2128793177, -1325754797, 143080818, 1868787479, -484135391]

使用 ruby​​ 的输出:

#Ruby
pointArr = [-1992414123, 638637875, 1917312913, 73389700, -425224557, 743777818, 970253455, 723842951, -1751664279, 982132367, -1949786746, 1067402923, -869929568, 157928816, 1651634060, 1968161300, -216192372, -1858642177, -1345910998, -2128793177, -1325754797, 143080818, 1868787479, -484135391]

# ugly bit magic to somehow convert the above array into a proper byte array (in form of a string)
pointStr = [(pointArr.map { |i| (i>=0)?('0'*(8-i.to_s(16).length)+i.to_s(16)):("%08X" % (2**32-1+i+1)) }*'').upcase].pack("H*")

#My modified code
pointInt = pointStr.unpack('B*').first.to_i(2) #Convert BitStr to integer
pointBN = OpenSSL::BN.new(pointInt.to_s, 10) #Int to BigNumber (to be used as param below)

group = OpenSSL::PKey::EC::Group.new('secp384r1') #EC Group to be used

client_pub_point = OpenSSL::PKey::EC::Point.new(group, pointBN)
# ^
# ^ ABOVE'S MY PROBLEM -> OpenSSL::PKey::EC::Point::Error: invalid encoding
# ^

#Server EC: code taken and modified from https://www.ruby-forum.com/topic/3966195 
ec = OpenSSL::PKey::EC.new(group)
ec.generate_key

pub = OpenSSL::PKey::EC.new(group)
pub.public_key = client_pub_point

#Compute Shared Key
shared_key = ec.dh_compute_key(pub.public_key)

puts shared_key.unpack('I>*')

当使用上面 [(link)] ( https://www.ruby-forum.com/topic/3966195 ) 的原始代码时,此“放置”如下所示

3747233514
2683763564
475565567
1087119841
857380668
2490387914
3548975947
2348082236
2093543365
1477205987
4289120093
3330807042

应该是这样,但以防万一这是我的测试

irb(main):113:0> ec = OpenSSL::PKey::EC.new(group)
=> #<OpenSSL::PKey::EC:0x37f4250>
irb(main):114:0> ec.generate_key
=> #<OpenSSL::PKey::EC:0x37f4250>

irb(main):115:0> pub = OpenSSL::PKey::EC.new(group)
=> #<OpenSSL::PKey::EC:0x374f070>
irb(main):116:0> pub.public_key = ec.public_key
=> #<OpenSSL::PKey::EC::Point:0x37f8090>

irb(main):117:0> pub.public_key.to_bn
=> 7699789176960498967958014210931326569901199635665512831714857096185925821659134057981449113945854620725216613989823482205311316333140754760317456176281271361802541262755346331375041208726203461213190230560617504850860621520632944763
irb(main):119:0> OpenSSL::PKey::EC::Point.new(group, pub.public_key.to_bn)
=> #<OpenSSL::PKey::EC:0x4029f48>

#The ABOVE FORMAT works, unlike the error I got like the following

irb(main):122:0> pointBN
=> 832312614609895991150696681555479456971598284480953722479085426901428295415600048953528780331647571635767075686130334170313461289491500162782258792834115040597490936949579748064005380309022482780162833924377801386781542770068991521
irb(main):123:0> OpenSSL::PKey::EC::Point.new(group, pointBN)
OpenSSL::PKey::EC::Point::Error: invalid encoding

但是比较上面的工作和不工作,似乎小数位数的总数是相同的,所以我认为我在某种程度上是在正确的 rails 上,但我只是无法真正解决它。

对于那些可能遇到此类问题的人,这些是我的引用代码 (1) (2) (3) (4) (5)

我已经在这个问题上坚持了两天了,网上似乎没有太多关于这个的文章,而且我找不到任何其他支持椭圆曲线的 JS 库。任何帮助将不胜感激。

最佳答案

这个问题终于解决了! :)

我使用了不同的 Javascript 库。如果您正在寻求解决类似的问题,请参阅我的另一个问题(link)

关于javascript - 如何将椭圆曲线 Diffie-Hellman 与 JS 中的 SJCL 和 Ruby 中的 OpenSSL 结合使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22325272/

相关文章:

javascript - stopImmediatePropagation 未按预期工作

javascript - 如何在 typescript 中定义 jQuery 对象?

ruby-on-rails - 在 Ruby 中读取文件的第一行

ruby - 创建 Ruby gem//'require' 错误 : cannot load such file (LoadError)

javascript - 在 body 区域内单击时触发事件

带有附加选择器的 jQuery .on() 的 JavaScript 等效项

ruby-on-rails - 有没有办法将命名范围组合成一个新的命名范围?

javascript - Bootstrap 可折叠面板未打开 - 控制台中没有错误

ruby - Ruby 脚本如何检测到它正在 irb 中运行?

javascript - 如何自动检测函数并返回值