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 const fn new(
764 protocol_type: QKDProtocol,
765 key_length: usize,
766 security_parameter: f64,
767 ) -> Self {
768 Self {
769 protocol_type,
770 key_length,
771 security_parameter,
772 noise_threshold: 0.11, }
774 }
775
776 pub fn distribute_key(&self) -> Result<QKDResult, QuantRS2Error> {
778 match self.protocol_type {
779 QKDProtocol::BB84 => self.execute_bb84(),
780 QKDProtocol::E91 => self.execute_e91(),
781 QKDProtocol::SARG04 => self.execute_sarg04(),
782 QKDProtocol::COW => self.execute_cow(),
783 }
784 }
785
786 fn execute_bb84(&self) -> Result<QKDResult, QuantRS2Error> {
788 let mut rng = ChaCha20Rng::from_seed([0u8; 32]); let alice_bits: Vec<bool> = (0..self.key_length * 2).map(|_| rng.random()).collect();
792 let alice_bases: Vec<bool> = (0..self.key_length * 2).map(|_| rng.random()).collect();
793
794 let bob_bases: Vec<bool> = (0..self.key_length * 2).map(|_| rng.random()).collect();
796
797 let mut sifted_key = Vec::new();
799 let mut qber_errors = 0;
800 let total_bits = alice_bits.len();
801
802 for i in 0..total_bits {
803 let quantum_state = self.prepare_bb84_state(alice_bits[i], alice_bases[i])?;
805
806 let noisy_state = self.apply_channel_noise(&quantum_state)?;
808
809 let (measurement_result, measurement_success) =
811 self.measure_bb84_state(&noisy_state, bob_bases[i])?;
812
813 if alice_bases[i] == bob_bases[i] && measurement_success {
815 sifted_key.push(measurement_result);
816
817 if measurement_result != alice_bits[i] {
819 qber_errors += 1;
820 }
821 }
822 }
823
824 let qber = if sifted_key.is_empty() {
825 0.0
826 } else {
827 qber_errors as f64 / sifted_key.len() as f64
828 };
829
830 if sifted_key.is_empty() {
831 return Err(QuantRS2Error::QKDFailure(
832 "No sifted key bits available".to_string(),
833 ));
834 }
835
836 if qber > self.noise_threshold {
837 return Err(QuantRS2Error::QKDFailure(format!(
838 "QBER {} exceeds threshold {}",
839 qber, self.noise_threshold
840 )));
841 }
842
843 let final_key = self.privacy_amplification(&sifted_key, qber)?;
845
846 Ok(QKDResult {
847 shared_key: final_key,
848 qber,
849 key_rate: sifted_key.len() as f64 / total_bits as f64,
850 security_parameter: self.security_parameter,
851 })
852 }
853
854 fn prepare_bb84_state(
856 &self,
857 bit: bool,
858 basis: bool,
859 ) -> Result<Array1<Complex64>, QuantRS2Error> {
860 match (bit, basis) {
861 (false, false) => Ok(scirs2_core::ndarray::array![
862 Complex64::new(1.0, 0.0),
863 Complex64::new(0.0, 0.0)
864 ]), (true, false) => Ok(scirs2_core::ndarray::array![
866 Complex64::new(0.0, 0.0),
867 Complex64::new(1.0, 0.0)
868 ]), (false, 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 ]), (true, true) => Ok(scirs2_core::ndarray::array![
874 Complex64::new(1.0 / 2.0_f64.sqrt(), 0.0),
875 Complex64::new(-1.0 / 2.0_f64.sqrt(), 0.0)
876 ]), }
878 }
879
880 fn measure_bb84_state(
882 &self,
883 state: &Array1<Complex64>,
884 basis: bool,
885 ) -> Result<(bool, bool), QuantRS2Error> {
886 let mut rng = ChaCha20Rng::from_seed([42u8; 32]); if basis {
889 let x_plus_amplitude = (state[0] + state[1]) / 2.0_f64.sqrt();
892 let prob_plus = x_plus_amplitude.norm_sqr();
893 let measurement = rng.random::<f64>() < prob_plus;
894 Ok((!measurement, true)) } else {
896 let prob_zero = state[0].norm_sqr();
898 let measurement = rng.random::<f64>() < prob_zero;
899 Ok((!measurement, true)) }
901 }
902
903 fn execute_e91(&self) -> Result<QKDResult, QuantRS2Error> {
905 let mut rng = ChaCha20Rng::from_seed([0u8; 32]); let mut shared_key = Vec::new();
908
909 for _ in 0..self.key_length {
910 let entangled_state = self.create_bell_state()?;
912
913 let alice_basis = rng.random_range(0..3);
915 let bob_basis = rng.random_range(0..3);
916
917 let alice_result = self.measure_entangled_qubit(&entangled_state, alice_basis, 0)?;
919 let bob_result = self.measure_entangled_qubit(&entangled_state, bob_basis, 1)?;
920
921 let _correlation = if alice_result == bob_result {
923 1.0
924 } else {
925 -1.0
926 };
927
928 if alice_basis == bob_basis {
930 shared_key.push(u8::from(alice_result));
931 }
932 }
933
934 Ok(QKDResult {
935 shared_key,
936 qber: 0.01, key_rate: 0.5,
938 security_parameter: self.security_parameter,
939 })
940 }
941
942 fn execute_sarg04(&self) -> Result<QKDResult, QuantRS2Error> {
944 let bb84_result = self.execute_bb84()?;
946
947 Ok(bb84_result)
949 }
950
951 fn execute_cow(&self) -> Result<QKDResult, QuantRS2Error> {
953 let mut rng = ChaCha20Rng::from_seed([0u8; 32]); let mut shared_key = Vec::new();
956
957 for _ in 0..self.key_length {
958 let bit = rng.random::<bool>();
960 let coherent_state = self.prepare_coherent_state(bit)?;
961
962 let measurement_result = self.measure_coherent_state(&coherent_state)?;
964
965 shared_key.push(u8::from(measurement_result));
966 }
967
968 Ok(QKDResult {
969 shared_key,
970 qber: 0.05,
971 key_rate: 0.8,
972 security_parameter: self.security_parameter,
973 })
974 }
975
976 fn create_bell_state(&self) -> Result<Array1<Complex64>, QuantRS2Error> {
978 Ok(scirs2_core::ndarray::array![
980 Complex64::new(1.0 / 2.0_f64.sqrt(), 0.0),
981 Complex64::new(0.0, 0.0),
982 Complex64::new(0.0, 0.0),
983 Complex64::new(1.0 / 2.0_f64.sqrt(), 0.0)
984 ])
985 }
986
987 fn measure_entangled_qubit(
989 &self,
990 _state: &Array1<Complex64>,
991 _basis: usize,
992 _qubit: usize,
993 ) -> Result<bool, QuantRS2Error> {
994 let mut rng = ChaCha20Rng::from_seed([0u8; 32]); Ok(rng.random())
996 }
997
998 fn prepare_coherent_state(&self, bit: bool) -> Result<Array1<Complex64>, QuantRS2Error> {
1000 let alpha: f64 = if bit { 1.0 } else { -1.0 };
1001
1002 Ok(scirs2_core::ndarray::array![
1004 Complex64::new((-alpha.powi(2) / 2.0).exp() * alpha, 0.0),
1005 Complex64::new((-alpha.powi(2) / 2.0).exp(), 0.0)
1006 ])
1007 }
1008
1009 fn measure_coherent_state(&self, _state: &Array1<Complex64>) -> Result<bool, QuantRS2Error> {
1011 let mut rng = ChaCha20Rng::from_seed([0u8; 32]); Ok(rng.random())
1013 }
1014
1015 fn apply_channel_noise(
1017 &self,
1018 state: &Array1<Complex64>,
1019 ) -> Result<Array1<Complex64>, QuantRS2Error> {
1020 let mut rng = ChaCha20Rng::from_seed([0u8; 32]); let noise_level = 0.02; let mut noisy_state = state.clone();
1024 if rng.random::<f64>() < noise_level {
1025 noisy_state = scirs2_core::ndarray::array![state[1], state[0]];
1027 }
1028
1029 Ok(noisy_state)
1030 }
1031
1032 fn privacy_amplification(&self, key: &[bool], qber: f64) -> Result<Vec<u8>, QuantRS2Error> {
1034 let entropy_loss = if qber > 0.0 && qber < 1.0 {
1036 2.0 * qber * (qber.log2() + (1.0 - qber).log2())
1037 } else {
1038 0.5 };
1040 let final_length = ((key.len() as f64) * (1.0 - entropy_loss.abs())).max(1.0) as usize;
1041
1042 let key_bytes = self.bits_to_bytes(key);
1043 let mut hash_result = Vec::new();
1045 for (i, &byte) in key_bytes.iter().enumerate() {
1046 hash_result.push(byte.wrapping_add(i as u8));
1047 }
1048
1049 Ok(hash_result[..final_length.min(key_bytes.len())].to_vec())
1050 }
1051
1052 fn bits_to_bytes(&self, bits: &[bool]) -> Vec<u8> {
1053 bits.chunks(8)
1054 .map(|chunk| {
1055 chunk.iter().enumerate().fold(
1056 0u8,
1057 |acc, (i, &bit)| {
1058 if bit {
1059 acc | (1 << i)
1060 } else {
1061 acc
1062 }
1063 },
1064 )
1065 })
1066 .collect()
1067 }
1068}
1069
1070#[derive(Debug, Clone)]
1072pub struct QKDResult {
1073 pub shared_key: Vec<u8>,
1074 pub qber: f64,
1075 pub key_rate: f64,
1076 pub security_parameter: f64,
1077}
1078
1079#[cfg(test)]
1080mod tests {
1081 use super::*;
1082
1083 #[test]
1084 fn test_quantum_hash_function() {
1085 let hash_function = QuantumHashFunction::new(
1086 4,
1087 8,
1088 CompressionFunction::QuantumSponge {
1089 rate: 2,
1090 capacity: 2,
1091 },
1092 );
1093
1094 assert!(hash_function.is_ok());
1095 let qhf = hash_function.expect("Failed to create quantum hash function");
1096
1097 let input = b"test message";
1098 let hash_result = qhf.hash(input);
1099 assert!(hash_result.is_ok());
1100 assert_eq!(hash_result.expect("Hash computation failed").len(), 8);
1101 }
1102
1103 #[test]
1104 #[ignore]
1105 fn test_quantum_digital_signature() {
1106 let signature_scheme = QuantumDigitalSignature::new(16, 128);
1107 assert!(signature_scheme.is_ok());
1108
1109 let qds = signature_scheme.expect("Failed to create quantum digital signature scheme");
1110 let message =
1111 scirs2_core::ndarray::array![Complex64::new(1.0, 0.0), Complex64::new(0.0, 1.0)];
1112
1113 let signature = qds.sign(&message);
1114 assert!(signature.is_ok());
1115
1116 let verification = qds.verify(&message, &signature.expect("Signature creation failed"));
1117 assert!(verification.is_ok());
1118 }
1119
1120 #[test]
1121 fn test_quantum_key_distribution() {
1122 let qkd = QuantumKeyDistribution::new(QKDProtocol::BB84, 100, 0.1); let result = qkd.distribute_key();
1125 match result {
1126 Ok(qkd_result) => {
1127 assert!(!qkd_result.shared_key.is_empty());
1128 assert!(qkd_result.qber >= 0.0);
1129 assert!(qkd_result.key_rate > 0.0);
1130 }
1131 Err(e) => {
1132 println!("QKD error: {:?}", e);
1133 panic!("QKD failed with error: {:?}", e);
1134 }
1135 }
1136 }
1137
1138 #[test]
1139 fn test_bb84_state_preparation() {
1140 let qkd = QuantumKeyDistribution::new(QKDProtocol::BB84, 1, 1e-6);
1141
1142 let state_0_z = qkd
1143 .prepare_bb84_state(false, false)
1144 .expect("Failed to prepare BB84 |0⟩ state");
1145 assert!((state_0_z[0].norm() - 1.0).abs() < 1e-10);
1146
1147 let state_plus = qkd
1148 .prepare_bb84_state(false, true)
1149 .expect("Failed to prepare BB84 |+⟩ state");
1150 assert!((state_plus[0].norm() - 1.0 / 2.0_f64.sqrt()).abs() < 1e-10);
1151 }
1152}