pub fn fast_decrypt(data: &[u8], key: &[u8]) -> Vec<u8> {
let mut result = Vec::with_capacity(data.len());
let mut previous: u8 = 0x36;
for (i, &byte) in data.iter().enumerate() {
let swapped = byte.rotate_left(4);
let decrypted = swapped ^ previous ^ (i as u8) ^ key[i % key.len()];
previous = byte;
result.push(decrypted);
}
result
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_fast_decrypt_matches_python() {
let data = [0xAB, 0xCD, 0xEF];
let key = [0x01, 0x02, 0x03];
let result = fast_decrypt(&data, &key);
assert_eq!(result, vec![0x8D, 0x74, 0x32]);
}
}