1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
#[macro_use]
extern crate lazy_static;
use openssl::symm::{Cipher, encrypt, decrypt};
pub mod cli;
pub mod logic;
pub const AES_IV: &[u8] = b",E@*{O.x=#z~}C>Z";
pub const DES_IV: &[u8] = b"k+Q|R](h";
lazy_static! {
pub static ref AES_CIPHER: Cipher = Cipher::aes_256_cfb128();
pub static ref DES_CIPHER: Cipher = Cipher::des_ede3_cfb64();
}
pub fn aes_enc(key: &[u8]) -> impl FnOnce(&[u8]) -> Vec<u8> + '_ {
move |data| encrypt(*AES_CIPHER, key, Some(AES_IV), data).unwrap()
}
pub fn aes_dec(key: &[u8]) -> impl FnOnce(&[u8]) -> Vec<u8> + '_ {
move |data| decrypt(*AES_CIPHER, key, Some(AES_IV), data).unwrap()
}
pub fn des_enc(key: &[u8]) -> impl FnOnce(&[u8]) -> Vec<u8> + '_ {
move |data| encrypt(*DES_CIPHER, key, Some(DES_IV), data).unwrap()
}
pub fn des_dec(key: &[u8]) -> impl FnOnce(&[u8]) -> Vec<u8> + '_ {
move |data| decrypt(*DES_CIPHER, key, Some(DES_IV), data).unwrap()
}
pub trait Padding {
fn padding(self, n: usize) -> String;
}
impl Padding for &str {
fn padding(self, n: usize) -> String {
if self.len() < n {
let init = String::from("<Ra{V)*t%o&:`1q^/Y|#U+k-W$'Fl7cJ");
format!("{}{}", self, &init[..n-self.len()])
} else { self.to_string() }
}
}