boytacean_encoding/
rc4.rs1use 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}