4个版本
0.10.1 | 2023年1月6日 |
---|---|
0.9.5-pre1 | 2021年10月4日 |
0.9.4 | 2021年9月27日 |
0.9.2 | 2021年7月7日 |
在密码学中排名第2082
每月下载量266
150KB
247 行
MobileCoin:无意识AES-GCM
警告:您应使用aes-gcm
crate,而不是此crate。此crate是优秀的RustCrypto crate的修补/分支,以支持MobileCoin一个非常狭窄的用例,因此其维护和安全必然落后于RustCrypto的crate。
lib.rs
:
警告
您应使用aes-gcm
crate,而不是此crate。此crate是优秀的RustCrypto crate的修补/分支,以支持MobileCoin一个非常狭窄的用例,因此其维护和安全必然落后于RustCrypto的crate。
原始README
AES-GCM:基于AES在Galois/Counter Mode上的认证加密和相关数据(AEAD)密码。
性能说明
默认情况下,此crate将使用AES和POLYVAL通用哈希函数的软件实现。
当针对现代x86/x86_64 CPU时,使用以下RUSTFLAGS
以利用高性能AES-NI和CLMUL CPU内联函数
RUSTFLAGS="-Ctarget-cpu=sandybridge -Ctarget-feature=+aes,+sse2,+sse4.1,+ssse3"
安全说明
此crate已通过NCC Group进行了一次安全审计,未发现重大问题。我们感谢MobileCoin为审计提供资金。
crate中包含的所有实现都旨在在常量时间内执行,要么依赖于硬件内联函数(即x86/x86_64上的AES-NI和CLMUL),要么使用一个可移植的实现,该实现只在实现常量时间乘法的处理器上为常量时间。
不适用于使用具有可变时间乘法操作的处理器(例如,在乘以零/乘以一的短路中,如某些32位PowerPC CPU和一些非ARM微控制器)。
用法
简单用法(分配,无相关数据)
fn main() -> Result<(), Box> {
使用 mc_oblivious_aes_gcm::{ aead::{Aead, KeyInit, OsRng}, Aes256Gcm, Nonce // 或者 Aes128Gcm
};
let key = Aes256Gcm::generate_key(&mut OsRng); let cipher = Aes256Gcm::new(&key); let nonce = Nonce::from_slice(b"唯一的nonce"); // 96位;每条消息唯一 let ciphertext = cipher.encrypt(nonce, b"明文消息".as_ref())?; let plaintext = cipher.decrypt(nonce, ciphertext.as_ref())?; assert_eq!(&plaintext, b"明文消息");
Ok(())
}
## In-place Usage (eliminates `alloc` requirement)
This crate has an optional `alloc` feature which can be disabled in e.g.
microcontroller environments that don't have a heap.
The [`AeadInPlace::encrypt_in_place`] and [`AeadInPlace::decrypt_in_place`]
methods accept any type that impls the [`aead::Buffer`] trait which
contains the plaintext for encryption or ciphertext for decryption.
Note that if you enable the `heapless` feature of this crate,
you will receive an impl of [`aead::Buffer`] for `heapless::Vec`
(re-exported from the [`aead`] crate as [`aead::heapless::Vec`]),
which can then be passed as the `buffer` parameter to the in-place encrypt
and decrypt methods:
use mc_oblivious_aes_gcm::{
aead::{AeadInPlace, KeyInit, OsRng, heapless::Vec},
Aes256Gcm, Nonce, // Or `Aes128Gcm`
};
let key = Aes256Gcm::generate_key(&mut OsRng);
let cipher = Aes256Gcm::new(&key);
let nonce = Nonce::from_slice(b"unique nonce"); // 96-bits; unique per message
let mut buffer: Vec<u8, 128> = Vec::new(); // Note: buffer needs 16-bytes overhead for auth tag tag
buffer.extend_from_slice(b"plaintext message");
// Encrypt `buffer` in-place, replacing the plaintext contents with ciphertext
cipher.encrypt_in_place(nonce, b"", &mut buffer)?;
// `buffer` now contains the message ciphertext
assert_ne!(&buffer, b"plaintext message");
// Decrypt `buffer` in-place, replacing its ciphertext context with the original plaintext
cipher.decrypt_in_place(nonce, b"", &mut buffer)?;
assert_eq!(&buffer, b"plaintext message");
依赖项
~0.7–1MB
~21K SLoC