boytacean_encoding/
rc4.rs

1use boytacean_common::error::Error;
2
3use crate::cipher::Cipher;
4
5pub struct Rc4 {
6    s: [u8; 256],
7    i: u8,
8    j: u8,
9}
10
11impl Rc4 {
12    pub fn new(key: &[u8]) -> Self {
13        let mut s: [u8; 256] = [0; 256];
14        for (i, v) in s.iter_mut().enumerate() {
15            *v = i as u8;
16        }
17
18        let key_len = key.len();
19        if key_len > 0 {
20            let mut j = 0;
21            for i in 0..256 {
22                j = (j + s[i] as usize + key[i % key_len] as usize) % 256;
23                s.swap(i, j);
24            }
25        }
26
27        Rc4 { s, i: 0, j: 0 }
28    }
29
30    pub fn process(&mut self, data: &mut [u8]) {
31        for byte in data.iter_mut() {
32            self.i = self.i.wrapping_add(1);
33            self.j = self.j.wrapping_add(self.s[self.i as usize]);
34            self.s.swap(self.i as usize, self.j as usize);
35            let k =
36                self.s[(self.s[self.i as usize].wrapping_add(self.s[self.j as usize])) as usize];
37            *byte ^= k;
38        }
39    }
40}
41
42impl Cipher for Rc4 {
43    type EncryptOptions = ();
44    type DecryptOptions = ();
45
46    fn encrypt(data: &mut [u8], key: &[u8], _options: &Self::EncryptOptions) -> Result<(), Error> {
47        let mut rc4 = Rc4::new(key);
48        rc4.process(data);
49        Ok(())
50    }
51
52    fn decrypt(data: &mut [u8], key: &[u8], options: &Self::DecryptOptions) -> Result<(), Error> {
53        Self::encrypt(data, key, options)
54    }
55}
56
57pub fn encrypt_rc4(data: &mut [u8], key: &[u8]) -> Result<(), Error> {
58    Rc4::encrypt(data, key, &())
59}
60
61pub fn decrypt_rc4(data: &mut [u8], key: &[u8]) -> Result<(), Error> {
62    encrypt_rc4(data, key)
63}
64
65#[cfg(test)]
66mod tests {
67    use super::Rc4;
68
69    #[test]
70    fn test_rc4_initialization() {
71        let key = b"key";
72        let rc4 = Rc4::new(key);
73        assert_eq!(rc4.s.len(), 256);
74    }
75
76    #[test]
77    fn test_rc4_encryption_decryption() {
78        let key = b"supersecretkey";
79        let plaintext = b"hello world";
80        let mut data = plaintext.to_vec();
81
82        let mut rc4 = Rc4::new(key);
83        rc4.process(&mut data);
84        assert_ne!(&data, plaintext);
85
86        let mut rc4 = Rc4::new(key);
87        rc4.process(&mut data);
88        assert_eq!(&data, plaintext);
89    }
90
91    #[test]
92    fn test_rc4_empty_key() {
93        let key = b"";
94        let mut data = b"hello world".to_vec();
95
96        let mut rc4 = Rc4::new(key);
97        rc4.process(&mut data);
98
99        let mut rc4 = Rc4::new(key);
100        rc4.process(&mut data);
101        assert_eq!(data, b"hello world");
102    }
103
104    #[test]
105    fn test_rc4_empty_data() {
106        let key = b"supersecretkey";
107        let mut data: Vec<u8> = vec![];
108
109        let mut rc4 = Rc4::new(key);
110        rc4.process(&mut data);
111
112        let mut rc4 = Rc4::new(key);
113        rc4.process(&mut data);
114        assert!(data.is_empty());
115    }
116
117    #[test]
118    fn test_rc4_different_keys() {
119        let key1 = b"key1";
120        let key2 = b"key2";
121        let plaintext = b"hello world";
122        let mut data1 = plaintext.to_vec();
123        let mut data2 = plaintext.to_vec();
124
125        let mut rc4 = Rc4::new(key1);
126        rc4.process(&mut data1);
127
128        let mut rc4 = Rc4::new(key2);
129        rc4.process(&mut data2);
130        assert_ne!(data1, data2);
131
132        let mut rc4 = Rc4::new(key1);
133        rc4.process(&mut data1);
134
135        let mut rc4 = Rc4::new(key2);
136        rc4.process(&mut data2);
137        assert_eq!(data1, plaintext);
138        assert_eq!(data2, plaintext);
139    }
140}