#加密解密 #后量子密码学 #加密密钥 #密钥对 #生成密钥 #功能 #安全

crypt_guard

CryptGuardLib 是一个专为强加密和解密设计的 Rust 库,它集成了后量子密码学,以抵御量子威胁。它面向需要在其 Rust 应用程序中嵌入高级加密功能的开发者。

51 个版本 (稳定)

1.3.3 2024年7月24日
1.2.13 2024年6月25日
1.1.1 2024年3月30日
0.2.9 2024年1月30日

175密码学 类别中排名

Download history 133/week @ 2024-04-25 236/week @ 2024-05-02 4/week @ 2024-05-16 4/week @ 2024-05-23 211/week @ 2024-05-30 46/week @ 2024-06-06 132/week @ 2024-06-13 191/week @ 2024-06-20 50/week @ 2024-06-27 227/week @ 2024-07-04 192/week @ 2024-07-11 554/week @ 2024-07-18 278/week @ 2024-07-25 25/week @ 2024-08-01

每月1,000 次下载
crypt_guard_lite 中使用

MIT 许可证

365KB
6K SLoC

CryptGuard 编程库

Crates.io MIT licensed Documentation Hashnode Blog GitHub Library

简介

CryptGuard 是一个全面的密码学库,提供强大的加密和解密功能。它将传统密码学与后量子算法相结合,确保能够抵御量子计算威胁。面向开发者的 CryptGuard 使应用程序能够应对未来的数字安全挑战。拥抱 CryptGuard,成为您在数字领域保护隐私的可靠盟友。

主要特性和功能

此库支持 AES-256 和 XChaCha20 加密算法,提供了一种安全的数据保护方法。为了满足各种安全需求和操作环境,CryptGuard 与 Kyber512、Kyber768 和 Kyber1024 集成,以确保与后量子密码学标准的兼容性。

对于需要数字签名功能的开发者,CryptGuard 集成了 Falcon 和 Dilithium 算法,提供了创建和验证数字签名的强大选项。这一特性对于需要数据真实性和完整性的应用程序至关重要,确保数字通信保持安全和可验证。

通过在加密数据后附加 HMAC(基于哈希的消息认证码),提供额外的安全层。这一关键特性使加密信息的认证成为可能,确保任何对数据的篡改都能被可靠地检测到。这种 HMAC 附加强调了 CryptGuard 对数据完整性和安全性的全面承诺,为开发者和最终用户提供了关于其数据真实性和安全性的安心。

版本信息

最新功能

新的AES模式: 我们已经实现了块模式AES_GCM_SIV和AES_CTR,作为基于ECB块模式的纯AES实现的替代方案。新的GCM_SIV和CTR块模式实现与随机生成的IV一起工作。我们还添加了一些设备查找函数,现在正在Linux和Windows上实现AES的XTS块模式和系统命令设备处理。还计划实现块模式:CBC和CTR。使用AES_GCM_SIV实现,就像使用XChaCha20一样通过宏来使用。

AES_GCM_SIV加密宏: let (encrypt_message, cipher, iv) = Encryption!(key.to_owned(), 1024, message.to_vec(), passphrase, AES_GCM_SIV);

AES_GCM_SIV解密宏: let decrypted_data = Decryption!(secret_key, [ 1024 | 768 | 512 ], data: Vec<u8>, passphrase: &str, cipher: Vec<u8>, Some(iv): Option<String>, AES_GCM_SIV)

AES_CTR加密宏: let (encrypt_message, cipher, iv) = Encryption!(key.to_owned(), 1024, message.to_vec(), passphrase, AES_CTR);

AES_CTR 解密宏: let decrypted_data = Decryption!(secret_key, [ 1024 | 768 | 512 ], data: Vec<u8>, passphrase: &str, cipher: Vec<u8>, Some(iv): Option<String>, AES_CTR)

XChaCha20Poly1305 加密宏: let (encrypt_message, cipher, nonce) = Encryption!(key.to_owned(), 1024, message.to_vec(), passphrase, XChaCha20Poly1305);

XChaCha20Poly1305 解密宏: let decrypted_data = Decryption!(secret_key, [ 1024 | 768 | 512 ], data: Vec<u8>, passphrase: &str, cipher: Vec<u8>, Some(nonce): Option<String>, XChaCha20Poly1305)

这些宏现在会自动将使用过的值清零,以增强执行过程中的数据安全性。对于其他执行方法,请手动处理以确保数据安全。使用此crate的开发者负责在内存中安全地存储、隐藏和清零密钥,以保护加密信息。由于这些值是生成的,因此我无法控制添加安全措施。请注意,现在这些宏需要数据所有权;为了确保安全性,请避免克隆,而是使用 .to_owned()

