jorgegardiaz/qcrypto
GitHub: jorgegardiaz/qcrypto
纯 Rust 实现的量子密码学仿真框架,通过双态架构高效支持量子密钥分发、量子零知识证明等协议的设计、噪声信道模拟与安全验证。
Stars: 1 | Forks: 0
qcrypto
纯 Rust 量子密码学仿真框架
[](https://www.rust-lang.org)
[](https://crates.io/crates/qcrypto)
[](https://docs.rs/qcrypto)
[](LICENSE)
[](https://github.com/jorgegardiaz/qcrypto/actions/workflows/test.yml)

`qcrypto` 是一个跨平台的 Rust 库,专为量子密码学协议的设计、仿真和验证而打造。
与严格专注于逻辑电路状态向量演化的通用量子模拟器不同,`qcrypto` 实现了智能的**双态架构 (Dual-State Architecture)**。它在用于纯态的高效**状态向量**与在引入开放量子系统、退相干或噪声信道时采用的稳健**密度矩阵**之间动态切换。这种设计选择既实现了酉逻辑电路的高性能执行,也实现了对广义测量 (POVM) 和硬件漏洞的精确模拟。
该库采用 **100% Safe Rust** 实现,消除了外部依赖。
## 核心特性
* **双态形式体系:** 仅在应用噪声信道时,自动透明地从 `StateVector`($O(2^N)$ 内存)转换为 `StateDensityMatrix`($O(4^N)$ 内存)。
* **开放量子系统:** 实现了满足迹保持 条件的量子信道(比特翻转、相位阻尼、振幅阻尼、去极化)。
* **广义测量:** 支持正定算符值测量 (POVM),这对于 B92 和无歧义态鉴别等协议至关重要。
* **高效算子展开:** 原生实现了优化算法,通过避免全局矩阵展开来执行局部张量数学更新。
* **可重复的模拟:** 线程本地 RNG 系统 (`qcrypto::rng`) 允许研究人员将模拟锁定为确定性熵序列,从而精确复现实验协议的运行。
## 安装说明
要在你的 Rust 项目中使用 `qcrypto`,你可以通过 Cargo 轻松添加它。
在你的项目目录中运行以下命令:
```
cargo add qcrypto
```
## 库架构
`qcrypto` 建立在数学上严谨的基础之上,避免了其他模拟器中常见的简化处理。核心组件旨在高效处理纯酉逻辑运算,并原生支持混合态。
### 核心结构
* **`QuantumState`**:一个动态包装器,包含一个指向 `QuantumStateImpl` trait 的指针(`Box
`),该 trait 由 **`StateVector`** 和 **`StateDensityMatrix`** 共同实现。这种基于 trait 的架构实现了透明的动态分发。为了获得最佳效率,模拟初始化时使用纯态向量($O(2^N)$ 内存),并且仅当状态由于通过量子噪声信道与环境相互作用而变为混合态时,才智能地将其自身转换为密度矩阵($O(4^N)$ 内存)。
* **`QuantumChannel`**:使用 **Kraus 算子** 对物理噪声和退相干(例如,比特翻转、相位阻尼、振幅阻尼)进行建模。它确保演化过程是迹保持 的。
* **`Measurement`**:一个支持标准投影测量和 **正定算符值测量 (POVM)** 的广义测量框架。这对于实现最优鉴别策略和模糊状态检测至关重要。
* **`Gate`**:提供标准的酉操作,并允许定义自定义的单量子位和多量子位酉操作。
* **`Sampler`**:允许使用 `Measurement` 和 `QuantumChannel` 运行多次测量。
## 已实现的协议
该库包含了标准和新型量子密码学方案的参考实现。
### 1. BB84 (Bennett & Brassard, 1984)
量子密钥分发 的标准协议。该实现支持:
* 拦截-重发攻击。
* 实时 QBER (Quantum Bit Error Rate, 量子比特误码率) 估算。
* 筛选和纠错模拟。
### 2. 带有最优 POVM 的 B92 (Bennett, 1992)
利用广义测量进行**无歧义态鉴别**的 B92 实现。
* **机制:** 构造最优 POVM,从而显式处理不确定结果。
* **产出率:** 达到最优的理论筛选率(对于标准非正交态约为 29.3%),在无噪声信道中严格优于标准的投影测量。
### 3. QIA-QZKP (Garcia-Diaz et al., 2025)
论文 *"Conjugate Coding Based Designated Verifier Quantum Zero Knowledge Proof for User Authentication"* 中描述的协议的参考实现。
该协议建立了一个用于身份验证的量子零知识证明 (QZKP),而无需泄露证明者的密钥。
* **安全模型:** 依赖于共轭编码(计算基 vs. Hadamard 基)的不确定性原理。
* **属性:**
* *完备性:* 诚实证明者被接受的概率接近 1(根据信道噪声模型进行调整)。
* *可靠性:* 不诚实的证明者成功冒充身份的概率遵循二项分布,并随密钥长度呈指数级衰减。
* *零知识:* 由于临时掩码的存在,指定验证者无法获取有关长期秘密 的任何信息。
## 使用示例
### 使用密度矩阵模拟噪声信道
```
use qcrypto::{QuantumState, Gate, Measurement, QuantumChannel, errors::*};
fn main() -> Result<(), Box> {
// 1. Initialize a pure qubit state |0><0|
let mut rho = QuantumState::new(1);
// 2. Apply Hadamard Gate -> |+><+|
rho.apply(&Gate::h(), &[0])?;
// 3. Evolve through an Amplitude Damping Channel (gamma = 0.3)
// This transforms the pure state into a mixed state.
let channel = QuantumChannel::amplitude_damping(0.3);
rho.apply_channel(&channel, &[0])?;
println!("State Purity (Tr(rho^2)): {:.4}", rho.purity());
// Purity will be < 1.0 due to the non-unitary channel evolution.
// 4. Measure in the Z basis
let measurement = Measurement::z_basis();
let outcome = rho.measure(&measurement, &[0])?;
println!("Measurement Outcome: {}", outcome.index);
println!("State Purity (Tr(rho^2)): {:.4}", rho.purity());
// Purity will be 1.0 because it has been projected to a pure state
Ok(())
}
```
### 运行 QIA-QZKP 协议
```
use qcrypto::protocols::qia_qzkp;
use qcrypto::{QuantumChannel, errors::*};
fn main() -> Result<(), Box> {
let n_qubits = 1024;
let threshold = 0.85; // Acceptance threshold based on expected QBER
// Simulate a realistic channel with 5% noise
let noisy_channel = QuantumChannel::bit_flip(0.05);
let result = qia_qzkp::run(n_qubits, &noisy_channel, threshold)?;
println!("Protocol Accuracy: {:.2}%", result.accuracy * 100.0);
println!("Authenticated: {}", result.authenticated);
Ok(())
}
```
### 可重复的模拟(确定性 RNG)
对于测试和研究来说,完美重现协议的特定运行(产生相同的密钥和错误分布)通常至关重要。`qcrypto` 提供了一个高性能的**线程本地确定性 RNG**,无需您将 RNG 实例传递给每个函数。
```
use qcrypto::protocols::qkd::bbm92;
use qcrypto::{QuantumChannel, rng::set_global_seed};
fn main() {
let channel = QuantumChannel::depolarizing(0.1);
// Lock the RNG for this thread to a specific seed
set_global_seed(42);
// Every call to bbm92::run or QuantumState::measure on this thread
// will now be 100% deterministic and reproducible.
let result = bbm92::run(1000, &channel, 0.1, 0.2)?;
// Running this program tomorrow will yield the exact same QBER and key.
println!("Deterministically reproducible QBER: {:.2}%", result.qber);
}
```
### 运行多次执行并保存至 CSV
在进行统计分析时,通常需要在不同参数(例如,不同的噪声级别)下多次运行协议并存储结果。
```
use qcrypto::protocols::qkd::bb84;
use qcrypto::{QuantumChannel, errors::*};
use std::fs::File;
use std::io::Write;
fn main() -> Result<(), Box> {
let num_qubits = 1000;
let eve_ratio = 0.0;
let check_ratio = 0.2;
let num_executions = 50;
let noise_levels = [0.0, 0.05, 0.10, 0.15];
// Create a CSV file for output
let mut file = File::create("bb84_results.csv")?;
writeln!(file, "Noise,Execution,QBER,EstablishedKeyLength")?;
// Iterate over different noise configurations
for &noise in &noise_levels {
let channel = QuantumChannel::depolarizing(noise);
// Run the protocol multiple times for each configuration
for execution in 1..=num_executions {
let result = bb84::run(num_qubits, &channel, eve_ratio, check_ratio)?;
// Write the extracted data to the CSV
writeln!(
file,
"{:.2},{},{:.2},{}",
noise, execution, result.qber, result.established_key.len()
)?;
}
}
println!("Simulation complete. Data saved to bb84_results.csv");
Ok(())
}
```
## 参考文献
如果您在研究或项目中使用了本软件,请使用 [引用](CITATION.cff) 中的信息进行引用。此外,如果您在研究中使用了 QIA-QZKP 模块,请引用原始论文:
## 许可证
本项目基于 MIT 许可证授权。有关详细信息,请参阅 [LICENSE](LICENSE) 文件。
## 贡献
欢迎贡献!请在 [GitHub](https://github.com/jorgegardiaz/qcrypto) 上开启一个 issue 或提交 pull request。标签:B92, BB84, POVM, QKD, Rust, 仿真验证, 可视化界面, 后量子密码学, 密度矩阵, 密码学协议, 密钥分发, 开放量子系统, 状态向量, 网络流量审计, 退相干, 通知系统, 量子噪声, 量子安全, 量子密码学, 量子态, 量子模拟器, 量子计算, 量子通信, 零依赖