mirror of
https://github.com/storytold/pdfcraft.git
synced 2026-10-26 11:08:48 -06:00
23 lines
716 B
Rust
23 lines
716 B
Rust
//! RC4 (used by PDF security handler revisions 2–4). Encryption and decryption are the same.
|
||
|
||
pub fn rc4(key: &[u8], data: &[u8]) -> Vec<u8> {
|
||
if key.is_empty() {
|
||
return data.to_vec();
|
||
}
|
||
let mut s: [u8; 256] = std::array::from_fn(|i| i as u8);
|
||
let mut j: u8 = 0;
|
||
for i in 0..256 {
|
||
j = j.wrapping_add(s[i]).wrapping_add(key[i % key.len()]);
|
||
s.swap(i, j as usize);
|
||
}
|
||
let (mut i, mut j) = (0u8, 0u8);
|
||
data.iter()
|
||
.map(|b| {
|
||
i = i.wrapping_add(1);
|
||
j = j.wrapping_add(s[i as usize]);
|
||
s.swap(i as usize, j as usize);
|
||
b ^ s[s[i as usize].wrapping_add(s[j as usize]) as usize]
|
||
})
|
||
.collect()
|
||
}
|