unbekanntes-pferd/dco3-crypto
GitHub: unbekanntes-pferd/dco3-crypto
一个为 DRACOON 平台设计的 Rust 加密库,提供 RSA 密钥管理和 AES-256-GCM 文件加解密能力。
Stars: 1 | Forks: 0
dco3-crypto
# dco3-crypto ## 这是什么? 这是一个基于 openssl crate 的、为 DRACOON 开发的加密库(Work in progress)。 在早期阶段,**破坏性更改 (Breaking changes)** 极有可能发生 —— 该库正处于密集开发阶段,且依赖于 `dco3`(目前为 DRACOON 的私有 API 封装器)的需求。 更改将记录在 [发布说明](https://github.com/unbekanntes-pferd/dco3-crypto/releases) 中。 ### 哪些功能可用? - 文件密钥的非对称加密/解密 (RSA) - 密钥对生成 (RSA) - 密钥对加密/解密 (RSA) - 文件的对称加密/解密 (AES256 GCM) - 单次 (one-shot) 加密/解密 - 流式 (streaming) 加密/解密 ### 计划中功能? - 重构非对称加密(将密钥对生成与其他操作分离) - 使用其他库(如 ring)作为 openssl 绑定的替代方案 - 为 cargo build 添加 feature flags - 添加端到端 (e2e) 测试,使用来自其他 SDK/库的加密数据,并确保流水线中的兼容性 ### 提供了什么? 使用该 crate 目前会绑定到最新的 openssl 版本,并以 vendored 模式编译(详见 [openssl](https://crates.io/crates/openssl))。 ### 如何使用? 参见 [crates.io](https://crates.io/crates/dco3_crypto) TL;DR 将以下行添加到你的 Cargo.toml 文件(依赖项)中: ``` dco3_crypto = "0.9.0" ``` ## 文档 [文档](https://docs.rs/dco3_crypto/latest/dco3_crypto) 所有详细文档均通过 [docs.rs](https://docs.rs/dco3_crypto/latest/dco3_crypto) 上的 docs 提供。 ## TL;DR 用法 ### 必需的导入 该库为单次 (one-shot) 操作暴露了 trait,并为流式操作提供了固有方法。 导入 `DracoonCrypto` 并根据需要添加 `DracoonRSACrypto`、`Encrypt` 和 `Decrypt`。 #### 非对称加密 用于: - 生成(明文)用户密钥对 - 加密/解密用户密钥对 - 仅解密私钥 - 使用公钥(用户密钥对)加密文件密钥 - 使用私钥(用户密钥对)解密文件密钥 生成一个明文用户密钥对: ``` use dco3_crypto::{DracoonCrypto, DracoonRSACrypto, UserKeyPairVersion}; // RSA2048 is only supported for legacy compatibility // always use UserKeyPairVersion::RSA4096 let new_keypair = DracoonCrypto::create_plain_user_keypair(UserKeyPairVersion::RSA4096).unwrap(); ``` 加密一个明文用户密钥对: ``` use dco3_crypto::{DracoonCrypto, DracoonRSACrypto, UserKeyPairVersion}; let new_keypair = DracoonCrypto::create_plain_user_keypair(UserKeyPairVersion::RSA4096).unwrap(); let secret ="VerySecret123!"; let enc_keypair = DracoonCrypto::encrypt_private_key(secret, new_keypair).unwrap(); ``` 仅解密私钥(用于公共共享): ``` use dco3_crypto::{DracoonCrypto, DracoonRSACrypto, UserKeyPairVersion}; let new_keypair = DracoonCrypto::create_plain_user_keypair(UserKeyPairVersion::RSA4096).unwrap(); let secret ="VerySecret123!"; let enc_keypair = DracoonCrypto::encrypt_private_key(secret, new_keypair).unwrap(); let plain_private_key = DracoonCrypto::decrypt_private_key(secret, &enc_keypair.private_key_container).unwrap(); ``` 解密一个受保护的用户密钥对: ``` use dco3_crypto::{DracoonCrypto, DracoonRSACrypto, UserKeyPairVersion}; let new_keypair = DracoonCrypto::create_plain_user_keypair(UserKeyPairVersion::RSA4096).unwrap(); let secret ="VerySecret123!"; let enc_keypair = DracoonCrypto::encrypt_private_key(secret, new_keypair).unwrap(); let plain_keypair = DracoonCrypto::decrypt_keypair(secret, enc_keypair).unwrap(); ``` 使用公钥封装文件密钥: ``` use dco3_crypto::{DracoonCrypto, DracoonRSACrypto, UserKeyPairVersion}; let keypair = DracoonCrypto::create_plain_user_keypair(UserKeyPairVersion::RSA4096).unwrap(); let mut encryptor = DracoonCrypto::file_encryptor().unwrap(); let _ = encryptor.update(b"Secret message").unwrap(); let finalized = encryptor.finalize().unwrap(); let file_key = DracoonCrypto::encrypt_file_key(finalized.plain_file_key, keypair).unwrap(); ``` 使用私钥解封文件密钥: ``` use dco3_crypto::{DracoonCrypto, DracoonRSACrypto, Encrypt, UserKeyPairVersion}; let keypair = DracoonCrypto::create_plain_user_keypair(UserKeyPairVersion::RSA4096).unwrap(); let (_ciphertext, file_key) = DracoonCrypto::encrypt(b"Secret message", keypair.clone()).unwrap(); let plain_file_key = DracoonCrypto::decrypt_file_key(file_key, keypair).unwrap(); ``` #### 对称加密 对称加密支持以下方式: - `Encrypt`:内存加密 - `Decrypt`:内存解密 - `DracoonCrypto::file_encryptor()`:流式加密 - `DracoonCrypto::file_decryptor()`:流式解密 即时加密消息: ``` use dco3_crypto::{DracoonCrypto, DracoonRSACrypto, Encrypt, UserKeyPairVersion}; let keypair = DracoonCrypto::create_plain_user_keypair(UserKeyPairVersion::RSA4096).unwrap(); let (ciphertext, file_key) = DracoonCrypto::encrypt(b"Secret message", keypair.clone()).unwrap(); // `file_key` is already wrapped for `keypair` ``` 即时解密消息: ``` use dco3_crypto::{Decrypt, DracoonCrypto, DracoonRSACrypto, Encrypt, UserKeyPairVersion}; let keypair = DracoonCrypto::create_plain_user_keypair(UserKeyPairVersion::RSA4096).unwrap(); let (ciphertext, file_key) = DracoonCrypto::encrypt(b"Secret message", keypair.clone()).unwrap(); let plaintext = DracoonCrypto::decrypt(&ciphertext, file_key, keypair).unwrap(); ``` 分块加密: ``` use dco3_crypto::{DracoonCrypto, DracoonRSACrypto, UserKeyPairVersion}; let keypair = DracoonCrypto::create_plain_user_keypair(UserKeyPairVersion::RSA4096).unwrap(); let message = b"Encrypt this very long message in chunks and decrypt it"; let mut encryptor = DracoonCrypto::file_encryptor().unwrap(); let mut ciphertext = Vec::new(); // chunks of 8 bytes for chunk in message.chunks(8) { ciphertext.extend_from_slice(&encryptor.update(chunk).unwrap()); } let finalized = encryptor.finalize().unwrap(); ciphertext.extend_from_slice(&finalized.final_chunk); // wrap the plain file key for the intended recipients let file_key = DracoonCrypto::encrypt_file_key(finalized.plain_file_key, keypair).unwrap(); ``` 分块解密: ``` use dco3_crypto::{DracoonCrypto, DracoonRSACrypto, Encrypt, UserKeyPairVersion}; let keypair = DracoonCrypto::create_plain_user_keypair(UserKeyPairVersion::RSA4096).unwrap(); let message = b"Encrypt this very long message in chunks and decrypt it"; let (ciphertext, file_key) = DracoonCrypto::encrypt(message, keypair.clone()).unwrap(); let mut decryptor = DracoonCrypto::file_decryptor(file_key, keypair).unwrap(); let mut plaintext = Vec::new(); for chunk in ciphertext.chunks(5) { plaintext.extend_from_slice(&decryptor.update(chunk).unwrap()); } plaintext.extend_from_slice(&decryptor.finalize().unwrap()); ```标签:AES-256-GCM, API客户端, Crate, DRACOON, OpenSSL, RSA, Rust, 云配置检测, 加密库, 可视化界面, 安全测试工具, 密码学, 密钥对生成, 对称加密, 库, 应急响应, 手动系统调用, 文件加密, 流式加密, 端到端加密, 网络流量审计, 自动化审计, 通知系统, 非对称加密