8个版本 (4个破坏性版本)

0.5.1 2023年9月1日
0.5.0 2023年4月27日
0.4.0 2020年12月7日
0.3.1 2020年12月4日
0.1.1 2019年9月15日

#120 in 加密学

Download history 348/week @ 2024-03-13 548/week @ 2024-03-20 271/week @ 2024-03-27 579/week @ 2024-04-03 512/week @ 2024-04-10 727/week @ 2024-04-17 750/week @ 2024-04-24 500/week @ 2024-05-01 443/week @ 2024-05-08 570/week @ 2024-05-15 352/week @ 2024-05-22 578/week @ 2024-05-29 560/week @ 2024-06-05 600/week @ 2024-06-12 750/week @ 2024-06-19 364/week @ 2024-06-26

2,394 每月下载量
25 个crate中使用 (通过 sequoia-openpgp)

BSD-3-Clause

215KB
4K SLoC

win-crypto-ng

crates.io docs.rs MSRV Build status License

安全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