1use crate::error::QuantRS2Error;
6use scirs2_core::Complex64;
9use scirs2_core::ndarray::{Array1, Array2};
11use std::f64::consts::PI;
13use scirs2_core::random::ChaCha20Rng;
15use scirs2_core::random::{Rng, SeedableRng};
16
17#[derive(Debug, Clone)]
19pub struct QuantumHashFunction {
20 pub num_qubits: usize,
21 pub hash_size: usize,
22 pub compression_function: CompressionFunction,
23 pub quantum_circuit: Array2<Complex64>,
24}
25
26#[derive(Debug, Clone)]
27pub enum CompressionFunction {
28 QuantumSponge { rate: usize, capacity: usize },
29 QuantumMerkleTree { depth: usize, arity: usize },
30 QuantumGrover { iterations: usize },
31}
32
33impl QuantumHashFunction {
34 pub fn new(
36 num_qubits: usize,
37 hash_size: usize,
38 compression_function: CompressionFunction,
39 ) -> Result<Self, QuantRS2Error> {
40 let quantum_circuit = Self::build_hash_circuit(num_qubits, &compression_function)?;
41
42 Ok(Self {
43 num_qubits,
44 hash_size,
45 compression_function,
46 quantum_circuit,
47 })
48 }
49
50 fn build_hash_circuit(
52 num_qubits: usize,
53 compression_function: &CompressionFunction,
54 ) -> Result<Array2<Complex64>, QuantRS2Error> {
55 let _dim = 2_usize.pow(num_qubits as u32);
56 let circuit = match compression_function {
57 CompressionFunction::QuantumSponge { rate, capacity } => {
58 Self::build_sponge_circuit(num_qubits, *rate, *capacity)?
59 }
60 CompressionFunction::QuantumMerkleTree { depth, arity } => {
61 Self::build_merkle_circuit(num_qubits, *depth, *arity)?
62 }
63 CompressionFunction::QuantumGrover { iterations } => {
64 Self::build_grover_circuit(num_qubits, *iterations)?
65 }
66 };
67
68 Ok(circuit)
69 }
70
71 fn build_sponge_circuit(
73 num_qubits: usize,
74 rate: usize,
75 capacity: usize,
76 ) -> Result<Array2<Complex64>, QuantRS2Error> {
77 if rate + capacity != num_qubits {
78 return Err(QuantRS2Error::InvalidParameter(
79 "Rate + capacity must equal number of qubits".to_string(),
80 ));
81 }
82
83 let dim = 2_usize.pow(num_qubits as u32);
84 let mut circuit = Array2::eye(dim);
85
86 for round in 0..3 {
88 circuit = circuit.dot(&Self::create_absorption_layer(num_qubits, rate)?);
90
91 circuit = circuit.dot(&Self::create_permutation_layer(num_qubits, round)?);
93 }
94
95 circuit = circuit.dot(&Self::create_squeezing_layer(num_qubits, capacity)?);
97
98 Ok(circuit)
99 }
100
101 fn build_merkle_circuit(
103 num_qubits: usize,
104 depth: usize,
105 arity: usize,
106 ) -> Result<Array2<Complex64>, QuantRS2Error> {
107 let dim = 2_usize.pow(num_qubits as u32);
108 let mut circuit = Array2::eye(dim);
109
110 for level in 0..depth {
112 let nodes_at_level = arity.pow(level as u32);
113
114 for _node in 0..nodes_at_level {
115 let compression_circuit = Self::create_compression_node(num_qubits, arity)?;
116 circuit = circuit.dot(&compression_circuit);
117 }
118 }
119
120 Ok(circuit)
121 }
122
123 fn build_grover_circuit(
125 num_qubits: usize,
126 iterations: usize,
127 ) -> Result<Array2<Complex64>, QuantRS2Error> {
128 let dim = 2_usize.pow(num_qubits as u32);
129 let mut circuit = Array2::eye(dim);
130
131 circuit = circuit.dot(&Self::create_hadamard_layer(num_qubits)?);
133
134 for _ in 0..iterations {
136 circuit = circuit.dot(&Self::create_oracle_layer(num_qubits)?);
138
139 circuit = circuit.dot(&Self::create_diffusion_layer(num_qubits)?);
141 }
142
143 Ok(circuit)
144 }
145
146 fn create_absorption_layer(
148 num_qubits: usize,
149 rate: usize,
150 ) -> Result<Array2<Complex64>, QuantRS2Error> {
151 let dim = 2_usize.pow(num_qubits as u32);
152 let mut layer = Array2::eye(dim);
153
154 for i in 0..rate {
156 let angle = PI / (i + 1) as f64;
157 let rotation = Self::ry_gate(angle);
158 layer = Self::apply_single_qubit_gate(&layer, &rotation, i, num_qubits)?;
159 }
160
161 Ok(layer)
162 }
163
164 fn create_permutation_layer(
166 num_qubits: usize,
167 round: usize,
168 ) -> Result<Array2<Complex64>, QuantRS2Error> {
169 let dim = 2_usize.pow(num_qubits as u32);
170 let mut layer = Array2::eye(dim);
171
172 for i in 0..num_qubits - 1 {
174 let target = (i + round + 1) % num_qubits;
175 let cnot = Self::cnot_gate();
176 layer = Self::apply_two_qubit_gate(&layer, &cnot, i, target, num_qubits)?;
177 }
178
179 Ok(layer)
180 }
181
182 fn create_squeezing_layer(
184 num_qubits: usize,
185 capacity: usize,
186 ) -> Result<Array2<Complex64>, QuantRS2Error> {
187 let dim = 2_usize.pow(num_qubits as u32);
188 let mut layer = Array2::eye(dim);
189
190 let start_qubit = num_qubits - capacity;
192 for i in start_qubit..num_qubits {
193 let measurement_basis = Self::create_measurement_basis(i as f64);
194 layer = Self::apply_single_qubit_gate(&layer, &measurement_basis, i, num_qubits)?;
195 }
196
197 Ok(layer)
198 }
199
200 fn create_compression_node(
202 num_qubits: usize,
203 arity: usize,
204 ) -> Result<Array2<Complex64>, QuantRS2Error> {
205 let dim = 2_usize.pow(num_qubits as u32);
206 let mut node = Array2::eye(dim);
207
208 let qubits_per_input = num_qubits / arity;
210
211 for group in 0..arity {
212 let start_qubit = group * qubits_per_input;
213 for i in 0..qubits_per_input - 1 {
214 let cnot = Self::cnot_gate();
215 node = Self::apply_two_qubit_gate(
216 &node,
217 &cnot,
218 start_qubit + i,
219 start_qubit + i + 1,
220 num_qubits,
221 )?;
222 }
223 }
224
225 Ok(node)
226 }
227
228 fn create_hadamard_layer(num_qubits: usize) -> Result<Array2<Complex64>, QuantRS2Error> {
230 let dim = 2_usize.pow(num_qubits as u32);
231 let mut layer = Array2::eye(dim);
232
233 let hadamard = Self::hadamard_gate();
234 for i in 0..num_qubits {
235 layer = Self::apply_single_qubit_gate(&layer, &hadamard, i, num_qubits)?;
236 }
237
238 Ok(layer)
239 }
240
241 fn create_oracle_layer(num_qubits: usize) -> Result<Array2<Complex64>, QuantRS2Error> {
243 let dim = 2_usize.pow(num_qubits as u32);
244 let mut oracle = Array2::eye(dim);
245
246 let target_index = dim - 1;
248 oracle[[target_index, target_index]] = Complex64::new(-1.0, 0.0);
249
250 Ok(oracle)
251 }
252
253 fn create_diffusion_layer(num_qubits: usize) -> Result<Array2<Complex64>, QuantRS2Error> {
255 let dim = 2_usize.pow(num_qubits as u32);
256 let mut diffusion = Array2::eye(dim);
257
258 let coeff = 2.0 / (dim as f64);
260 for i in 0..dim {
261 for j in 0..dim {
262 if i == j {
263 diffusion[[i, j]] = Complex64::new(coeff - 1.0, 0.0);
264 } else {
265 diffusion[[i, j]] = Complex64::new(coeff, 0.0);
266 }
267 }
268 }
269
270 Ok(diffusion)
271 }
272
273 pub fn hash(&self, input: &[u8]) -> Result<Vec<u8>, QuantRS2Error> {
275 let input_state = self.classical_to_quantum(input)?;
277
278 let output_state = self.quantum_circuit.dot(&input_state);
280
281 self.quantum_to_classical(&output_state)
283 }
284
285 fn classical_to_quantum(&self, input: &[u8]) -> Result<Array1<Complex64>, QuantRS2Error> {
287 let dim = 2_usize.pow(self.num_qubits as u32);
288 let mut state = Array1::zeros(dim);
289
290 let input_bits = self.bytes_to_bits(input);
292 let effective_bits = input_bits.len().min(self.num_qubits);
293
294 for i in 0..effective_bits {
296 if input_bits[i] {
297 let basis_state = 1 << i;
298 if basis_state < dim {
299 state[basis_state] = Complex64::new(1.0, 0.0);
300 }
301 }
302 }
303
304 let norm = state.dot(&state.mapv(|x| x.conj())).norm();
306 if norm > 0.0 {
307 state = state / norm;
308 } else {
309 state[0] = Complex64::new(1.0, 0.0); }
311
312 Ok(state)
313 }
314
315 fn quantum_to_classical(&self, state: &Array1<Complex64>) -> Result<Vec<u8>, QuantRS2Error> {
317 let probabilities: Vec<f64> = state.iter().map(|amp| amp.norm_sqr()).collect();
318
319 let mut hash_bits = Vec::new();
321 for (i, &prob) in probabilities.iter().enumerate() {
322 if prob > 0.5 {
323 hash_bits.push(i % 2 == 1);
324 }
325 }
326
327 hash_bits.resize(self.hash_size * 8, false);
329
330 Ok(self.bits_to_bytes(&hash_bits))
331 }
332
333 fn bytes_to_bits(&self, bytes: &[u8]) -> Vec<bool> {
335 bytes
336 .iter()
337 .flat_map(|&byte| (0..8).map(move |i| (byte >> i) & 1 == 1))
338 .collect()
339 }
340
341 fn bits_to_bytes(&self, bits: &[bool]) -> Vec<u8> {
343 bits.chunks(8)
344 .map(|chunk| {
345 chunk.iter().enumerate().fold(
346 0u8,
347 |acc, (i, &bit)| {
348 if bit {
349 acc | (1 << i)
350 } else {
351 acc
352 }
353 },
354 )
355 })
356 .collect()
357 }
358
359 fn ry_gate(angle: f64) -> Array2<Complex64> {
361 let cos_half = (angle / 2.0).cos();
362 let sin_half = (angle / 2.0).sin();
363
364 scirs2_core::ndarray::array![
365 [
366 Complex64::new(cos_half, 0.0),
367 Complex64::new(-sin_half, 0.0)
368 ],
369 [Complex64::new(sin_half, 0.0), Complex64::new(cos_half, 0.0)]
370 ]
371 }
372
373 fn cnot_gate() -> Array2<Complex64> {
374 scirs2_core::ndarray::array![
375 [
376 Complex64::new(1.0, 0.0),
377 Complex64::new(0.0, 0.0),
378 Complex64::new(0.0, 0.0),
379 Complex64::new(0.0, 0.0)
380 ],
381 [
382 Complex64::new(0.0, 0.0),
383 Complex64::new(1.0, 0.0),
384 Complex64::new(0.0, 0.0),
385 Complex64::new(0.0, 0.0)
386 ],
387 [
388 Complex64::new(0.0, 0.0),
389 Complex64::new(0.0, 0.0),
390 Complex64::new(0.0, 0.0),
391 Complex64::new(1.0, 0.0)
392 ],
393 [
394 Complex64::new(0.0, 0.0),
395 Complex64::new(0.0, 0.0),
396 Complex64::new(1.0, 0.0),
397 Complex64::new(0.0, 0.0)
398 ]
399 ]
400 }
401
402 fn hadamard_gate() -> Array2<Complex64> {
403 let inv_sqrt2 = 1.0 / 2.0_f64.sqrt();
404 scirs2_core::ndarray::array![
405 [
406 Complex64::new(inv_sqrt2, 0.0),
407 Complex64::new(inv_sqrt2, 0.0)
408 ],
409 [
410 Complex64::new(inv_sqrt2, 0.0),
411 Complex64::new(-inv_sqrt2, 0.0)
412 ]
413 ]
414 }
415
416 fn create_measurement_basis(phase: f64) -> Array2<Complex64> {
417 let exp_phase = Complex64::from_polar(1.0, phase);
418 scirs2_core::ndarray::array![
419 [Complex64::new(1.0, 0.0), Complex64::new(0.0, 0.0)],
420 [Complex64::new(0.0, 0.0), exp_phase]
421 ]
422 }
423
424 fn apply_single_qubit_gate(
426 circuit: &Array2<Complex64>,
427 gate: &Array2<Complex64>,
428 target_qubit: usize,
429 num_qubits: usize,
430 ) -> Result<Array2<Complex64>, QuantRS2Error> {
431 let dim = 2_usize.pow(num_qubits as u32);
433 let mut full_gate = Array2::eye(dim);
434
435 for i in 0..dim {
438 let target_bit = (i >> target_qubit) & 1;
439 if target_bit == 0 {
440 let j = i | (1 << target_qubit);
442 if j < dim {
443 full_gate[[i, i]] = gate[[0, 0]];
444 full_gate[[j, i]] = gate[[1, 0]];
445 }
446 } else {
447 let j = i & !(1 << target_qubit);
449 if j < dim {
450 full_gate[[j, i]] = gate[[0, 1]];
451 full_gate[[i, i]] = gate[[1, 1]];
452 }
453 }
454 }
455
456 Ok(circuit.dot(&full_gate))
457 }
458
459 fn apply_two_qubit_gate(
461 circuit: &Array2<Complex64>,
462 gate: &Array2<Complex64>,
463 control: usize,
464 target: usize,
465 num_qubits: usize,
466 ) -> Result<Array2<Complex64>, QuantRS2Error> {
467 let dim = 2_usize.pow(num_qubits as u32);
469 let mut full_gate = Array2::eye(dim);
470
471 for i in 0..dim {
474 let control_bit = (i >> control) & 1;
475 let target_bit = (i >> target) & 1;
476 let two_qubit_state = (control_bit << 1) | target_bit;
477
478 if two_qubit_state < 4 {
480 for j in 0..4 {
481 let new_control = (j >> 1) & 1;
482 let new_target = j & 1;
483 let new_i = (i & !((1 << control) | (1 << target)))
484 | (new_control << control)
485 | (new_target << target);
486 if new_i < dim {
487 full_gate[[new_i, i]] = gate[[j, two_qubit_state]];
488 }
489 }
490 }
491 }
492
493 Ok(circuit.dot(&full_gate))
494 }
495}
496
497#[derive(Debug, Clone)]
499pub struct QuantumDigitalSignature {
500 pub public_key: Array2<Complex64>,
501 pub private_key: Array1<Complex64>,
502 pub signature_length: usize,
503 pub security_parameter: usize,
504}
505
506impl QuantumDigitalSignature {
507 pub fn new(signature_length: usize, security_parameter: usize) -> Result<Self, QuantRS2Error> {
509 let (public_key, private_key) =
510 Self::generate_key_pair(signature_length, security_parameter)?;
511
512 Ok(Self {
513 public_key,
514 private_key,
515 signature_length,
516 security_parameter,
517 })
518 }
519
520 fn generate_key_pair(
522 signature_length: usize,
523 security_parameter: usize,
524 ) -> Result<(Array2<Complex64>, Array1<Complex64>), QuantRS2Error> {
525 let mut rng = ChaCha20Rng::from_seed([0u8; 32]); let private_key = Array1::from_shape_fn(signature_length, |_| {
529 Complex64::new(rng.random_range(-1.0..1.0), rng.random_range(-1.0..1.0))
530 });
531
532 let public_key = Self::quantum_one_way_function(&private_key, security_parameter)?;
534
535 Ok((public_key, private_key))
536 }
537
538 fn quantum_one_way_function(
540 private_key: &Array1<Complex64>,
541 security_parameter: usize,
542 ) -> Result<Array2<Complex64>, QuantRS2Error> {
543 let n = private_key.len();
544 let mut public_key = Array2::eye(n);
545
546 for (i, &key_element) in private_key.iter().enumerate() {
548 let angle = key_element.arg() * (security_parameter as f64);
549 let quantum_gate = Self::parameterized_quantum_gate(angle, i, n)?;
550 public_key = public_key.dot(&quantum_gate);
551 }
552
553 Ok(public_key)
554 }
555
556 fn parameterized_quantum_gate(
558 angle: f64,
559 index: usize,
560 matrix_size: usize,
561 ) -> Result<Array2<Complex64>, QuantRS2Error> {
562 let cos_val = angle.cos();
563 let sin_val = angle.sin();
564 let phase = Complex64::from_polar(1.0, (index as f64) * PI / 4.0);
565
566 let mut gate = Array2::eye(matrix_size);
568
569 let i = index % matrix_size;
571 let j = (index + 1) % matrix_size;
572
573 gate[[i, i]] = Complex64::new(cos_val, 0.0);
575 gate[[i, j]] = Complex64::new(-sin_val, 0.0) * phase;
576 gate[[j, i]] = Complex64::new(sin_val, 0.0) * phase.conj();
577 gate[[j, j]] = Complex64::new(cos_val, 0.0);
578
579 Ok(gate)
580 }
581
582 pub fn sign(&self, message: &Array1<Complex64>) -> Result<QuantumSignature, QuantRS2Error> {
584 let num_qubits = (message.len().next_power_of_two().trailing_zeros() as usize).max(8);
586 let hash_function = QuantumHashFunction::new(
587 num_qubits,
588 self.signature_length / 8,
589 CompressionFunction::QuantumSponge {
590 rate: 4,
591 capacity: 4,
592 },
593 )?;
594
595 let message_bytes = self.quantum_state_to_bytes(message)?;
596 let message_hash = hash_function.hash(&message_bytes)?;
597
598 let signature_state = self.create_signature_state(&message_hash)?;
600
601 Ok(QuantumSignature {
602 signature_state,
603 message_hash,
604 timestamp: std::time::SystemTime::now(),
605 })
606 }
607
608 fn create_signature_state(
610 &self,
611 message_hash: &[u8],
612 ) -> Result<Array1<Complex64>, QuantRS2Error> {
613 let hash_bits = self.bytes_to_bits(message_hash);
614 let mut signature_state = Array1::zeros(self.signature_length);
615
616 for (i, &bit) in hash_bits.iter().enumerate() {
618 if i < self.signature_length {
619 if bit {
620 signature_state[i] = self.private_key[i % self.private_key.len()];
621 } else {
622 signature_state[i] = self.private_key[i % self.private_key.len()].conj();
623 }
624 }
625 }
626
627 let norm = signature_state
629 .dot(&signature_state.mapv(|x| x.conj()))
630 .norm();
631 if norm > 0.0 {
632 signature_state = signature_state / norm;
633 }
634
635 Ok(signature_state)
636 }
637
638 pub fn verify(
640 &self,
641 message: &Array1<Complex64>,
642 signature: &QuantumSignature,
643 ) -> Result<bool, QuantRS2Error> {
644 let num_qubits = (message.len().next_power_of_two().trailing_zeros() as usize).max(8);
646 let hash_function = QuantumHashFunction::new(
647 num_qubits,
648 self.signature_length / 8,
649 CompressionFunction::QuantumSponge {
650 rate: 4,
651 capacity: 4,
652 },
653 )?;
654
655 let message_bytes = self.quantum_state_to_bytes(message)?;
656 let computed_hash = hash_function.hash(&message_bytes)?;
657
658 if computed_hash != signature.message_hash {
660 return Ok(false);
661 }
662
663 let verification_result =
665 self.quantum_signature_verification(&signature.signature_state)?;
666
667 Ok(verification_result)
668 }
669
670 fn quantum_signature_verification(
672 &self,
673 signature_state: &Array1<Complex64>,
674 ) -> Result<bool, QuantRS2Error> {
675 let transformed_state = self.public_key.dot(signature_state);
677
678 let verification_observable = self.create_verification_observable()?;
680 let expectation = transformed_state
681 .t()
682 .dot(&verification_observable.dot(&transformed_state));
683
684 Ok(expectation.re > 0.5)
686 }
687
688 fn create_verification_observable(&self) -> Result<Array2<Complex64>, QuantRS2Error> {
690 let n = self.signature_length;
691 let mut observable = Array2::zeros((n, n));
692
693 for i in 0..n {
695 observable[[i, i]] = Complex64::new(1.0, 0.0);
696 if i > 0 {
697 observable[[i, i - 1]] = Complex64::new(0.5, 0.0);
698 observable[[i - 1, i]] = Complex64::new(0.5, 0.0);
699 }
700 }
701
702 Ok(observable)
703 }
704
705 fn quantum_state_to_bytes(&self, state: &Array1<Complex64>) -> Result<Vec<u8>, QuantRS2Error> {
707 let bits: Vec<bool> = state.iter().map(|amp| amp.norm_sqr() > 0.5).collect();
708 Ok(self.bits_to_bytes(&bits))
709 }
710
711 fn bytes_to_bits(&self, bytes: &[u8]) -> Vec<bool> {
712 bytes
713 .iter()
714 .flat_map(|&byte| (0..8).map(move |i| (byte >> i) & 1 == 1))
715 .collect()
716 }
717
718 fn bits_to_bytes(&self, bits: &[bool]) -> Vec<u8> {
719 bits.chunks(8)
720 .map(|chunk| {
721 chunk.iter().enumerate().fold(
722 0u8,
723 |acc, (i, &bit)| {
724 if bit {
725 acc | (1 << i)
726 } else {
727 acc
728 }
729 },
730 )
731 })
732 .collect()
733 }
734}
735
736#[derive(Debug, Clone)]
738pub struct QuantumSignature {
739 pub signature_state: Array1<Complex64>,
740 pub message_hash: Vec<u8>,
741 pub timestamp: std::time::SystemTime,
742}
743
744#[derive(Debug, Clone)]
746pub struct QuantumKeyDistribution {
747 pub protocol_type: QKDProtocol,
748 pub key_length: usize,
749 pub security_parameter: f64,
750 pub noise_threshold: f64,
751}
752
753#[derive(Debug, Clone)]
754pub enum QKDProtocol {
755 BB84,
756 E91,
757 SARG04,
758 COW,
759}
760
761impl QuantumKeyDistribution {
762 pub fn new(protocol_type: QKDProtocol, key_length: usize, security_parameter: f64) -> Self {
764 Self {
765 protocol_type,
766 key_length,
767 security_parameter,
768 noise_threshold: 0.11, }
770 }
771
772 pub fn distribute_key(&self) -> Result<QKDResult, QuantRS2Error> {
774 match self.protocol_type {
775 QKDProtocol::BB84 => self.execute_bb84(),
776 QKDProtocol::E91 => self.execute_e91(),
777 QKDProtocol::SARG04 => self.execute_sarg04(),
778 QKDProtocol::COW => self.execute_cow(),
779 }
780 }
781
782 fn execute_bb84(&self) -> Result<QKDResult, QuantRS2Error> {
784 let mut rng = ChaCha20Rng::from_seed([0u8; 32]); let alice_bits: Vec<bool> = (0..self.key_length * 2).map(|_| rng.random()).collect();
788 let alice_bases: Vec<bool> = (0..self.key_length * 2).map(|_| rng.random()).collect();
789
790 let bob_bases: Vec<bool> = (0..self.key_length * 2).map(|_| rng.random()).collect();
792
793 let mut sifted_key = Vec::new();
795 let mut qber_errors = 0;
796 let total_bits = alice_bits.len();
797
798 for i in 0..total_bits {
799 let quantum_state = self.prepare_bb84_state(alice_bits[i], alice_bases[i])?;
801
802 let noisy_state = self.apply_channel_noise(&quantum_state)?;
804
805 let (measurement_result, measurement_success) =
807 self.measure_bb84_state(&noisy_state, bob_bases[i])?;
808
809 if alice_bases[i] == bob_bases[i] && measurement_success {
811 sifted_key.push(measurement_result);
812
813 if measurement_result != alice_bits[i] {
815 qber_errors += 1;
816 }
817 }
818 }
819
820 let qber = if sifted_key.is_empty() {
821 0.0
822 } else {
823 qber_errors as f64 / sifted_key.len() as f64
824 };
825
826 if sifted_key.is_empty() {
827 return Err(QuantRS2Error::QKDFailure(
828 "No sifted key bits available".to_string(),
829 ));
830 }
831
832 if qber > self.noise_threshold {
833 return Err(QuantRS2Error::QKDFailure(format!(
834 "QBER {} exceeds threshold {}",
835 qber, self.noise_threshold
836 )));
837 }
838
839 let final_key = self.privacy_amplification(&sifted_key, qber)?;
841
842 Ok(QKDResult {
843 shared_key: final_key,
844 qber,
845 key_rate: sifted_key.len() as f64 / total_bits as f64,
846 security_parameter: self.security_parameter,
847 })
848 }
849
850 fn prepare_bb84_state(
852 &self,
853 bit: bool,
854 basis: bool,
855 ) -> Result<Array1<Complex64>, QuantRS2Error> {
856 match (bit, basis) {
857 (false, false) => Ok(scirs2_core::ndarray::array![
858 Complex64::new(1.0, 0.0),
859 Complex64::new(0.0, 0.0)
860 ]), (true, false) => Ok(scirs2_core::ndarray::array![
862 Complex64::new(0.0, 0.0),
863 Complex64::new(1.0, 0.0)
864 ]), (false, true) => Ok(scirs2_core::ndarray::array![
866 Complex64::new(1.0 / 2.0_f64.sqrt(), 0.0),
867 Complex64::new(1.0 / 2.0_f64.sqrt(), 0.0)
868 ]), (true, true) => Ok(scirs2_core::ndarray::array![
870 Complex64::new(1.0 / 2.0_f64.sqrt(), 0.0),
871 Complex64::new(-1.0 / 2.0_f64.sqrt(), 0.0)
872 ]), }
874 }
875
876 fn measure_bb84_state(
878 &self,
879 state: &Array1<Complex64>,
880 basis: bool,
881 ) -> Result<(bool, bool), QuantRS2Error> {
882 let mut rng = ChaCha20Rng::from_seed([42u8; 32]); if basis {
885 let x_plus_amplitude = (state[0] + state[1]) / 2.0_f64.sqrt();
888 let prob_plus = x_plus_amplitude.norm_sqr();
889 let measurement = rng.random::<f64>() < prob_plus;
890 Ok((!measurement, true)) } else {
892 let prob_zero = state[0].norm_sqr();
894 let measurement = rng.random::<f64>() < prob_zero;
895 Ok((!measurement, true)) }
897 }
898
899 fn execute_e91(&self) -> Result<QKDResult, QuantRS2Error> {
901 let mut rng = ChaCha20Rng::from_seed([0u8; 32]); let mut shared_key = Vec::new();
904
905 for _ in 0..self.key_length {
906 let entangled_state = self.create_bell_state()?;
908
909 let alice_basis = rng.random_range(0..3);
911 let bob_basis = rng.random_range(0..3);
912
913 let alice_result = self.measure_entangled_qubit(&entangled_state, alice_basis, 0)?;
915 let bob_result = self.measure_entangled_qubit(&entangled_state, bob_basis, 1)?;
916
917 let _correlation = if alice_result == bob_result {
919 1.0
920 } else {
921 -1.0
922 };
923
924 if alice_basis == bob_basis {
926 shared_key.push(if alice_result { 1 } else { 0 });
927 }
928 }
929
930 Ok(QKDResult {
931 shared_key,
932 qber: 0.01, key_rate: 0.5,
934 security_parameter: self.security_parameter,
935 })
936 }
937
938 fn execute_sarg04(&self) -> Result<QKDResult, QuantRS2Error> {
940 let bb84_result = self.execute_bb84()?;
942
943 Ok(bb84_result)
945 }
946
947 fn execute_cow(&self) -> Result<QKDResult, QuantRS2Error> {
949 let mut rng = ChaCha20Rng::from_seed([0u8; 32]); let mut shared_key = Vec::new();
952
953 for _ in 0..self.key_length {
954 let bit = rng.random::<bool>();
956 let coherent_state = self.prepare_coherent_state(bit)?;
957
958 let measurement_result = self.measure_coherent_state(&coherent_state)?;
960
961 shared_key.push(if measurement_result { 1 } else { 0 });
962 }
963
964 Ok(QKDResult {
965 shared_key,
966 qber: 0.05,
967 key_rate: 0.8,
968 security_parameter: self.security_parameter,
969 })
970 }
971
972 fn create_bell_state(&self) -> Result<Array1<Complex64>, QuantRS2Error> {
974 Ok(scirs2_core::ndarray::array![
976 Complex64::new(1.0 / 2.0_f64.sqrt(), 0.0),
977 Complex64::new(0.0, 0.0),
978 Complex64::new(0.0, 0.0),
979 Complex64::new(1.0 / 2.0_f64.sqrt(), 0.0)
980 ])
981 }
982
983 fn measure_entangled_qubit(
985 &self,
986 _state: &Array1<Complex64>,
987 _basis: usize,
988 _qubit: usize,
989 ) -> Result<bool, QuantRS2Error> {
990 let mut rng = ChaCha20Rng::from_seed([0u8; 32]); Ok(rng.random())
992 }
993
994 fn prepare_coherent_state(&self, bit: bool) -> Result<Array1<Complex64>, QuantRS2Error> {
996 let alpha: f64 = if bit { 1.0 } else { -1.0 };
997
998 Ok(scirs2_core::ndarray::array![
1000 Complex64::new((-alpha.powi(2) / 2.0).exp() * alpha, 0.0),
1001 Complex64::new((-alpha.powi(2) / 2.0).exp(), 0.0)
1002 ])
1003 }
1004
1005 fn measure_coherent_state(&self, _state: &Array1<Complex64>) -> Result<bool, QuantRS2Error> {
1007 let mut rng = ChaCha20Rng::from_seed([0u8; 32]); Ok(rng.random())
1009 }
1010
1011 fn apply_channel_noise(
1013 &self,
1014 state: &Array1<Complex64>,
1015 ) -> Result<Array1<Complex64>, QuantRS2Error> {
1016 let mut rng = ChaCha20Rng::from_seed([0u8; 32]); let noise_level = 0.02; let mut noisy_state = state.clone();
1020 if rng.random::<f64>() < noise_level {
1021 noisy_state = scirs2_core::ndarray::array![state[1], state[0]];
1023 }
1024
1025 Ok(noisy_state)
1026 }
1027
1028 fn privacy_amplification(&self, key: &[bool], qber: f64) -> Result<Vec<u8>, QuantRS2Error> {
1030 let entropy_loss = if qber > 0.0 && qber < 1.0 {
1032 2.0 * qber * (qber.log2() + (1.0 - qber).log2())
1033 } else {
1034 0.5 };
1036 let final_length = ((key.len() as f64) * (1.0 - entropy_loss.abs())).max(1.0) as usize;
1037
1038 let key_bytes = self.bits_to_bytes(key);
1039 let mut hash_result = Vec::new();
1041 for (i, &byte) in key_bytes.iter().enumerate() {
1042 hash_result.push(byte.wrapping_add(i as u8));
1043 }
1044
1045 Ok(hash_result[..final_length.min(key_bytes.len())].to_vec())
1046 }
1047
1048 fn bits_to_bytes(&self, bits: &[bool]) -> Vec<u8> {
1049 bits.chunks(8)
1050 .map(|chunk| {
1051 chunk.iter().enumerate().fold(
1052 0u8,
1053 |acc, (i, &bit)| {
1054 if bit {
1055 acc | (1 << i)
1056 } else {
1057 acc
1058 }
1059 },
1060 )
1061 })
1062 .collect()
1063 }
1064}
1065
1066#[derive(Debug, Clone)]
1068pub struct QKDResult {
1069 pub shared_key: Vec<u8>,
1070 pub qber: f64,
1071 pub key_rate: f64,
1072 pub security_parameter: f64,
1073}
1074
1075#[cfg(test)]
1076mod tests {
1077 use super::*;
1078
1079 #[test]
1080 fn test_quantum_hash_function() {
1081 let hash_function = QuantumHashFunction::new(
1082 4,
1083 8,
1084 CompressionFunction::QuantumSponge {
1085 rate: 2,
1086 capacity: 2,
1087 },
1088 );
1089
1090 assert!(hash_function.is_ok());
1091 let qhf = hash_function.unwrap();
1092
1093 let input = b"test message";
1094 let hash_result = qhf.hash(input);
1095 assert!(hash_result.is_ok());
1096 assert_eq!(hash_result.unwrap().len(), 8);
1097 }
1098
1099 #[test]
1100 #[ignore]
1101 fn test_quantum_digital_signature() {
1102 let signature_scheme = QuantumDigitalSignature::new(16, 128);
1103 assert!(signature_scheme.is_ok());
1104
1105 let qds = signature_scheme.unwrap();
1106 let message =
1107 scirs2_core::ndarray::array![Complex64::new(1.0, 0.0), Complex64::new(0.0, 1.0)];
1108
1109 let signature = qds.sign(&message);
1110 assert!(signature.is_ok());
1111
1112 let verification = qds.verify(&message, &signature.unwrap());
1113 assert!(verification.is_ok());
1114 }
1115
1116 #[test]
1117 fn test_quantum_key_distribution() {
1118 let qkd = QuantumKeyDistribution::new(QKDProtocol::BB84, 100, 0.1); let result = qkd.distribute_key();
1121 match result {
1122 Ok(qkd_result) => {
1123 assert!(!qkd_result.shared_key.is_empty());
1124 assert!(qkd_result.qber >= 0.0);
1125 assert!(qkd_result.key_rate > 0.0);
1126 }
1127 Err(e) => {
1128 println!("QKD error: {:?}", e);
1129 panic!("QKD failed with error: {:?}", e);
1130 }
1131 }
1132 }
1133
1134 #[test]
1135 fn test_bb84_state_preparation() {
1136 let qkd = QuantumKeyDistribution::new(QKDProtocol::BB84, 1, 1e-6);
1137
1138 let state_0_z = qkd.prepare_bb84_state(false, false).unwrap();
1139 assert!((state_0_z[0].norm() - 1.0).abs() < 1e-10);
1140
1141 let state_plus = qkd.prepare_bb84_state(false, true).unwrap();
1142 assert!((state_plus[0].norm() - 1.0 / 2.0_f64.sqrt()).abs() < 1e-10);
1143 }
1144}