关于所有权转移,请查看Git仓库中的src文件夹。它包含tests模块文件夹和测试文件MacroTests.rs,其中使用了提到的方法。对于KyberTests和示例文件encrypt_aes.rs的部分也是如此。

当前版本

当前版本1.3.3专注于通过自动化宏增强数据处理来实现详细的加密操作。这些宏通过封装定义的必要步骤、利用泛型类型和特质定义来简化执行。本版本避免了异步代码,这将在未来的更新中重新引入。喜欢异步实现的用户应使用版本1.0.3。请注意,版本1.0.3使用旧语法,并且通过README间接提供文档,由于缺少注释,没有Cargo自动生成的文档。新版本提供用户友好的语法,减少了大量结构定义的需要,并支持Kyber1024、Kyber768和Kyber512,以及日志功能。

使用宏简化加密和解密

为了使加密和解密过程更加简单,我们引入了新的宏,因为我们只将它们分为字节的加密和自动化的文件加密,从而为手动调用特定函数(如encrypt_msgencrypt_fileencrypt_data及其解密等效函数)的需求提供了替代方案。以下是有效利用这些宏的指南

  • 加密宏:使用Encryption!宏进行无缝加密任务。向它提供一个Kyber公钥及其大小、要加密的数据(作为Vec<u8>)、密码短语(作为字符串切片&str),最后声明应使用哪种加密算法。

    语法:

    Encryption!(public_key, [ 1024 | 768 | 512 ], data: Vec<u8>, passphrase, [ AES | XChaCha20 ])
    
  • 解密宏Decryption!宏简化了解密过程。向它提供一个Kyber密钥、密钥大小、加密数据(作为Vec<u8>)、密码短语、密文,最后声明应使用哪种加密算法。

    语法:

    Decryption!(secret_key, [ 1024 | 768 | 512 ], data: Vec<u8>, passphrase, cipher, | add nonce here, when using XChaCha20 | , [ AES | XChaCha20 ])
    
  • 文件加密宏:我们还实现了一个专门用于文件加密的宏,EncryptFile!()。这个宏与Encryption!类似,但使用PathBuf作为文件路径,而不是Vec<u8>

    语法:

    EncryptFile!(public_key, [ 1024 | 768 | 512 ], data: PathBuf, passphrase, [ AES | XChaCha20 ])
    
  • 文件解密宏:与文件加密宏相对应,DecryptFile!()宏旨在进行文件解密,接受PathBuf而不是Vec<u8>

    语法:

    DecryptFile!(secret_key, [ 1024 | 768 | 512 ], data: PathBuf, passphrase, cipher, | add nonce here, when using XChaCha20 | , [ AES | XChaCha20 ])
    

这些宏旨在使您的加密操作更加直观且更不容易出错,通过去除与选择不同数据类型适当函数相关的复杂性。请注意,使用这些宏时,必须在加密之前将消息转换为Vec<u8>

其他更改

  • 简化语法:我们已经重新设计了 Dilithium 和 Falcon 的使用,采用了一种简单、模块化和灵活的方法,类似于我们的加密和解密语法。这种增强旨在简化开发者的操作。

  • 设计用于通用性:我们的库现在支持 Falcon1024 和 Dilithium5 之外的各种密钥大小。具体来说,我们为需要 512 位密钥大小的用户引入了 Falcon512。对于 Dilithium 用户,我们增加了 Dilithium2 和 Dilithium3 的支持,扩大了可用的加密强度范围。

  • 灵活性和模块化:我们对 Dilithium 和 Falcon 的实现所做的近期更改强调了一种通用和统一的接口。这种方法不仅简化了使用,还使开发者能够轻松地将不同的算法和签名模式集成到他们的项目中。通过抽象复杂性,我们确保您可以专注于最重要的事情——有效地保护您的应用程序。

  • 日志功能:CryptGuard 现在包括一个新的日志功能,旨在提高操作透明度并协助调试过程。这种日志功能详细记录加密过程中的每个重要步骤,同时不损害安全性。具体来说,它记录了密钥生成、消息加密和解密过程的开始和完成,包括使用的加密算法(例如 AES、XChaCha20)和密钥封装机制(例如 Kyber1024)。重要的是,为了维护最高的安全性和隐私标准,CryptGuard 的日志机制被精心设计,以排除敏感信息,如加密密钥、未加密数据、文件路径或任何可识别个人身份的信息。这确保了用户可以从详细的日志中受益,这些日志有助于故障排除和验证加密操作,同时不会泄露敏感数据。

