#aes-gcm #warnings #constant-time #decryption #oblivious #rust-crypto #intended

no-std mc-oblivious-aes-gcm

警告:此crate不适用于通用用途,您应使用官方的RustCrypto crate。RustCrypto的AES-GCM的分支,以提供一个公开的CTR成员,用于常量时间的原地解密方法

4个版本

0.10.1 2023年1月6日
0.9.5-pre12021年10月4日
0.9.4 2021年9月27日
0.9.2 2021年7月7日

密码学中排名第2082

Download history 337/week @ 2024-03-10 338/week @ 2024-03-17 337/week @ 2024-03-24 978/week @ 2024-03-31 303/week @ 2024-04-07 417/week @ 2024-04-14 220/week @ 2024-04-21 27/week @ 2024-04-28 640/week @ 2024-05-05 274/week @ 2024-05-12 243/week @ 2024-05-19 149/week @ 2024-05-26 189/week @ 2024-06-02 6/week @ 2024-06-09 52/week @ 2024-06-16 10/week @ 2024-06-23

每月下载量266

Apache-2.0 OR MIT

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