xmu_health_report_rust_sdk/reporter/
encrypt.rs

1use aes::Aes128;
2use base64::encode;
3use block_modes::{BlockMode, Cbc};
4use block_modes::block_padding::Pkcs7;
5use rand::Rng;
6use regex::Regex;
7
8type AesCbc = Cbc<Aes128, Pkcs7>;
9
10const CHARSET: &str = "ABCDEFGHJKMNPQRSTWXYZabcdefhijkmnprstwxyz2345678";
11
12pub fn rand_str(len: i32) -> String {
13  let mut res = String::new();
14  let charset: Vec<char> = CHARSET.chars().collect();
15  let charset_length = charset.len();
16  for _i in 0..len {
17    let index = rand::thread_rng().gen_range(0..charset_length);
18    res += &charset[index as usize].to_string();
19  }
20  res
21}
22
23pub fn gas<'a>(data: &'a str, key: &'a str, iv: &'a str) -> String {
24  let reg = Regex::new(r"(^\s+)|(\s+$)").unwrap();
25  let trimed_key = reg.replace_all(key, "");
26
27  let cipher = AesCbc::new_from_slices(trimed_key.as_bytes(), iv.as_bytes()).unwrap();
28  let cipher_text = cipher.encrypt_vec(data.as_bytes());
29  let result = encode(cipher_text);
30
31  result
32}
33
34/// 统一身份认证 AES-CBC 加密函数
35pub fn encrypt_aes_cbc<'a>(data: &'a str, p1: &'a str) -> String {
36  if p1.len() == 0 {
37    return data.to_owned();
38  }
39  let data = rand_str(64) + data;
40  let iv = rand_str(16);
41  let result = gas(&data, p1, &iv);
42
43  result
44}