pub mod aeskit {
use aes::Aes256;
use cbc::{Decryptor, Encryptor};
use cipher::block_padding::Pkcs7;
use cipher::{BlockDecryptMut, BlockEncryptMut, KeyIvInit};
use generic_array::GenericArray;
use rand::Rng;
type Aes256CbcEnc = Encryptor<Aes256>;
type Aes256CbcDec = Decryptor<Aes256>;
pub fn aes_encrypt(plaintext: &[u8], key: &[u8], iv: &[u8]) -> Vec<u8> {
let key = GenericArray::from_slice(key);
let iv = GenericArray::from_slice(iv);
let mut buf = [0u8; 48];
let pt_len = plaintext.len();
buf[..pt_len].copy_from_slice(&plaintext);
let ct = Aes256CbcEnc::new(key, iv)
.encrypt_padded_b2b_mut::<Pkcs7>(&plaintext, &mut buf)
.unwrap();
ct.to_vec()
}
pub fn aes_decrypt(ciphertext: &[u8], key: &[u8], iv: &[u8]) -> Vec<u8> {
let key = GenericArray::from_slice(key);
let iv = GenericArray::from_slice(iv);
let mut buf = [0u8; 48];
let pt = Aes256CbcDec::new(key, iv)
.decrypt_padded_b2b_mut::<Pkcs7>(&ciphertext, &mut buf)
.unwrap();
pt.to_vec()
}
pub fn generate_aes_key_iv() -> (Vec<u8>, Vec<u8>) {
let mut rng = rand::thread_rng();
let key: Vec<u8> = (0..32).map(|_| rng.gen()).collect();
let iv: Vec<u8> = (0..16).map(|_| rng.gen()).collect();
(key, iv)
}
}
pub mod rsakit {
use rand::prelude::ThreadRng;
use rsa::{Pkcs1v15Encrypt, RsaPrivateKey, RsaPublicKey};
pub fn generate_rsa_keys() -> (ThreadRng, RsaPublicKey, RsaPrivateKey) {
let mut rng = rand::thread_rng();
let bits = 2048;
let pri_key: RsaPrivateKey = RsaPrivateKey::new(&mut rng, bits).expect("generate key fail");
let pub_key: RsaPublicKey = RsaPublicKey::from(&pri_key);
(rng, pub_key, pri_key)
}
pub fn rsa_encrypt(rng: &mut ThreadRng, key: &RsaPublicKey, plaintext: &[u8]) -> Vec<u8> {
key.encrypt(rng, Pkcs1v15Encrypt, &plaintext[..])
.expect("failed to encrypt")
}
pub fn rsa_decrypt(key: &RsaPrivateKey, ciphertext: &[u8]) -> Vec<u8> {
key.decrypt(Pkcs1v15Encrypt, ciphertext).unwrap()
}
}