8个版本 (4个破坏性版本)
0.5.1 | 2023年9月1日 |
---|---|
0.5.0 | 2023年4月27日 |
0.4.0 | 2020年12月7日 |
0.3.1 |
|
0.1.1 | 2019年9月15日 |
#120 in 加密学
2,394 每月下载量
在 25 个crate中使用 (通过 sequoia-openpgp)
215KB
4K SLoC
win-crypto-ng
安全Rust绑定到微软Windows 加密API:下一代 (CNG)
CNG是操作系统和/或硬件提供的加密原语和实用工具。自Windows Vista以来即可使用,并取代了现在已弃用的CryptoAPI。
这些原语不依赖于OpenSSL或其他类似库,它们由微软和/或硬件制造商提供。它们是在内核空间程序中使用的原语。因此,如果您使用微软Windows,您已经接受信任这些原语。
CNG特性
- 经FIPS 140-2验证,并作为Windows通用标准认证评估目标的组成部分
- 完全支持NSA Suite B算法
- 内核支持(不通过Rust绑定)
- 密钥存储提供者(KSP)中的审计
- 线程安全
Rust支持的特性
- 非对称加密(RSA)
- 数字签名
- 支持算法:RSA、DSA、ECDSA。
- 密钥交换
- 支持算法:DH、ECDH。
- 对称加密
- 支持算法:AES、DES、DES-X、RC2、3DES、3DES-112。
- 支持链模式:ECB、CBC、CFB。
- 哈希函数
- 支持算法:SHA-1、SHA-256、SHA-384、SHA-512、MD2、MD4、MD5。
- 密码学安全的随机数生成
更多即将到来
Cargo特性
zeroize
- 使用zeroize
crate在销毁时将中间缓冲区清零rand
- 实现CNG提供的CSPRNG(密码学安全的伪随机数生成器)的rand
crate特性block-cipher
- 实现了 CNG 区块加密的block-cipher
特性。
默认情况下,只启用了 zeroize
功能。
示例
非对称加密(RSA)
use win_crypto_ng::asymmetric::{AsymmetricKey, EncryptionPadding, Rsa};
let key = AsymmetricKey::builder(Rsa).key_bits(1024).build().unwrap();
let plaintext = b"This is an important message.";
let padding = Some(EncryptionPadding::Pkcs1);
let ciphertext = key.encrypt(padding.clone(), &*plaintext).unwrap();
assert_eq!(ciphertext.len(), 1024 / 8);
let decoded = key.decrypt(padding, ciphertext.as_ref()).unwrap();
assert_eq!(plaintext, decoded.as_ref());
数字签名
use win_crypto_ng::asymmetric::signature::{Signer, Verifier, SignaturePadding};
use win_crypto_ng::asymmetric::{AsymmetricKey, Rsa};
use win_crypto_ng::hash::HashAlgorithmId;
let key = AsymmetricKey::builder(Rsa).key_bits(1024).build().unwrap();
let data: Vec<u8> = (0..32).collect();
let padding = SignaturePadding::pkcs1(HashAlgorithmId::Sha256);
let signature = key.sign(&*data, Some(padding)).expect("Signing to succeed");
key.verify(&data, &signature, Some(padding)).expect("Signature to be valid");
key.verify(&[0xDE, 0xAD], &signature, Some(padding)).expect_err("Bad digest");
key.verify(&data, &[0xDE, 0xAD], Some(padding)).expect_err("Bad signature");
对称加密
use win_crypto_ng::symmetric::{ChainingMode, SymmetricAlgorithm, SymmetricAlgorithmId, Padding};
const KEY: &'static str = "0123456789ABCDEF";
const IV: &'static str = "asdfqwerasdfqwer";
const DATA: &'static str = "This is a test.";
let iv = IV.as_bytes().to_vec();
let algo = SymmetricAlgorithm::open(SymmetricAlgorithmId::Aes, ChainingMode::Cbc).unwrap();
let key = algo.new_key(KEY.as_bytes()).unwrap();
let ciphertext = key.encrypt(Some(&mut iv.clone()), DATA.as_bytes(), Some(Padding::Block)).unwrap();
let plaintext = key.decrypt(Some(&mut iv.clone()), ciphertext.as_slice(), Some(Padding::Block)).unwrap();
assert_eq!(std::str::from_utf8(&plaintext.as_slice()[..DATA.len()]).unwrap(), DATA);
哈希函数
use win_crypto_ng::hash::{HashAlgorithm, HashAlgorithmId};
const DATA: &'static str = "This is a test.";
let algo = HashAlgorithm::open(HashAlgorithmId::Sha256).unwrap();
let mut hash = algo.new_hash().unwrap();
hash.hash(DATA.as_bytes()).unwrap();
let result = hash.finish().unwrap();
assert_eq!(result.as_slice(), &[
0xA8, 0xA2, 0xF6, 0xEB, 0xE2, 0x86, 0x69, 0x7C,
0x52, 0x7E, 0xB3, 0x5A, 0x58, 0xB5, 0x53, 0x95,
0x32, 0xE9, 0xB3, 0xAE, 0x3B, 0x64, 0xD4, 0xEB,
0x0A, 0x46, 0xFB, 0x65, 0x7B, 0x41, 0x56, 0x2C,
]);
密码学安全的随机数生成器
use win_crypto_ng::random::{RandomAlgorithmId, RandomNumberGenerator};
let mut buffer = [0u8; 32];
let rng = RandomNumberGenerator::system_preferred();
rng.gen_random(&mut buffer).unwrap();
assert_ne!(&buffer, &[0u8; 32]);
许可证
许可协议为 3-Clause BSD 许可协议。有关更多详细信息,请参阅 LICENSE.md。
版权 (c) 2019-2020 Émile Grégoire。保留所有权利。
依赖项
~38–340KB