-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathQKD.py
94 lines (68 loc) · 3.13 KB
/
QKD.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
from numpy import random, zeros
import matplotlib.pyplot as plt
def main():
num_bits = 1000
eavesdropping_probability = 0.4
alice_bits, alice_bases = prepare_and_send_bits(num_bits)
eaves_bits, eaves_bases, intercepted = eavesdrop_and_measure(alice_bits, alice_bases, num_bits, eavesdropping_probability)
bob_bits, bob_bases = measure_bits(alice_bits, alice_bases, eaves_bits, intercepted, num_bits)
sifted_alice_bits, sifted_bob_bits = sift_bits(alice_bases, bob_bases, alice_bits, bob_bits)
error_rate = detect_eavesdropping(sifted_alice_bits, sifted_bob_bits)
print(f"Error Rate: {error_rate:.2%}")
if error_rate > 0.1: # Threshold for eavesdropping detection
print("Eavesdropping detected. Terminating the process.")
else:
print("No significant eavesdropping detected. Key exchange successful.")
print(f"Sifted Key: {sifted_alice_bits}")
# Simulate multiple runs and collect error rates
error_rates = []
for _ in range(10):
# Repeat the main simulation and collect error rates
error_rate = detect_eavesdropping(sifted_alice_bits, sifted_bob_bits)
error_rates.append(error_rate)
plot_error_rate(error_rates)
def prepare_and_send_bits(num_bits):
alice_bits = random.randint(0, 2, num_bits)
alice_bases = random.randint(0, 2, num_bits)
return alice_bits, alice_bases
def eavesdrop_and_measure(alice_bits, alice_bases, num_bits, eavesdropping_probability):
eaves_bits = zeros(num_bits, dtype=int)
eaves_bases = random.randint(0, 2, num_bits)
intercepted = (random.rand(num_bits) < eavesdropping_probability)
for i in range(num_bits):
if intercepted[i]:
if eaves_bases[i] == alice_bases[i]:
eaves_bits[i] = alice_bits[i]
else:
eaves_bits[i] = random.randint(0, 2)
return eaves_bits, eaves_bases, intercepted
def measure_bits(alice_bits, alice_bases, eaves_bits, intercepted, num_bits):
bob_bases = random.randint(0, 2, num_bits)
bob_bits = zeros(num_bits, dtype=int)
for i in range(num_bits):
if intercepted[i]:
photon = eaves_bits[i]
else:
photon = alice_bits[i]
if alice_bases[i] == bob_bases[i]:
bob_bits[i] = photon
else:
bob_bits[i] = random.randint(0, 2)
return bob_bits, bob_bases
def sift_bits(alice_bases, bob_bases, alice_bits, bob_bits):
print("Alice bases shape:", alice_bases.shape)
print("Bob bases shape:", bob_bases.shape)
matches = (alice_bases == bob_bases)
sifted_alice_bits = alice_bits[matches]
sifted_bob_bits = bob_bits[matches]
return sifted_alice_bits, sifted_bob_bits
def detect_eavesdropping(sifted_alice_bits, sifted_bob_bits):
check_bits = random.choice(len(sifted_alice_bits), size=len(sifted_alice_bits) // 2, replace=False)
errors = sum(sifted_alice_bits[check_bits] != sifted_bob_bits[check_bits])
error_rate = errors / len(check_bits)
return error_rate
main()
# Error correction?
# Simulation?
# Inter Device Connection? With
# Messaging and Payment?