gpt4 book ai didi

javascript - 在 JavaScript 中计算 ECDH 共享 key

转载 作者:行者123 更新时间:2023-11-29 18:12:01 26 4
gpt4 key购买 nike

我需要使用 ECC key 和 ECDH 在 JavaScript 中计算共享 key 。我看到两个可能的项目可以做到这一点,但我不确定要追求哪个:。

  1. https://code.google.com/p/end-to-end
  2. https://github.com/bitwiseshiftleft/sjcl

1) 是一个 chrome 扩展,所以我认为这意味着它不会在其他浏览器中运行。2) 有人对 SJCL 有疑问,声称他们认为这是使用 ECMQV 而不是普通 ECDH ( Can't bridge Elliptic Curve Diffie-Hellman with javascript )。

有人可以为我的实现推荐一个好的行动方案吗?和选项 3(首选选项):我有一种直觉,可以直接在此处包含一个共享 secret 实现:https://github.com/bitcoinjs/bitcoinjs-lib/blob/master/src/ecdsa.js .

这是在服务器上创建共享 key 的 C++ 代码:

void * ecies_key_derivation(const void *input, size_t ilen, void *output, size_t *olen) 
{
*olen = SHA512_DIGEST_LENGTH;
return (void*)SHA512((const unsigned char*)input, ilen, (unsigned char*)output);
}
...
fc::sha512 shared_secret;
ECDH_compute_key( (unsigned char*)&shared_secret, sizeof(shared_secret), EC_KEY_get0_public_key(recipient.my->_key), my->_key, ecies_key_derivation );

最佳答案

显然这需要巩固,但它至少是有效的!

选项 1 是特定于 chrome 的: https://bugzilla.mozilla.org/show_bug.cgi?id=1022106“粗略浏览一下代码(git clone-able from git clone https://code.google.com/p/end-to-end/ ),它似乎被设计成一个仅限 Chrome 的附加组件”

选项 2 在这里使用 bitcore(bitcore 在幕后使用 sjcl)工作:

    # npm install bitcore
ECIES = require '../node_modules/bitcore/lib/ECIES'
ot_pubkey = new Buffer(onetime_public_key, 'hex')
my_privkey = new Buffer(d_receiver_hex, 'hex')
ecies = new ECIES.encryptObj ot_pubkey, new Buffer(''), my_privkey
S = ecies.getSfromPubkey()
console.log 'bitcore sharedsecret\t',S.toString 'hex'
S_kdf_buf = ECIES.kdf(S)

console.log 'bitcore sharedsecret kdf\t',S_kdf_buf.toString 'hex'

另外 elliptic.js 可以工作,它使用自己的代码,包括用于大数字的 bn.js(同一作者):

    # git clone https://github.com/indutny/elliptic.git
elliptic = require('../elliptic/lib/elliptic.js')

# npm install bn.js
bn = require('bn.js')

#Providing ecies_key_derivation https://github.com/indutny/elliptic/issues/9
ec = new elliptic.ec('secp256k1')

s0 = ec.keyPair(onetime_private_key, 'hex')

# ../testnet/config/genesis_private_keys.txt

s1 = ec.keyPair(d_receiver_hex, "hex")

sh0 = s0.derive(s1.getPublic())
sh1 = s1.derive(s0.getPublic())
assert.equal sh0.toString(16), sh1.toString(16), "shared secret did not match"

shared_secret = "0"+sh0.toString(16) #### only works for this shared secret (bn.js::toString(16))

此时,我让这些库正确地生成了共享 secret 。对于解密,我最终使用了 crypto-js。

    # https://code.google.com/p/crypto-js/#Custom_Key_and_IV
# see wallet_records.cpp master_key::decrypt_key
CryptoJS.AES.decrypt(
ciphertext: cipher
salt: null
, @key,
iv: @iv
)

对于解密,我需要一个 256 位 IV(初始化向量)来完成任务,以便在更新之前将 SJCL 排除在外(https://github.com/bitwiseshiftleft/sjcl/issues/197)。另外,我也没有用 elliptic.js 解密,尽管我不确定这是否是我的错误。

关于javascript - 在 JavaScript 中计算 ECDH 共享 key ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26595085/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com