mycommon_utils/utils/
aes_util.rs1use base64::{Engine};
2use base64::engine::general_purpose::STANDARD;
3use crypto::{aes, symmetriccipher};
4use crypto::aes::KeySize::KeySize256;
5use crypto::blockmodes::PkcsPadding;
6use crypto::buffer::{BufferResult, ReadBuffer, RefReadBuffer, RefWriteBuffer, WriteBuffer};
7use rand::random;
8
9pub fn aes256_cbc_encrypt(
12 data: &[u8],
13 key: &str,
14) -> String {
15 let key = string_to_fixed_array_32(key);
16 let mut iv = random::<[u8; 16]>(); let output = encrypt(data, &key, &mut iv);
19 let mut result = iv.to_vec();
21 result.extend(&output.expect("Failed to encrypt data"));
22 STANDARD.encode(&result) }
24
25fn encrypt(data: &[u8], key: &[u8], iv: &[u8]) -> Result<Vec<u8>, symmetriccipher::SymmetricCipherError> {
28 let mut encryptor = aes::cbc_encryptor(KeySize256, key, iv, PkcsPadding);
31 let mut final_result = Vec::<u8>::new();
32 let mut read_buffer = RefReadBuffer::new(data);
33 let mut buffer = [0; 4096];
34 let mut write_buffer = RefWriteBuffer::new(&mut buffer);
35 loop {
36 let result = encryptor.encrypt(&mut read_buffer, &mut write_buffer, true)?;
37 final_result.extend(write_buffer.take_read_buffer().take_remaining().iter().map(|&i| i));
38 match result {
39 BufferResult::BufferUnderflow => break,
40 BufferResult::BufferOverflow => { }
41 }
42 }
43 Ok(final_result)
44}
45
46pub fn aes256_cbc_decrypt(
49 data: &str,
50 key: &str
51) -> String {
52 let data = STANDARD.decode(data).expect("Failed to decode Base64");
54 let key = string_to_fixed_array_32(key);
56 let (iv, data) = data.split_at(16);
58 let output = decrypt(data, &key, iv).expect("Failed to decrypt data");
61 String::from_utf8(output).expect("Failed to convert to string")
63}
64
65fn decrypt(encrypted_data: &[u8], key: &[u8], iv: &[u8]) -> Result<Vec<u8>, symmetriccipher::SymmetricCipherError> {
66 let mut decryptor = aes::cbc_decryptor(KeySize256, key, iv, PkcsPadding);
67 let mut final_result = Vec::<u8>::new();
68 let mut read_buffer = RefReadBuffer::new(encrypted_data);
69 let mut buffer = [0; 4096];
70 let mut write_buffer = RefWriteBuffer::new(&mut buffer);
71 loop {
72 let result = decryptor.decrypt(&mut read_buffer, &mut write_buffer, true)?;
73 final_result.extend(write_buffer.take_read_buffer().take_remaining().iter().map(|&i| i));
74 match result {
75 BufferResult::BufferUnderflow => break,
76 BufferResult::BufferOverflow => { }
77 }
78 }
79 Ok(final_result)
80}
81
82fn string_to_fixed_array_32(s: &str) -> [u8; 32] {
84 s.as_bytes().try_into().expect("字符串转为[u8; 32]失败")
85}
86