在Rust中处理加密和解密,你可以使用第三方库,如ring
、aes
或cryptography
等。这里我将展示如何使用ring
库进行AES加密和解密。首先,你需要在Cargo.toml
文件中添加依赖:
[dependencies]
ring = "0.16.14"
接下来,你可以使用以下代码进行AES加密和解密:
use ring::aead::{self, Aad, Nonce, UnboundKey, AES};
use ring::rand::SystemRandom;
use std::error::Error;
fn main() -> Result<(), Box<dyn Error>> {
// 生成一个随机的密钥
let key = UnboundKey::new(&AES, b"an example very very secret key.")?;
// 创建一个随机的nonce
let nonce = aead::Nonce::try_from(&[0; 12])?;
// 要加密的数据
let plaintext = b"Hello, world!";
// 加密数据
let ciphertext = encrypt(key.clone(), nonce.clone(), plaintext)?;
println!("Encrypted text: {:?}", ciphertext);
// 解密数据
let decrypted_text = decrypt(key, nonce, ciphertext)?;
println!("Decrypted text: {:?}", String::from_utf8_lossy(&decrypted_text));
Ok(())
}
fn encrypt(
key: UnboundKey,
nonce: Nonce,
plaintext: &[u8],
) -> Result<Vec<u8>, Box<dyn Error>> {
let mut buffer = Vec::new();
buffer.extend_from_slice(plaintext);
let ciphertext = key.encrypt(
nonce,
Aad::empty(),
&mut buffer,
ring::aead::EncryptionPadding::Pkcs7,
)?;
Ok(ciphertext)
}
fn decrypt(
key: UnboundKey,
nonce: Nonce,
ciphertext: &[u8],
) -> Result<Vec<u8>, Box<dyn Error>> {
let mut buffer = Vec::with_capacity(ciphertext.len());
buffer.extend_from_slice(ciphertext);
let plaintext = key.decrypt(
nonce,
Aad::empty(),
&mut buffer,
ring::aead::DecryptionPadding::Pkcs7,
)?;
Ok(plaintext)
}
这个示例使用了AES加密算法,CBC模式和PKCS7填充。你可以根据需要调整这些参数。请注意,这个示例仅用于演示目的,实际应用中请确保使用安全的密钥和随机数生成器。