js示例代码
function generatePrivateKey(length = 64) {
const bytes = new Uint8Array(length);
window.crypto.getRandomValues(bytes);
return BigInt(`0x${bytes.reduce((data, byte) => data + ('00' + byte.toString(16)).slice(-2), '')}`);
}
const p = generatePrivateKey(128); // 一个常见的2048位素数
const g = 2n; // 通常的生成元
// 模幂运算
function modPow(base, exponent, modulus) {
let result = BigInt(1);
base = base % modulus;
while (exponent > BigInt(0)) {
if (exponent % BigInt(2) === BigInt(1))
result = (result * base) % modulus;
exponent = BigInt(Math.floor(Number(exponent / BigInt(2))));
base = (base * base) % modulus;
}
return result;
}
// 第一方的私钥
const a = generatePrivateKey();
const A = modPow(g, a, p); // 第一方的公钥
// 第二方的私钥
const b = generatePrivateKey();
const B = modPow(g, b, p); // 第二方的公钥
// 第一方计算共享密钥
const sharedSecretA = modPow(B, a, p);
// 第二方计算共享密钥
const sharedSecretB = modPow(A, b, p);
console.log("Shared Secret (Party A): ", sharedSecretA.toString(10));
console.log("Shared Secret (Party B): ", sharedSecretB.toString(10));