6个版本

0.0.6 2024年5月12日
0.0.5 2024年5月9日
0.0.3 2023年12月25日
0.0.2 2023年11月21日

#323 in 加密学

Download history 21/week @ 2024-04-24 376/week @ 2024-05-08 21/week @ 2024-05-15 7/week @ 2024-05-22 3/week @ 2024-06-05 2/week @ 2024-06-12 3/week @ 2024-06-19 5/week @ 2024-07-03

350 每月下载量

MIT/Apache

300KB
7K SLoC

Rust 5.5K SLoC // 0.0% comments GNU Style Assembly 625 SLoC // 0.1% comments Assembly 606 SLoC // 0.0% comments Bitbake 99 SLoC // 0.0% comments

kyberlib's logo

kyberlib

CRYSTALS-Kyber后量子密码学的鲁棒Rust库。

Made With Love Crates.io Lib.rs Docs.rs License Codecov

网站文档报告错误请求功能贡献指南

divider

概述 📖

KyberLib是一个为CRYSTALS-Kyber后量子密码学设计的鲁棒Rust库,提供了强大的安全保证。此库与no_std兼容,适合嵌入式设备,避免了内存分配。此外,它包含没有不安全代码的参考实现,并在x86_64平台上默认提供优化的AVX2版本。您还可以使用wasm-bindgen将其编译为WebAssembly (WASM)。

特性 ✨

核心特性

  • no_std兼容:不依赖于Rust标准库
  • 避免分配:仅使用基于栈的数据结构
  • 可配置:功能以启用不同的参数集
  • 优化x86_64:使用汇编进行性能关键代码,包括默认优化的AVX2版本。
  • 安全代码:参考实现没有unsafe
  • WebAssembly支持:可以使用wasm-bindgen编译为WASM。

高级特性

  • 无分配保证:KyberLib保证其所有核心密码学操作不进行堆分配。
  • 汇编优化:x86_64汇编实现使用AVX2指令以实现高性能。
  • 安全性:KyberLib在公共API表面没有不安全代码。

功能 📚

  • 密钥生成:创建公钥/私钥对
  • 封装:使用公钥封装共享密钥
  • 解封装:使用私钥解封装共享密钥
  • 密钥交换:执行认证密钥交换

有关完整API详情,请参阅文档

入门 🚀

只需几分钟即可开始使用kyberlib

要求

当前支持的最低Rust工具链版本是Rust 1.60 或更高版本(稳定版)。

安装

要安装 kyberlib,您需要在您的机器上安装Rust工具链。您可以通过访问Rust网站上的说明来安装Rust工具链。

一旦您安装了Rust工具链,您可以使用以下命令安装 kyberlib

cargo install kyberlib

用法 📖

要在您的项目中使用 kyberlib 库,请将以下内容添加到您的 Cargo.toml 文件中

[dependencies]
kyberlib = "0.0.6"

将以下内容添加到您的 main.rs 文件中

extern crate kyberlib;
use kyberlib::*;

然后您可以在应用程序代码中使用这些函数。

要在x86平台上进行优化,请启用 avx2 功能和以下 RUSTFLAGS

export RUSTFLAGS="-C target-feature=+aes,+avx2,+sse2,+sse4.1,+bmi2,+popcnt"

包功能 📦

密钥封装

// Generate Keypair
let keys_bob = keypair(&mut rng)?;

// Alice encapsulates a shared secret using Bob's public key
let (ciphertext, shared_secret_alice) = encapsulate(&keys_bob.public, &mut rng)?;

// Bob decapsulates a shared secret using the ciphertext sent by Alice
let shared_secret_bob = decapsulate(&ciphertext, &keys_bob.secret)?;

assert_eq!(shared_secret_alice, shared_secret_bob);

单向认证密钥交换

let mut rng = rand::thread_rng();

// Initialize the key exchange structs
let mut alice = Uake::new();
let mut bob = Uake::new();

// Generate Bob's Keypair
let bob_keys = keypair(&mut rng)?;

