3个不稳定版本
0.2.9 | 2023年5月28日 |
---|---|
0.2.7 | 2023年4月30日 |
0.1.8 | 2023年2月25日 |
481 在 加密学 中排名
每月 49次下载
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
相关,如加密名称等)。如果排除,库不依赖于libstd
或alloc
- 适用于构建嵌入式目标。ciphers
=block_ciphers
和stream_ciphers
modes
=ecb
,cbc
,cfb
,ctr
,ofb
, 和pcbc
block_ciphers
=rijndael
,des
,twofish
,aria
,threefish
,blowfish
, 和camellia
stream_ciphers
=salsa20
和chacha20
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
以自己找出答案。