Skip to content

Latest commit

 

History

History
102 lines (63 loc) · 2.36 KB

3.5 ECDH.md

File metadata and controls

102 lines (63 loc) · 2.36 KB

ECDH

為橢圓曲線結合Diffie-Hellman ( DH ) 之加密演算法,全名為Elliptic Curve Diffie-Hellman ( ECDH )。

https://koclab.cs.ucsb.edu/teaching/ecc/project/2015Projects/Haakegaard+Lang.pdf

用途:

讓兩人不透漏私密訊息的情況下獲得一把共同的密鑰。

原理步驟:

1.阿東與小明先約定好,選擇一個共同的橢圓曲線

$$y^2 = (x^3 + ax + b)$$ mod p 之 a, b, p 之三個參數

2.之後兩人公同約定一個曲線上的點當作公鑰

3.阿東把自己的私密數字乘上公鑰後傳給小明,而小明把自己的私密數字乘上公鑰後傳給阿東

4.雙方把各自拿到的對方結果再乘上自己的私密數字即可算出一個共享的密鑰。

Node.js範例

const crypto = require('crypto');

// A
const ecdh_A = crypto.createECDH('secp256k1');
ecdh_A.generateKeys();
const publicKey_A = ecdh_A.getPublicKey(null, 'compressed');

// B
const ecdh_B = crypto.createECDH('secp256k1');
ecdh_B.generateKeys();
const publicKey_B = ecdh_B.getPublicKey(null, 'compressed');

const secret1 = ecdh_A.computeSecret(publicKey_B).toString('hex');
console.log('Secret1: ', secret1.length, secret1);

const secret2 = ecdh_B.computeSecret(publicKey_A).toString('hex');
console.log('Secret2: ', secret2.length, secret2);

console.log(`兩者Secret相同: ${secret1 === secret2}`)

OpenSSL範例

先查看可用曲線

openssl ecparam -list_curves

這邊我們使用secp521r1 曲線

1.產生兩把不同的私鑰A與B

openssl ecparam -name secp521r1 -genkey -noout -out ec_private_keyA.pem

openssl ecparam -name secp521r1 -genkey -noout -out ec_private_keyb.pem

2.從兩把私鑰產生兩把對應的公鑰

openssl ec -in ec_private_keyA.pem -pubout -out ec_public_keyA.pem

openssl ec -in ec_private_keyB.pem -pubout -out ec_public_keyB.pem

產生共同Secret

A之Secret

openssl pkeyutl -derive -inkey ec_private_keyA.pem -peerkey ec_public_keyB.pem -out secretA.bin

B之Secret

openssl pkeyutl -derive -inkey ec_private_keyB.pem -peerkey ec_public_keyA.pem -out secretB.bin

最後,比較兩個產生出的Secret是否相同

cmp secretA.bin secretB.bin

使用xxd指令查看