8个版本 (破坏性)
0.7.0 | 2024年4月23日 |
---|---|
0.6.0 | 2024年3月22日 |
0.5.1 | 2023年8月27日 |
0.5.0 | 2023年5月4日 |
0.1.0 | 2022年12月20日 |
#286 在 密码学
每月 118 次下载
在 2 个crate中使用(通过 dco3)
55KB
837 行
dco3-crypto
DRACOON Crypto utils在Rust中
文档 »
报告错误
dco3-crypto
这是什么?
基于openssl crate的DRACOON加密库的早期工作。
破坏性变更可能在这个早期阶段发生 - 该库正在积极开发中,并依赖于来自dco3
(目前为DRACOON的私有API包装器)的需求。变更将在发行说明中记录。
什么工作完成了?
- 文件密钥的非对称加密/解密(RSA)
- 密钥对生成(RSA)
- 密钥对加密/解密(RSA)
- 消息的对称加密/解密(AES256 GCM)
- 即时加密/解密
- 分块加密/解密
计划做什么?
- 重构非对称加密(将密钥对生成从其他操作中分离出来)
- 使用其他库(如ring)作为openssl绑定的替代品
- 向cargo构建添加功能标志
- 添加端到端测试,使用来自其他SDK / lib的加密数据,并确保在管道中兼容性
提供了什么?
使用此crate当前绑定到最新的openssl版本,并按vendored模式编译(有关详细信息,请参阅openssl)。
如何使用?
请参阅crates.io TL; DR 将以下行添加到您的Cargo.toml文件(依赖项)
dco3_crypto = "0.4.1"
文档
TL; DR使用
必需的导入
该库由几个trait组成,这些trait都由(目前仅)DracoonCrypto
结构体实现。因此,最低必需的导入始终是DracoonCrypto
以及相关的必需trait(DracoonRSACrypto
、Encrypt
、Decrypt
、ChunkedEncryption
、Encrypter
、Decrypter
)。
非对称加密
为了
- 生成(纯文本)用户密钥对
- 加密/解密用户密钥对
- 仅解密私钥
- 使用公钥(用户密钥对)加密文件密钥
- 使用私钥(用户密钥对)解密文件密钥
生成纯文本用户密钥对
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_only(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_private_key(secret, enc_keypair).unwrap();
使用明文用户密钥对或公钥容器加密文件密钥
use dco3_crypto::{DracoonCrypto, DracoonRSACrypto, UserKeypairVersion, Encrypt};
let new_keypair = DracoonCrypto::create_plain_user_keypair(UserKeyPairVersion::RSA4096).unwrap();
// encrypt a message to get a plain file key for demo purposes
let message = b"Secret message";
let (enc_message, plain_file_key) = DracoonCrypto::encrypt(message.to_vec()).unwrap();
// the function also accepts a public key container as argument
let enc_file_key = DracoonCrypto::encrypt_file_key(plain_file_key, plain_keypair).unwrap();
使用明文用户密钥对解密文件密钥
use dco3_crypto::{DracoonCrypto, DracoonRSACrypto, UserKeypairVersion, Encrypt};
let new_keypair = DracoonCrypto::create_plain_user_keypair(UserKeyPairVersion::RSA4096).unwrap();
// encrypt a message to get a plain file key for demo purposes
let message = b"Secret message";
let (enc_message, plain_file_key) = DracoonCrypto::encrypt(message.to_vec()).unwrap();
// the function also accepts a public key container as argument
let enc_file_key = DracoonCrypto::encrypt_file_key(plain_file_key, plain_keypair).unwrap();
// this code is for demo purposes - plain_keypair is consumed above and needs to be
// instantiated again
let plain_file_key = DracoonCrypto::decrypt_file_key(enc_file_key, plain_keypair).unwrap();
对称加密
对称加密具有以下特性
- 加密:内存中加密所需
- 解密:内存中解密所需
- 解密器:用于构建支持分块解密的解密器
- 加密器:用于构建支持分块加密的加密器
- 分块加密:在使用解密器/加密器进行加密和解密时所需
动态加密消息
use dco3_crypto::{DracoonCrypto, Encrypt};
// encrypt a message to get a plain file key for demo purposes
let message = b"Secret message";
let (enc_message, plain_file_key) = DracoonCrypto::encrypt(message.to_vec()).unwrap();
// to encrypt the file key, see asymmetric encryption above
动态解密消息
use dco3_crypto::{DracoonCrypto, Encrypt, Decrypt};
// encrypt a message to get a plain file key for demo purposes
let message = b"Secret message";
let (enc_message, plain_file_key) = DracoonCrypto::encrypt(message.to_vec()).unwrap();
// to decrypt / encrypt the file key, see asymmetric encryption above
let plain_message = DracoonCrypto::decrypt(&enc_message, plain_file_key);
分块加密
use dco3_crypto::{DracoonCrypto, Encrypter, ChunkedEncryption};
let mut message = b"Encrypt this very long message in chunks and decrypt it";
let buff_len = message.len() + 1;
let mut buf = vec![0u8; buff_len];
let mut encrypter = DracoonCrypto::encrypter(&mut buf).unwrap();
let mut count: usize = 0;
// chunks of 8 bytes
const CHUNKSIZE: usize = 8;
let mut chunks = message.chunks(CHUNKSIZE);
while let Some(chunk) = chunks.next() {
count += encrypter.update(&chunk).unwrap();
};
count += encrypter.finalize().unwrap();
let enc_message = encrypter.get_message();
let plain_file_key = encrypter.get_plain_file_key();
分块解密
// importing Encrypt is only necessary for the inital message encryption
use dco3_crypto::{DracoonCrypto, Encrypt, Decrypter, ChunkedEncryption};
use openssl::symm::Cipher;
let message = b"Encrypt this very long message in chunks and decrypt it";
let (message, plain_file_key) = DracoonCrypto::encrypt(message.to_vec()).unwrap();
let buff_len = message.len() + 1;
let mut chunks = message.chunks(5);
let mut buf = vec![0u8; buff_len];
let mut decrypter = DracoonCrypto::decrypter(plain_file_key, &mut buf).unwrap();
let mut count: usize = 0;
while let Some(chunk) = chunks.next() {
count += decrypter.update(&chunk).unwrap();
}
count += decrypter.finalize().unwrap();
let plain_message = std::str::from_utf8(decrypter.get_message()).unwrap();
依赖项
~2.6–7MB
~157K SLoC