日志功能已被重构为通过过程宏定义,因此现在使用#[crypt_guard::activate_log("LogFilename.txt")]激活,它还要求用户调用initialize_logger();

用法示例

新的加密和签名以及解密宏

CryptGuard 的新版本引入了使用 kyber1024 密钥进行 AES 加密和签名的宏,以及使用 falcon1024 对数据进行签名和解开的宏。由于这些宏是为了快速使用而提供的,因此密钥大小和签名密钥类型默认已设置。CryptGuard 还引入了新的密钥对生成宏。

use crate::{
    cryptography::{
        CryptographicInformation,
        CipherAES,
        hmac_sign::*, 
    },
    Core::kyber::KyberFunctions,
    KDF::*,
    *
}

let message = b"hey, how are you doing?".to_vec();

// Generate falcon1024 keys, alternativly available is the keysize 512.
// You can use for dilithium keypair generation DilithiumKeypair!( [ 2 | 3 | 5 ] )
let (public, secret) = FalconKeypair!(1024);

// Generate kyber1024 keys, alternativly available are the keysizes 768 and 512.
let (public_key, secret_key) = KyberKeypair!(1024);

// Encrypt and sign the data using the new EncryptSign macro, the first key is the public kyber key and the seccond is the secret falcon key.
let (encrypt_message, cipher) = EncryptSign!(public_key, secret, message.clone(), "hey, how are you?").unwrap();

// Decrypt and open the data using the new DecryptOpen macro, the first key is the secret kyber key and the seccond is the public falcon key.
let decrypt_message = DecryptOpen!(secret_key, public, encrypt_message, "hey, how are you?", cipher);

新的签名和验证宏

分离签名
use crypt_guard::{
    *,
    KDF::*,
    error::*,
}
    
let data = b"hey, how are you?".to_vec();
let (public_key, secret_key) = FalconKeypair!(1024);
let sign = Signature!(Falcon, secret_key, 1024, data.clone(), Detached);
let verified = Verify!(Falcon, public_key, 1024, sign.clone(), data.clone(), Detached);
签名消息
use crypt_guard::{
    *,
    KDF::*,
    error::*,
}
    
let data = b"hey, how are you?".to_vec();
let (public_key, secret_key) = DilithiumKeypair!(5);
let sign = Signature!(Dilithium, secret_key, 5, data.clone(), Message);
let verified = Verify!(Dilithium, public_key, 5, sign.clone(), Message);

新的加密和解密宏

use crypt_guard::{
    KyberFunctions,
    KeyControKyber1024,
    KyberKeyFunctions,
    error::*,
    Encryption, 
    Decryption, 
    Kyber1024, 
    Message, 
    AES,
    Kyber,
};

// Since we only allow encryption/ decryption of Vec<u8> or files through selecting a path as &str, please use 
let message = "Hey, how are you doing?".as_bytes().to_owned();
let passphrase = "Test Passphrase";

// Generate key pair
let (public_key, secret_key) = KeyControKyber1024::keypair().expect("Failed to generate keypair");

// Encrypt message with new encryption macro
// Provide it with an instance of Kyber configured for encryption, the data you want to encrypt (this can be a `PathBuf`, a string slice `&str`, or a byte vector `Vec<u8>`), a passphrase (as a string slice `&str`) and the declarator for the symmetric algorithm
let (encrypt_message, cipher) = Encryption!(public_key.clone(), 1024, message, passphrase, AES)?;

// Decrypt message with new decryption macro
// Provide it with a Kyber1024 secret_key for decryption, the data you want to decrypt (this can be a `PathBuf`, a string slice `&str`, or a byte vector `Vec<u8>`), a passphrase (as a string slice `&str`) as well as a ciphertext and the declarator for the symmetric algorithm
let decrypt_message = Decryption!(secret_key, 1024, encrypt_message, passphrase, cipher, AES);
println!("{}", String::from_utf8(decrypt_message?).expect("Failed to convert decrypted message to string"));
Ok(())

使用文件的新宏

use crypt_guard::{
    KyberFunctions,
    KeyControKyber1024,
    KyberKeyFunctions,
    error::*,
    Encryption, 
    Decryption, 
    Kyber1024, 
    Message, 
    AES,
    Kyber,
};

// Since we only allow encryption/ decryption of Vec<u8> or files through selecting a path as &str
let path = "./message.txt";
let passphrase = "Test Passphrase";

// Generate key pair
let (public_key, secret_key) = KeyControKyber1024::keypair().expect("Failed to generate keypair");