// Alice initiates key exchange
let client_init = alice.client_init(&bob_keys.public, &mut rng)?;

// Bob authenticates and responds
let server_response = bob.server_receive(
  client_init, &bob_keys.secret, &mut rng
)?;

// Alice decapsulates the shared secret
alice.client_confirm(server_response)?;

// Both key exchange structs now have the same shared secret
assert_eq!(alice.shared_secret, bob.shared_secret);

双向认证密钥交换

遵循相同的流程,但Bob需要Alice的公钥

let mut alice = Ake::new();
let mut bob = Ake::new();

let alice_keys = keypair(&mut rng)?;
let bob_keys = keypair(&mut rng)?;

let client_init = alice.client_init(&bob_keys.public, &mut rng)?;

let server_response = bob.server_receive(
  client_init, &alice_keys.public, &bob_keys.secret, &mut rng
)?;

alice.client_confirm(server_response, &alice_keys.secret)?;

assert_eq!(alice.shared_secret, bob.shared_secret);

宏 🦀

KyberLib包提供了一些宏来简化常见的加密操作

有关更多详细信息和使用示例,请参阅宏模块文档

错误

KyberLibError枚举有两个变体

  • InvalidInput - 函数的一个或多个输入大小不正确。这种错误可能是由两方在尝试协商密钥交换时使用不同的安全级别而引起的。
  • InvalidKey - 生成密钥时出错。
  • Decapsulation - 密文无法验证。共享密钥未解封装。
  • RandomBytesGeneration - 尝试填充随机字节时出错(即,外部(硬件)RNG模块可能失败)。

示例

要开始使用 kyberlib,您可以使用项目中 examples 目录中提供的示例。

要运行示例,请克隆仓库,然后在项目根目录中运行以下命令。

示例 1:实现一个认证密钥交换协议

Alice 和 Bob 交换公钥以在认证每个当事人的方式中推导出共享密钥。

请在项目根目录的终端中运行以下命令。

cargo run --example ake

示例 2:演示密钥封装和解封装

Alice 生成一个密钥对。Bob 使用 Alice 的公钥封装一个秘密。Alice 使用她的私钥解封装秘密。这允许安全通信。

请在项目根目录的终端中运行以下命令。

cargo run --example kem

示例 3:实现一个非认证密钥交换协议

Alice 和 Bob 交换公钥信息以在未经彼此认证的情况下推导出共享密钥。提供保密性但不提供认证。

请在项目根目录的终端中运行以下命令。

cargo run --example uake

平台支持

kyberlib 支持多种 CPU 架构。它在 MacOS、Linux 和 Windows 上得到支持和测试。

文档

信息:请访问我们的网站以获取更多信息。您可以在docs.rslib.rscrates.io上找到我们的文档。

语义版本策略 🚥

为了提高发布周期的透明度并努力保持向后兼容性,kyberlib 遵循语义版本

许可证 📝

KyberLib 在 MIT 许可证和 Apache 许可证(版本 2.0)的条款下分发。

有关详细信息,请参阅LICENSE-APACHELICENSE-MIT

贡献 🤝

我们欢迎所有希望贡献的人。有关更多信息,请参阅贡献说明

对项目的任何形式(问题、拉取请求等)的贡献都必须遵守Rust 的行为准则

除非您明确表示,否则任何根据 Apache-2.0 许可证定义的、有意提交以包含在您的工作中的贡献,都应如上所述双许可,而不附加任何额外的条款或条件。

致谢 💙

向所有kyberlib的优秀贡献者表示衷心的感谢,感谢他们的帮助和支持。

此存储库是从Argyle-Software/kyber的 Kyber 后量子 KEM 的创新 Rust 实现中分叉的。我们非常感谢原始项目的启发和贡献,它为我们的工作和学习提供了一个坚实的基础。谢谢!您可以在这里找到原始存储库。

特别感谢Rust Reddit社区为我们提供了大量关于如何改进此项目的有用建议。

依赖关系

~7–34MB
~503K SLoC