quantum_crypto/
quantum_crypto.rs

1use quantrs2_ml::crypto::{ProtocolType, QuantumKeyDistribution, QuantumSignature, QSDC};
2use quantrs2_ml::prelude::*;
3use std::time::Instant;
4
5fn main() -> Result<()> {
6    println!("Quantum Cryptography Examples");
7    println!("============================");
8
9    // BB84 Quantum Key Distribution
10    run_bb84_example()?;
11
12    // E91 Protocol
13    run_e91_example()?;
14
15    // Quantum Digital Signatures
16    run_signature_example()?;
17
18    // Quantum Secure Direct Communication
19    run_qsdc_example()?;
20
21    // Quantum Blockchain Example
22    run_blockchain_example()?;
23
24    Ok(())
25}
26
27fn run_bb84_example() -> Result<()> {
28    println!("\nBB84 Quantum Key Distribution");
29    println!("----------------------------");
30
31    // Create BB84 QKD with 1000 qubits
32    let num_qubits = 1000;
33    println!("Creating BB84 protocol with {} qubits", num_qubits);
34    let mut qkd = QuantumKeyDistribution::new(ProtocolType::BB84, num_qubits);
35
36    // Optional: set error rate
37    qkd = qkd.with_error_rate(0.03);
38    println!("Simulated error rate: {:.1}%", qkd.error_rate * 100.0);
39
40    // Distribute key
41    println!("Performing quantum key distribution...");
42    let start = Instant::now();
43    let key_length = qkd.distribute_key()?;
44    println!("Key distribution completed in {:.2?}", start.elapsed());
45    println!("Final key length: {} bits", key_length);
46
47    // Verify keys match
48    println!("Verifying Alice and Bob have identical keys...");
49    if qkd.verify_keys() {
50        println!("✓ Key verification successful!");
51
52        // Display part of the key (first 8 bytes)
53        if let Some(key) = qkd.get_alice_key() {
54            println!("First 8 bytes of key: {:?}", &key[0..8.min(key.len())]);
55        }
56    } else {
57        println!("✗ Key verification failed!");
58    }
59
60    // Use the key for encryption
61    if let Some(key) = qkd.get_alice_key() {
62        let message = b"Hello, quantum world!";
63
64        println!(
65            "Encrypting message: '{}'",
66            std::str::from_utf8(message).unwrap()
67        );
68        let encrypted = quantrs2_ml::crypto::encrypt_with_qkd(message, key);
69
70        println!("Encrypted data: {:?}", &encrypted);
71
72        // Decrypt with Bob's key
73        if let Some(bob_key) = qkd.get_bob_key() {
74            let decrypted = quantrs2_ml::crypto::decrypt_with_qkd(&encrypted, bob_key);
75            println!(
76                "Decrypted message: '{}'",
77                std::str::from_utf8(&decrypted).unwrap()
78            );
79        }
80    }
81
82    Ok(())
83}
84
85fn run_e91_example() -> Result<()> {
86    println!("\nE91 Entanglement-Based Protocol");
87    println!("------------------------------");
88
89    // Create E91 QKD with 800 qubits
90    let num_qubits = 800;
91    println!("Creating E91 protocol with {} qubits", num_qubits);
92    let mut qkd = QuantumKeyDistribution::new(ProtocolType::E91, num_qubits);
93
94    // Set error rate
95    qkd = qkd.with_error_rate(0.02);
96    println!("Simulated error rate: {:.1}%", qkd.error_rate * 100.0);
97
98    // Distribute key
99    println!("Performing quantum key distribution with entangled pairs...");
100    let start = Instant::now();
101    let key_length = qkd.distribute_key()?;
102    println!("Key distribution completed in {:.2?}", start.elapsed());
103    println!("Final key length: {} bits", key_length);
104
105    // Verify keys match
106    println!("Verifying Alice and Bob have identical keys...");
107    if qkd.verify_keys() {
108        println!("✓ Key verification successful!");
109
110        // Display part of the key
111        if let Some(key) = qkd.get_alice_key() {
112            println!("First 8 bytes of key: {:?}", &key[0..8.min(key.len())]);
113        }
114    } else {
115        println!("✗ Key verification failed!");
116    }
117
118    Ok(())
119}
120
121fn run_signature_example() -> Result<()> {
122    println!("\nQuantum Digital Signatures");
123    println!("-------------------------");
124
125    // Create quantum signature with 256 qubits
126    let num_qubits = 256;
127    println!(
128        "Creating quantum signature scheme with {} qubits",
129        num_qubits
130    );
131
132    // Choose a quantum-resistant algorithm
133    let algorithm = "Dilithium";
134    println!("Using algorithm: {}", algorithm);
135
136    let signature = QuantumSignature::new(num_qubits, algorithm)?;
137    println!("Quantum signature scheme created");
138
139    // Sign a message
140    let message = b"This message is quantum-signed";
141    println!(
142        "Signing message: '{}'",
143        std::str::from_utf8(message).unwrap()
144    );
145
146    let start = Instant::now();
147    let sig = signature.sign(message)?;
148    println!("Signature generated in {:.2?}", start.elapsed());
149    println!("Signature size: {} bytes", sig.len());
150
151    // Verify signature
152    println!("Verifying signature...");
153    let start = Instant::now();
154    let is_valid = signature.verify(message, &sig)?;
155    println!("Verification completed in {:.2?}", start.elapsed());
156
157    if is_valid {
158        println!("✓ Signature verification successful!");
159    } else {
160        println!("✗ Signature verification failed!");
161    }
162
163    // Try with tampered message
164    let tampered = b"This message has been modified";
165    println!("Verifying signature with tampered message...");
166    let is_valid = signature.verify(tampered, &sig)?;
167
168    if is_valid {
169        println!("✗ Signature incorrectly verified on tampered message!");
170    } else {
171        println!("✓ Signature correctly rejected tampered message!");
172    }
173
174    Ok(())
175}
176
177fn run_qsdc_example() -> Result<()> {
178    println!("\nQuantum Secure Direct Communication");
179    println!("---------------------------------");
180
181    // Create QSDC protocol with 1000 qubits
182    let num_qubits = 1000;
183    println!("Creating QSDC protocol with {} qubits", num_qubits);
184    let qsdc = QSDC::new(num_qubits);
185
186    // Transmit message directly
187    let message = b"This message is sent directly using quantum channel";
188    println!(
189        "Message to transmit: '{}'",
190        std::str::from_utf8(message).unwrap()
191    );
192
193    let start = Instant::now();
194    let received = qsdc.transmit_message(message)?;
195    println!("Transmission completed in {:.2?}", start.elapsed());
196
197    println!(
198        "Received message: '{}'",
199        std::str::from_utf8(&received).unwrap()
200    );
201
202    // Check for errors
203    let errors = message
204        .iter()
205        .zip(received.iter())
206        .filter(|(&a, &b)| a != b)
207        .count();
208
209    println!(
210        "Bit error rate: {:.2}%",
211        (errors as f64) / (message.len() as f64) * 100.0
212    );
213
214    Ok(())
215}
216
217fn run_blockchain_example() -> Result<()> {
218    println!("\nQuantum Blockchain Example");
219    println!("-------------------------");
220
221    use quantrs2_ml::blockchain::{ConsensusType, QuantumBlockchain, Transaction};
222
223    // Create a quantum blockchain
224    let difficulty = 2; // 2 leading zeros required for mining
225    println!("Creating quantum blockchain with difficulty {}", difficulty);
226    let mut blockchain = QuantumBlockchain::new(ConsensusType::QuantumProofOfWork, difficulty);
227
228    // Create a transaction
229    let sender = vec![1, 2, 3, 4];
230    let recipient = vec![5, 6, 7, 8];
231    let amount = 100.0;
232
233    println!(
234        "Creating transaction: {} sends {} units to recipient",
235        sender
236            .iter()
237            .map(|&b| b.to_string())
238            .collect::<Vec<_>>()
239            .join(""),
240        amount
241    );
242
243    let transaction = Transaction::new(sender.clone(), recipient.clone(), amount, Vec::new());
244
245    // Add transaction
246    println!("Adding transaction to blockchain...");
247    blockchain.add_transaction(transaction)?;
248
249    // Mine a block
250    println!("Mining new block...");
251    let start = Instant::now();
252    let block = blockchain.mine_block()?;
253    println!("Block mined in {:.2?}", start.elapsed());
254
255    println!(
256        "Block hash: {:02x?}",
257        &block.hash[0..8.min(block.hash.len())]
258    );
259    println!("Blockchain length: {}", blockchain.chain.len());
260
261    // Verify blockchain
262    println!("Verifying blockchain integrity...");
263    let is_valid = blockchain.verify_chain()?;
264
265    if is_valid {
266        println!("✓ Blockchain verification successful!");
267    } else {
268        println!("✗ Blockchain verification failed!");
269    }
270
271    Ok(())
272}