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
JavaScript
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);
}