AES加解密 in Rust
依赖环境
toml
[dependencies]
aes="0.7.5"
hex="0.4.3"
block-modes="0.8.1"
hex-literal="0.3.3"
代码
rust
mod aeshelper;
use aeshelper::AESHelper;
use hex_literal::hex;
use std::str;
fn main() {
let message = String::from("xxxxxxxxxxxxxxxx");
let key = hex!("000102030405060708090A0B0C0D0000102030405060708090A0B0C0D0E0FE0F");
println!("Message: {}", message);
let plaintext = message.as_bytes();
let mut aes_helper = AESHelper::new( &key);
let ciphertext = aes_helper.aes_encrypt(plaintext);
println!("Ciphertext: {:?}", hex::encode(&ciphertext));
let decrypted_ciphertext = aes_helper.aes_decrypt(&ciphertext);
println!("Plaintext: {:?}", str::from_utf8(&decrypted_ciphertext).unwrap());
}
rust
use aes::Aes256;
use block_modes::block_padding::Pkcs7;
use block_modes::{BlockMode, Cbc};
type Aes256Cbc = Cbc<Aes256, Pkcs7>;
pub struct AESHelper {
iv: Vec<u8>,
key: Vec<u8>,
}
impl AESHelper {
pub fn new(key: &[u8]) -> AESHelper {
AESHelper {
key: key.to_vec(),
iv: (&key[0..16]).to_vec(),
}
}
pub fn aes_encrypt(&mut self, plaintext: &[u8]) -> Vec<u8> {
let cipher = Aes256Cbc::new_from_slices(&self.key, &self.iv).unwrap();
let pos = plaintext.len();
let mut buffer = [0u8; 256];
buffer[..pos].copy_from_slice(plaintext);
let ciphertext = cipher.encrypt(&mut buffer, pos).unwrap();
ciphertext.to_vec()
}
pub fn aes_decrypt(&mut self, ciphertext: &[u8]) -> Vec<u8> {
let cipher = Aes256Cbc::new_from_slices(&self.key, &self.iv).unwrap();
let mut buf = ciphertext.to_vec();
let decrypted_ciphertext = cipher.decrypt(&mut buf).unwrap();
decrypted_ciphertext.to_vec()
}
}