-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathBB84-quantum-protocol.py
113 lines (90 loc) · 3.14 KB
/
BB84-quantum-protocol.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
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
import random
Qbits = 2500
Done = False
def Keyexchange(Qbits):
CorrectBits = []
InCorrectBits = []
ServerBits = []
ServerEncrypters = []
ServerPrivateKey = []
ClientBits = []
ClientDecrypters = []
ClientPrivateKey = []
EavesCheckServerBitsPrepare = []
EavesCheckServerBits = []
EavesCheckClientBitsPrepare = []
EavesCheckClientBits = []
#generate Random Server Bits
for i in range(0,Qbits):
if random.randint(0, 1) == 0:
ServerEncrypters.append(0)
else:
ServerEncrypters.append(1)
if random.randint(0, 1) == 0:
ServerBits.append(0)
else:
ServerBits.append(1)
#
# Sends Qbits to client
#
for i in range(0,Qbits):
if random.randint(0, 1) == 0:
ClientDecrypters.append(0)
else:
ClientDecrypters.append(1)
if random.randint(0, 1) == 0:
if ServerEncrypters[i] == ClientDecrypters[i]:
ClientBits.append(ServerBits[i])
else:
ClientBits.append(random.randint(0, 1))
else:
if ServerEncrypters[i] == ClientDecrypters[i]:
ClientBits.append(ServerBits[i])
else:
ClientBits.append(random.randint(0, 1))
#
# Send ClientDecrypters to Server
#
for i in range(0, len(ServerEncrypters)):
if ServerEncrypters[i] == ClientDecrypters[i]:
ServerPrivateKey.append(ServerBits[i])
CorrectBits.append(1)
else:
CorrectBits.append(0)
InCorrectBits.append(i)
#
# Send CorrectBits from Server to Client
#
for i in range(0, len(CorrectBits)):
if CorrectBits[i] == 1:
ClientPrivateKey.append(ClientBits[i])
else:
ClientDecrypters[i] = (ClientDecrypters[i] + 1) % 2
#
# Check for Eavesdroppers from the Servers side
#
for i in range(0, len(InCorrectBits)):
EavesCheckServerBitsPrepare.append(InCorrectBits[i])
for i in range(0, len(EavesCheckServerBitsPrepare)):
EavesCheckServerBits.append((ServerPrivateKey[EavesCheckServerBitsPrepare[i]%len(ServerPrivateKey)] + 1) % 2)
#
# Send InCorrectBits to Client
#
for i in range(0, len(InCorrectBits)):
EavesCheckClientBitsPrepare.append(InCorrectBits[i])
for i in range(0, len(EavesCheckClientBitsPrepare)):
EavesCheckClientBits.append((ClientPrivateKey[EavesCheckServerBitsPrepare[i]%len(ClientPrivateKey)] + 1) % 2)
#
# Send EavesCheckClientBits to Server
#
return EavesCheckClientBits, EavesCheckServerBits
def main(Done):
while Done != True:
EavesCheckClientBits, EavesCheckServerBits = Keyexchange(Qbits)
if (EavesCheckClientBits == EavesCheckServerBits):
print("Key exchange complete!")
Done = True
else:
print("Eavesdropper! Trying again.")
if __name__ == "__main__":
main(Done)