Skip to main content

mycommon_utils/utils/
aes_util.rs

1use 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
9/// Encrypt a buffer with the given key and iv using AES256/CBC/Pkcs encryption.
10/// 加密(data:加密数据;key:密钥(长度为32的字符串);iv:偏移量(长度为16的字符串))
11pub 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]>();  // 生成一个 IV(初始化向量)
17    // println!("iv:{:?}", iv);
18    let output = encrypt(data, &key, &mut iv);
19    // 将 IV 和加密数据合并
20    let mut result = iv.to_vec();
21    result.extend(&output.expect("Failed to encrypt data"));
22    STANDARD.encode(&result) // 编码为 Base64 字符串
23}
24
25// Encrypt a buffer with the given key and iv using
26// AES-256/CBC/Pkcs encryption.
27fn encrypt(data: &[u8], key: &[u8], iv: &[u8]) -> Result<Vec<u8>, symmetriccipher::SymmetricCipherError> {
28    // Create an encryptor instance of the best performing
29    // type available for the platform.
30    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
46/// Decrypt a buffer with the given key and iv using AES256/CBC/Pkcs encryption.
47/// 解密(data:加密数据;key:密钥(长度为32的字符串);iv:偏移量(长度为16的字符串))
48pub fn aes256_cbc_decrypt(
49    data: &str,
50    key: &str
51) -> String {
52    // 解码 Base64 数据
53    let data = STANDARD.decode(data).expect("Failed to decode Base64");
54    // println!("Decoded data: {:?}", data);
55    let key = string_to_fixed_array_32(key);
56    // 解析 IV 和加密数据
57    let (iv, data) = data.split_at(16);
58    // println!("IV: {:?}", iv);
59    // println!("Encrypted data: {:?}", data);
60    let output = decrypt(data, &key, iv).expect("Failed to decrypt data");
61    // 解密后转换为 UTF-8 字符串
62    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
82/// 将字符串转为[u8; 32]
83fn string_to_fixed_array_32(s: &str) -> [u8; 32] {
84    s.as_bytes().try_into().expect("字符串转为[u8; 32]失败")
85}
86