#加密 #安全 #密钥 #可审计 #对称 #原始

无std libqabu

一个可审计且灵活的Rust加密库

3个不稳定版本

0.2.9 2023年5月28日
0.2.7 2023年4月30日
0.1.8 2023年2月25日

481加密学 中排名

每月 49次下载

GPL-3.0 许可证

390KB
14K SLoC

此库提供了各种加密原语。

只是为了让你尝尝...

一个最小的不填充AES-CBC示例

use libqabu::prelude::*;
use libqabu::symmetric::{Rijndael, RijndaelKey};
use libqabu::mode::CBC;

fn error() -> Result<(), Box<dyn std::error::Error>> {
	let mut to_encrypt = [0u8; 32]; // this is just 32 zeros.
	let key = [0u8; 16]; // this is just an example of a key
	let iv = [0u8; 16]; // this is just an example of a IV

	let mut raw_cipher = Rijndael::new(
		RijndaelKey::Small(key)
	)?;

	let mut cipher = CBC::new(&mut raw_cipher, iv)?;

	cipher.encrypt_insitu(&mut to_encrypt)?;

	println!("The encrypted data {:?}", to_encrypt);
	Ok(())
}

fn main() { error().unwrap(); }

安装

要在您的项目中使用库,请简单地从主页克隆仓库,然后将其包含在您的 Cargo.toml 中。

也就是说

libqabu = {path = "path/to/unpacked/tarball", features = ["feature", "list"]}

您还可以在我们的crate注册表中使用,在 ~/.cargo/config.toml 中添加

[registries]
h49 = { index = "sparse+https://registry.22h49.one/" }

然后

libqabu = { version="0.2.9", features = ["feature", "list"],  registry = "h49"}

或者您可以使用 crates.io

libqabu = { version="0.2.9", features = ["feature", "list"] }

或者如果您想走在前沿,请使用git仓库

libqabu = {git = "git://22h49.one/libqabu", features = ["feature", "list"]}

可用功能

  • shred: 在丢弃时清除敏感数据的内存(!!! 重要,请包含此功能 !!!
  • std: 如果包含,库将使用 libstd 并提供一些功能(大多数与 String 相关,如加密名称等)。如果排除,库不依赖于 libstdalloc - 适用于构建嵌入式目标。
  • ciphers = block_ciphersstream_ciphers
  • modes = ecb, cbc, cfb, ctr, ofb, 和 pcbc
  • block_ciphers = rijndael, des, twofish, aria, threefish, blowfish, 和 camellia
  • stream_ciphers = salsa20chacha20
  • digests = md5
  • 这些是自我解释的
    • rijndael
    • des
    • desede(依赖于 des
    • twofish
    • threefish
    • aria
    • camellia
    • salsa20
    • chacha20
    • blowfish
    • md5
    • ecb
    • cbc
    • ctr
    • cfb
    • pcbc
    • ofb

构建

该库包含测试用例,用于验证所有已知测试向量的算法输出,在您的机器上运行这些测试用例可以验证所有实现是否输出正确。要这样做,请调用cargo test,并确保结果是测试结果:ok。注意:这可能需要一两秒钟,因为正在测试大量数据(在Ryzen 7 4800u上约为9秒)。

验证后,请调用cargo build

重要说明

  • 该库公开了大量非常低级的原始函数,如果误用则可能不安全。只有在您确切知道自己在做什么的情况下才使用它。在应用中使用时,请使用基于此的更高层crate。

  • 出于完整性考虑,该库包含了一些不常用或过时的原始函数实现(例如DES、MD5 ...)。这些在构建配置中默认禁用,但已提醒您要谨慎选择包含的构建功能。

安全和原则

  • 直观简单,易于理解

此代码旨在可读。如果您了解Rust,您应该能够理解所有内容,并将其与算法的参考实现或规范进行比较。这是本项目的优先事项,有时我们会为了代码的灵活性而牺牲速度。

  • 平台无关性

libqabu在执行加密操作时不会使用特殊的汇编指令。这在许多方面是一种权衡,如果您不同意这一点,请考虑RustCrypto项目。

我们得到了什么?

简单性、灵活性和我的精神健康(很多)。

完全在软件中执行加密,如果Rust可以运行,这应该也可以!更好地与诸如IntelME之类的技术分离。

我们失去了什么?

速度。(高度依赖于平台)

侧信道攻击:此库没有内置的隐蔽性来使侧信道(硬件)攻击更难,一些平台声称可以通过其自定义指令减轻这些攻击。

  • 单一模块

与其他大多数加密套件不同,此库是单一模块。它由“功能”而不是单独的crate构建而成。组件可以通过rust功能包含在构建中或排除。

但这对我意味着什么?

  • 这不适合全盘加密或处理大量数据的非常高速处理。
  • 这也不适合硬件侧信道是一个问题的应用。
  • 将此添加到您的项目时,请仅选择您使用的功能。不要盲目选择features=["all"]
  • 它有多快?显然,这取决于。克隆项目并运行cargo bench以自己找出答案。

没有运行时依赖