-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathBB84QuantumProtocol.py
64 lines (50 loc) · 2.21 KB
/
BB84QuantumProtocol.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
import numpy as np
from qiskit import QuantumCircuit, Aer, execute
# Mensaje que queremos encriptar
message = np.array([1, 1, 0, 1, 1]) # El mensaje "11011"
num_bits = len(message) # El tamaño de la clave debe ser igual al del mensaje
# Paso 1: Alice genera una secuencia de bits y bases aleatorios
alice_bits = np.random.randint(2, size=num_bits)
alice_bases = np.random.randint(2, size=num_bits)
# Paso 2: Alice crea un circuito cuántico y prepara los qubits
qc = QuantumCircuit(num_bits, num_bits)
for i in range(num_bits):
if alice_bits[i] == 1:
qc.x(i)
if alice_bases[i] == 1:
qc.h(i)
# Bob elige aleatoriamente sus bases
bob_bases = np.random.randint(2, size=num_bits)
# Paso 3: Bob mide los qubits en sus bases
for i in range(num_bits):
if bob_bases[i] == 1:
qc.h(i)
qc.measure(range(num_bits), range(num_bits))
# Simulación de la medición
simulator = Aer.get_backend('qasm_simulator')
result = execute(qc, simulator, shots=1).result()
counts = result.get_counts()
# Convertir el resultado de la medición a un array de bits
# Puede haber más de un resultado, tomaremos el primero
measured_bits = list(counts.keys())[0]
bob_results = np.array([int(bit) for bit in measured_bits.zfill(num_bits)])
# Paso 4: Alice y Bob comparan las bases para obtener la clave compartida
matching_bases = alice_bases == bob_bases
# Usar los bits medidos de Bob para construir la clave compartida
shared_key = bob_results[matching_bases]
# Asegurarse de que la clave compartida tiene la longitud adecuada
shared_key = shared_key[:len(message)]
# Paso 5: Encriptar el mensaje usando XOR
encrypted_message = np.bitwise_xor(message, shared_key)
# Paso 6: Bob desencripta el mensaje usando la misma clave compartida
decrypted_message = np.bitwise_xor(encrypted_message, shared_key)
# Mostrar resultados
print("Mensaje original: ", message)
print("Bits de Alice: ", alice_bits)
print("Bases de Alice: ", alice_bases)
print("Bases de Bob: ", bob_bases)
print("Resultados de Bob: ", bob_results)
print("Bases que coinciden: ", matching_bases)
print("Clave compartida: ", shared_key)
print("Mensaje encriptado: ", encrypted_message)
print("Mensaje desencriptado: ", decrypted_message)