// Encrypt message with new encryption macro
// Provide it with an instance of Kyber configured for encryption, the data you want to encrypt (this can be a `PathBuf`, a string slice `&str`, or a byte vector `Vec<u8>`), a passphrase (as a string slice `&str`) and boolean checking if it is a file
let (encrypt_message, cipher) = EncryptFile!(public_key.clone(), 1024, PathBuf::from(&path), passphrase, AES)?;

// Decrypt message with new decryption macro
// Provide it with an instance of Kyber configured for decryption, the data you want to decrypt (this can be a `PathBuf`, a string slice `&str`, or a byte vector `Vec<u8>`), a passphrase (as a string slice `&str`) as well as a ciphertext and boolean checking if it is a file
let decrypt_message = DecryptFile!(secret_key, 1024, PathBuf::from(format!("{}.enc", path)), passphrase, cipher, AES);
println!("{}", String::from_utf8(decrypt_message?).expect("Failed to convert decrypted message to string"));
Ok(())

日志功能

CryptGuard 最近引入了一个新的日志功能,精心设计以提供对加密操作的全面洞察,同时优先考虑安全和隐私。

激活日志即可

激活后,CryptGuard 记录每个重要的加密操作,包括密钥生成、加密和解密过程。这些日志存储在 log.txt 中,为了增强组织和可访问性,也分为自动创建的目录中的单独过程日志,目录名称以日志文件(log)命名。

use crypt_guard::*;

#[activate_log("log.txt")]
fn main() -> Result<(), Box<dyn std::error::Error>> {
    // Initialize the logger struct which in the lib is defined through lazzy_static!
    let _ = initialize_logger(); 

    // Define message and passphrase
    let message = "Hey, how are you doing?";
    let passphrase = "Test Passphrase";

    // Generate key pair
    let (public_key, secret_key) = KeyControKyber1024::keypair().expect("Failed to generate keypair");

    // Instantiate Kyber for encryption with Kyber1024
    let mut encryptor = Kyber::<Encryption, Kyber1024, Files, AES>::new(public_key.clone(), None)?;

    // Encrypt message
    let (encrypt_message, cipher) = encryptor.encrypt_msg(message.clone(), passphrase.clone())?;

    // Instantiate Kyber for decryption with Kyber1024
    let mut decryptor = Kyber::<Decryption, Kyber1024, Files, AES>::new(secret_key, None)?;

    // Decrypt message
    let decrypt_message = decryptor.decrypt_msg(encrypt_message.clone(), passphrase.clone(), cipher)?;

    // Convert Vec<u8> to String for comparison
    let decrypted_text = String::from_utf8(decrypt_message).expect("Failed to convert decrypted message to string");
    println!("{}", decrypted_text);
}

为 dilithium 和 falcon 的新签名语法

使用 Falcon 从“消息”中进行签名和解开

use crypt_guard::KDF::*;

// Create a new keypair
let (public_key, secret_key) = Falcon1024::keypair();

// Save the keys, in the case of Falcon1024, they are saved in the folder ./Falcon1024/key(.pub & .sec)
let _ = Falcon1024::save_public(&public_key);
let _ = Falcon1024::save_secret(&secret_key);

let data = b"Hello, world!".to_vec();
let sign = Signature::<Falcon1024, Message>::new();
// Sign the message
let signed_message = sign.signature(data.clone(), secret_key);

// Open the message
let opened_message = sign.open(signed_message, public_key);

使用 Dilithium 5 创建和验证分离的签名

use crypt_guard::KDF::*;

// Load the public and secret dilithium 5 key
let public_key = Dilithium5::load(&PathBuf::from("./Dilithium5/key.pub"))?;
let secret_key = Dilithium5::load(&PathBuf::from("./Dilithium5/key.sec"))?;

let data = b"Hello, world!".to_vec();

let sign = Signature::<Dilithium5, Detached>::new();

// Create a detached signature
let signature = sign.signature(data.clone(), secret_key);

// Verify the detached signature
let is_valid = sign.verify(data, signature, public_key);

加密操作

生成并保存密钥对

本例演示了如何生成密钥对并将其保存到文件中,利用 KeyControlKyber1024::keypair() 方法生成密钥对,以及 KeyControl::<KeyControlKyber1024> 实例设置和保存密钥。

// Generate a keypair
let (public_key, secret_key) = KeyControKyber1024::keypair().unwrap();

let keycontrol = KeyControl::<KeyControKyber1024>::new();

// Save Public and Secret key while defining the folder (./key).
keycontrol.set_public_key(public_key.clone()).unwrap();
keycontrol.save(KeyTypes::PublicKey, "./key".into()).unwrap();

keycontrol.set_secret_key(secret_key.clone()).unwrap();
keycontrol.save(KeyTypes::SecretKey, "./key".into()).unwrap();

