#openssl #dracoon

dco3_crypto

DRACOON在Rust中的对称和非对称加密

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密码学

Download history 164/week @ 2024-04-22 36/week @ 2024-04-29 2/week @ 2024-05-13 32/week @ 2024-05-20 16/week @ 2024-05-27 9/week @ 2024-06-03 4/week @ 2024-06-10 7/week @ 2024-06-17 1/week @ 2024-06-24 53/week @ 2024-07-01 37/week @ 2024-07-15 66/week @ 2024-07-22 15/week @ 2024-07-29

每月 118 次下载
2 个crate中使用(通过 dco3

MIT 许可证

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"

文档

文档 所有详细文档均通过docs.rs上的文档提供

TL; DR使用

必需的导入

该库由几个trait组成,这些trait都由(目前仅)DracoonCrypto结构体实现。因此,最低必需的导入始终是DracoonCrypto以及相关的必需trait(DracoonRSACryptoEncryptDecryptChunkedEncryptionEncrypterDecrypter)。

非对称加密

为了

  • 生成(纯文本)用户密钥对
  • 加密/解密用户密钥对
  • 仅解密私钥
  • 使用公钥(用户密钥对)加密文件密钥
  • 使用私钥(用户密钥对)解密文件密钥

生成纯文本用户密钥对

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