UNPKG

crypto-keygen-suite

Version:

Key generation utilities for cryptographic operations. YES I RENAMED IT. SIX STATE PROTOCOL!!! See its folder for all <3

91 lines (75 loc) 2.58 kB
import yargs from "yargs"; import { hideBin } from "yargs/helpers"; const BASES = { Z: ["0", "1"], X: ["+", "-"], Y: ["L", "R"], }; function randomChoice(arr) { return arr[Math.floor(Math.random() * arr.length)]; } function generateAliceStates(n) { const states = []; for (let i = 0; i < n; i++) { const basis = randomChoice(["Z", "X", "Y"]); const bit = Math.round(Math.random()); const state = BASES[basis][bit]; states.push({ bit, basis, state }); } return states; } function simulateBobMeasurements(aliceStates) { return aliceStates.map(({ state }) => { const bobBasis = randomChoice(["Z", "X", "Y"]); const isCompatible = BASES[bobBasis].includes(state); const measuredBit = isCompatible ? BASES[bobBasis].indexOf(state) : Math.round(Math.random()); return { bobBasis, measuredBit }; }); } function siftKeys(aliceStates, bobMeasurements) { const siftedAliceBits = []; const siftedBobBits = []; for (let i = 0; i < aliceStates.length; i++) { if (aliceStates[i].basis === bobMeasurements[i].bobBasis) { siftedAliceBits.push(aliceStates[i].bit); siftedBobBits.push(bobMeasurements[i].measuredBit); } } return { siftedAliceBits, siftedBobBits }; } function estimateQBER(aliceBits, bobBits) { const mismatches = aliceBits.filter((bit, i) => bit !== bobBits[i]).length; return mismatches / aliceBits.length; } export function runSixStateProtocol(n = 100) { console.log("Running Six-State QKD Protocol..."); const aliceStates = generateAliceStates(n); const bobMeasurements = simulateBobMeasurements(aliceStates); const { siftedAliceBits, siftedBobBits } = siftKeys(aliceStates, bobMeasurements); const qber = estimateQBER(siftedAliceBits, siftedBobBits); console.log("Sifting complete."); console.log(`Sifted key length: ${siftedAliceBits.length}`); console.log(`QBER (Quantum Bit Error Rate): ${(qber * 100).toFixed(2)}%`); return { aliceKey: siftedAliceBits.join(""), bobKey: siftedBobBits.join(""), qber, }; } if (process.argv[1].endsWith('SixStateProtocol.js')) { const argv = yargs(hideBin(process.argv)) .option("length", { alias: "n", type: "number", description: "Number of bits to generate", default: 128, }) .help() .alias("help", "h") .parse(); const result = runSixStateProtocol(argv.length); console.log("Alice's Key:", result.aliceKey); console.log("Bob's Key: ", result.bobKey); }