使用 AES 加密消息

let message = "Hey, how are you doing?";
let passphrase = "Test Passphrase";

// Instantiate Kyber for encryption of a message with Kyber1024 and AES
// Fails when not using either of these properties since it would be the wrong type of algorithm, data, keysize or process!
let mut encryptor = Kyber::<Encryption, Kyber1024, Message, AES>::new(public_key.clone(), None)?;

// Encrypt message
let (encrypt_message, cipher) = encryptor.encrypt_msg(message.clone(), passphrase.clone())?;

// Save the ciphertext for decryption in folder ./key
key_control.set_ciphertext(cipher.clone()).unwrap();
key_control.save(KeyTypes::Ciphertext, "./key".into()).unwrap();

使用 AES 加密数据

let message = "Hey, how are you doing?".as_bytes().to_owned();
let passphrase = "Test Passphrase";

// Instantiate Kyber for encryption of a message with Kyber1024 and AES
// Fails when not using either of these properties since it would be the wrong type of algorithm, data, keysize or process!
let mut encryptor = Kyber::<Encryption, Kyber1024, Data, AES>::new(public_key.clone(), None)?;

// Encrypt message
let (encrypt_message, cipher) = encryptor.encrypt_data(message.clone(), passphrase.clone())?;

// Save the ciphertext for decryption in folder ./key
key_control.set_ciphertext(cipher.clone()).unwrap();
key_control.save(KeyTypes::Ciphertext, "./key".into()).unwrap();

使用 AES 解密文件

let cipher = key_control.load(KeyTypes::Ciphertext, Path::new("./key/ciphertext.ct"));
let secret_key = key_control.load(KeyTypes::SecretKey, Path::new("./key/secret_key.sec"));

// Instantiate Kyber for decryption of a message with Kyber1024 and AES
// Fails when not using either of these properties since it would be the wrong type of algorithm, data, keysize or process!
let mut decryptor = Kyber::<Decryption, Kyber1024, Files, AES>::new(secret_key, None)?;

// Decrypt message
let decrypt_message = decryptor.decrypt_msg(encrypt_message.clone(), passphrase.clone(), cipher)?;

// Print the decrypted text
println!("{:?}", String::from_utf8(decrypt_message));

使用 XChaCha20 对写入文件的消息进行加密和解密

let message = "Hey, how are you doing?";

let tmp_dir = TempDir::new().map_err(|e| CryptError::from(e))?;
let tmp_dir = Builder::new().prefix("messages").tempdir().map_err(|e| CryptError::from(e))?;

let enc_path = tmp_dir.path().clone().join("message.txt");
let dec_path = tmp_dir.path().clone().join("message.txt.enc"); 

fs::write(&enc_path, message.as_bytes())?;

let passphrase = "Test Passphrase";

// Generate key pair
let (public_key, secret_key) = KeyControKyber768::keypair().expect("Failed to generate keypair");

// Instantiate Kyber for encryption of a file with Kyber768 and XChaCha20
// Fails when not using either of these properties since it would be the wrong type of algorithm, data, keysize or process!
let mut encryptor = Kyber::<Encryption, Kyber768, Files, XChaCha20>::new(public_key.clone(), None)?;

// Encrypt message
let (encrypt_message, cipher) = encryptor.encrypt_file(enc_path.clone(), passphrase.clone())?;

let nonce = encryptor.get_nonce();

fs::remove_file(enc_path.clone());

// Instantiate Kyber for decryption of a file with Kyber768 and XChaCha20
// Fails when not using either of these properties since it would be the wrong type of algorithm, data, keysize or process!
let mut decryptor = Kyber::<Decryption, Kyber768, Files, XChaCha20>::new(secret_key, Some(nonce?.to_string()))?;

// Decrypt message
let decrypt_message = decryptor.decrypt_file(dec_path.clone(), passphrase.clone(), cipher)?;

关于 CLI 版本的新闻Crates.io

我几乎完成了每个子命令,只剩下 verify 子命令未完成。完成后,我将测试签名和验证。预发布版本现在已在 GitHub 上提供,最终产品将在几天内或最迟在本月底发布!

结论与展望

我们感谢您与我们加密库的互动。随着我们努力改进和进步,您的反馈和贡献是无价的。预期的更新承诺使加密对每个人来说都更加易于访问和直观。

感谢您的支持,以及将安全放在您项目优先事项中的决定。

许可证

CryptGuard 采用 MIT 许可证授权。完整的许可证文本可在存储库中的 LICENSE 文件中找到。

依赖项

~61–85MB
~1.5M SLoC