cryptatools_core/utils/
alphabets.rs

1use itertools::Itertools;
2use bimap::btree::BiBTreeMap;
3
4///```
5/// use cryptatools_core::utils::{convert::Encode, alphabets::split_bytes_by_characters_representation, alphabets::Alphabet};
6/// 
7/// let ascii_alphabet = Alphabet::new_empty().ascii_encoding();
8/// let plaintext = split_bytes_by_characters_representation(&ascii_alphabet, Encode::from_ascii_to_u8(String::from("the quick brown roman fox jumped over the lazy ostrogoth dog")));
9/// assert_eq!(plaintext, [[116], [104], [101], [32], [113], [117], [105], [99], [107], [32], [98], [114], [111], [119], [110], [32], [114], [111], [109], [97], [110], [32], [102], [111], [120], [32], [106], [117], [109], [112], [101], [100], [32], [111], [118], [101], [114], [32], [116], [104], [101], [32], [108], [97], [122], [121], [32], [111], [115], [116], [114], [111], [103], [111], [116], [104], [32], [100], [111], [103]]);
10/// assert_eq!(plaintext.len(), String::from("the quick brown roman fox jumped over the lazy ostrogoth dog").len());
11/// ```
12pub fn split_bytes_by_characters_representation(encoding: &Alphabet, text: Vec<u8>) -> Vec<Vec<u8>> {
13    let mut set_of_chars: Vec<Vec<u8>> = vec![];
14
15    let mut stack_of_chars = vec![];
16    for opcode in text {
17        stack_of_chars.push(opcode);
18        if encoding.encoding.contains_right(&stack_of_chars) {
19            set_of_chars.push(stack_of_chars);
20            stack_of_chars = vec![];
21        } else {
22            stack_of_chars.push(opcode);
23        }
24    }
25
26    set_of_chars
27}
28
29pub fn uniffy_opcode_group(text: Vec<Vec<u8>>) -> Vec<u8> {
30    text.concat()
31}
32
33pub const PRINTABLE: &'static str = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ!\"#$%&\'()*+,-./:;<=>?@[\\]^_`{|}~ \t\n\r\x0b\x0c";
34//pub const ASCII_ALPHABET: &'static str = "\x00\x01\x02\x03\x04\x05\x06\x07\x08\t\n\x0b\x0c\r\x0e\x0f\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f !\"#$%&\'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~\x7f\\u128";
35pub const UU_ENCODING_ALPHABET: &'static str = " !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`";
36
37#[derive(PartialEq, Eq)]
38#[derive(Debug)]
39#[derive(Clone)]
40pub struct Encoding {
41    pub str: String,
42    pub bytes: Vec<u8>,
43}
44
45#[derive(Clone)]
46pub struct Alphabet {
47    /// Alphabet encoding.
48    pub encoding: BiBTreeMap<String, Vec<u8>>,
49}
50
51impl Alphabet {
52    pub fn new(encoding: Vec<Encoding>) -> Self {
53        let encoding = encoding.into_iter().map(|e| (e.str, e.bytes))
54            .collect::<BiBTreeMap<_, _>>();
55        Alphabet {
56            encoding,
57        }
58    }
59
60    pub fn new_empty() -> Self {
61        Alphabet {
62            encoding: BiBTreeMap::new(),
63        }
64    }
65
66    /// Builder to add encoding to the encoding.
67    pub fn ascii_printable_only_encoding(&mut self) -> Self {
68        self.encoding = BiBTreeMap::from_iter(vec![
69        (String::from(" "), vec![0x20]),
70        (String::from("!"), vec![0x21]),
71        (String::from("\""), vec![0x22]),
72        (String::from("#"), vec![0x23]),
73        (String::from("$"), vec![0x24]),
74        (String::from("%"), vec![0x25]),
75        (String::from("&"), vec![0x26]),
76        (String::from("'"), vec![0x27]),
77        (String::from("("), vec![0x28]),
78        (String::from(")"), vec![0x29]),
79        (String::from("*"), vec![0x2a]),
80        (String::from("+"), vec![0x2b]),
81        (String::from(","), vec![0x2c]),
82        (String::from("-"), vec![0x2d]),
83        (String::from("."), vec![0x2e]),
84        (String::from("/"), vec![0x2f]),
85        (String::from("0"), vec![0x30]),
86        (String::from("1"), vec![0x31]),
87        (String::from("2"), vec![0x32]),
88        (String::from("3"), vec![0x33]),
89        (String::from("4"), vec![0x34]),
90        (String::from("5"), vec![0x35]),
91        (String::from("6"), vec![0x36]),
92        (String::from("7"), vec![0x37]),
93        (String::from("8"), vec![0x38]),
94        (String::from("9"), vec![0x39]),
95        (String::from(":"), vec![0x3a]),
96        (String::from(";"), vec![0x3b]),
97        (String::from("<"), vec![0x3c]),
98        (String::from("="), vec![0x3d]),
99        (String::from(">"), vec![0x3e]),
100        (String::from("?"), vec![0x3f]),
101        (String::from("@"), vec![0x40]),
102        (String::from("A"), vec![0x41]),
103        (String::from("B"), vec![0x42]),
104        (String::from("C"), vec![0x43]),
105        (String::from("D"), vec![0x44]),
106        (String::from("E"), vec![0x45]),
107        (String::from("F"), vec![0x46]),
108        (String::from("G"), vec![0x47]),
109        (String::from("H"), vec![0x48]),
110        (String::from("I"), vec![0x49]),
111        (String::from("J"), vec![0x4a]),
112        (String::from("K"), vec![0x4b]),
113        (String::from("L"), vec![0x4c]),
114        (String::from("M"), vec![0x4d]),
115        (String::from("N"), vec![0x4e]),
116        (String::from("O"), vec![0x4f]),
117        (String::from("P"), vec![0x50]),
118        (String::from("Q"), vec![0x51]),
119        (String::from("R"), vec![0x52]),
120        (String::from("S"), vec![0x53]),
121        (String::from("T"), vec![0x54]),
122        (String::from("U"), vec![0x55]),
123        (String::from("V"), vec![0x56]),
124        (String::from("W"), vec![0x57]),
125        (String::from("X"), vec![0x58]),
126        (String::from("Y"), vec![0x59]),
127        (String::from("Z"), vec![0x5a]),
128        (String::from("["), vec![0x5b]),
129        (String::from("\\"), vec![0x5c]),
130        (String::from("]"), vec![0x5d]),
131        (String::from("^"), vec![0x5e]),
132        (String::from("_"), vec![0x5f]),
133        (String::from("`"), vec![0x60]),
134        (String::from("a"), vec![0x61]),
135        (String::from("b"), vec![0x62]),
136        (String::from("c"), vec![0x63]),
137        (String::from("d"), vec![0x64]),
138        (String::from("e"), vec![0x65]),
139        (String::from("f"), vec![0x66]),
140        (String::from("g"), vec![0x67]),
141        (String::from("h"), vec![0x68]),
142        (String::from("i"), vec![0x69]),
143        (String::from("j"), vec![0x6a]),
144        (String::from("k"), vec![0x6b]),
145        (String::from("l"), vec![0x6c]),
146        (String::from("m"), vec![0x6d]),
147        (String::from("n"), vec![0x6e]),
148        (String::from("o"), vec![0x6f]),
149        (String::from("p"), vec![0x70]),
150        (String::from("q"), vec![0x71]),
151        (String::from("r"), vec![0x72]),
152        (String::from("s"), vec![0x73]),
153        (String::from("t"), vec![0x74]),
154        (String::from("u"), vec![0x75]),
155        (String::from("v"), vec![0x76]),
156        (String::from("w"), vec![0x77]),
157        (String::from("x"), vec![0x78]),
158        (String::from("y"), vec![0x79]),
159        (String::from("z"), vec![0x7a]),
160        (String::from("{"), vec![0x7b]),
161        (String::from("|"), vec![0x7c]),
162        (String::from("}"), vec![0x7d]),
163        (String::from("~"), vec![0x7e])]);
164
165        let encoding = self.encoding.clone();
166
167        Alphabet {
168            encoding: encoding
169        }
170    }
171
172    pub fn ascii_encoding(&mut self) -> Self {
173        let mut encoding = BiBTreeMap::new();
174        encoding.insert(String::from("\x00"), vec![0x00]);
175        encoding.insert(String::from("\x01"), vec![0x01]);
176        encoding.insert(String::from("\x02"), vec![0x02]);
177        encoding.insert(String::from("\x03"), vec![0x03]);
178        encoding.insert(String::from("\x04"), vec![0x04]);
179        encoding.insert(String::from("\x05"), vec![0x05]);
180        encoding.insert(String::from("\x06"), vec![0x06]);
181        encoding.insert(String::from("\x07"), vec![0x07]);
182        encoding.insert(String::from("\x08"), vec![0x08]);
183        encoding.insert(String::from("\x09"), vec![0x09]);
184        encoding.insert(String::from("\x0a"), vec![0x0a]);
185        encoding.insert(String::from("\x0b"), vec![0x0b]);
186        encoding.insert(String::from("\x0c"), vec![0x0c]);
187        encoding.insert(String::from("\x0d"), vec![0x0d]);
188        encoding.insert(String::from("\x0e"), vec![0x0e]);
189        encoding.insert(String::from("\x0f"), vec![0x0f]);
190        encoding.insert(String::from("\x10"), vec![0x10]);
191        encoding.insert(String::from("\x11"), vec![0x11]);
192        encoding.insert(String::from("\x12"), vec![0x12]);
193        encoding.insert(String::from("\x13"), vec![0x13]);
194        encoding.insert(String::from("\x14"), vec![0x14]);
195        encoding.insert(String::from("\x15"), vec![0x15]);
196        encoding.insert(String::from("\x16"), vec![0x16]);
197        encoding.insert(String::from("\x17"), vec![0x17]);
198        encoding.insert(String::from("\x18"), vec![0x18]);
199        encoding.insert(String::from("\x19"), vec![0x19]);
200        encoding.insert(String::from("\x1a"), vec![0x1a]);
201        encoding.insert(String::from("\x1b"), vec![0x1b]);
202        encoding.insert(String::from("\x1c"), vec![0x1c]);
203        encoding.insert(String::from("\x1d"), vec![0x1d]);
204        encoding.insert(String::from("\x1e"), vec![0x1e]);
205        encoding.insert(String::from("\x1f"), vec![0x1f]);
206        encoding.insert(String::from(" "), vec![0x20]);
207        encoding.insert(String::from("!"), vec![0x21]);
208        encoding.insert(String::from("\""), vec![0x22]);
209        encoding.insert(String::from("#"), vec![0x23]);
210        encoding.insert(String::from("$"), vec![0x24]);
211        encoding.insert(String::from("%"), vec![0x25]);
212        encoding.insert(String::from("&"), vec![0x26]);
213        encoding.insert(String::from("'"), vec![0x27]);
214        encoding.insert(String::from("("), vec![0x28]);
215        encoding.insert(String::from(")"), vec![0x29]);
216        encoding.insert(String::from("*"), vec![0x2a]);
217        encoding.insert(String::from("+"), vec![0x2b]);
218        encoding.insert(String::from(","), vec![0x2c]);
219        encoding.insert(String::from("-"), vec![0x2d]);
220        encoding.insert(String::from("."), vec![0x2e]);
221        encoding.insert(String::from("/"), vec![0x2f]);
222        encoding.insert(String::from("0"), vec![0x30]);
223        encoding.insert(String::from("1"), vec![0x31]);
224        encoding.insert(String::from("2"), vec![0x32]);
225        encoding.insert(String::from("3"), vec![0x33]);
226        encoding.insert(String::from("4"), vec![0x34]);
227        encoding.insert(String::from("5"), vec![0x35]);
228        encoding.insert(String::from("6"), vec![0x36]);
229        encoding.insert(String::from("7"), vec![0x37]);
230        encoding.insert(String::from("8"), vec![0x38]);
231        encoding.insert(String::from("9"), vec![0x39]);
232        encoding.insert(String::from(":"), vec![0x3a]);
233        encoding.insert(String::from(";"), vec![0x3b]);
234        encoding.insert(String::from("<"), vec![0x3c]);
235        encoding.insert(String::from("="), vec![0x3d]);
236        encoding.insert(String::from(">"), vec![0x3e]);
237        encoding.insert(String::from("?"), vec![0x3f]);
238        encoding.insert(String::from("@"), vec![0x40]);
239        encoding.insert(String::from("A"), vec![0x41]);
240        encoding.insert(String::from("B"), vec![0x42]);
241        encoding.insert(String::from("C"), vec![0x43]);
242        encoding.insert(String::from("D"), vec![0x44]);
243        encoding.insert(String::from("E"), vec![0x45]);
244        encoding.insert(String::from("F"), vec![0x46]);
245        encoding.insert(String::from("G"), vec![0x47]);
246        encoding.insert(String::from("H"), vec![0x48]);
247        encoding.insert(String::from("I"), vec![0x49]);
248        encoding.insert(String::from("J"), vec![0x4a]);
249        encoding.insert(String::from("K"), vec![0x4b]);
250        encoding.insert(String::from("L"), vec![0x4c]);
251        encoding.insert(String::from("M"), vec![0x4d]);
252        encoding.insert(String::from("N"), vec![0x4e]);
253        encoding.insert(String::from("O"), vec![0x4f]);
254        encoding.insert(String::from("P"), vec![0x50]);
255        encoding.insert(String::from("Q"), vec![0x51]);
256        encoding.insert(String::from("R"), vec![0x52]);
257        encoding.insert(String::from("S"), vec![0x53]);
258        encoding.insert(String::from("T"), vec![0x54]);
259        encoding.insert(String::from("U"), vec![0x55]);
260        encoding.insert(String::from("V"), vec![0x56]);
261        encoding.insert(String::from("W"), vec![0x57]);
262        encoding.insert(String::from("X"), vec![0x58]);
263        encoding.insert(String::from("Y"), vec![0x59]);
264        encoding.insert(String::from("Z"), vec![0x5a]);
265        encoding.insert(String::from("["), vec![0x5b]);
266        encoding.insert(String::from("\\"), vec![0x5c]);
267        encoding.insert(String::from("]"), vec![0x5d]);
268        encoding.insert(String::from("^"), vec![0x5e]);
269        encoding.insert(String::from("_"), vec![0x5f]);
270        encoding.insert(String::from("`"), vec![0x60]);
271        encoding.insert(String::from("a"), vec![0x61]);
272        encoding.insert(String::from("b"), vec![0x62]);
273        encoding.insert(String::from("c"), vec![0x63]);
274        encoding.insert(String::from("d"), vec![0x64]);
275        encoding.insert(String::from("e"), vec![0x65]);
276        encoding.insert(String::from("f"), vec![0x66]);
277        encoding.insert(String::from("g"), vec![0x67]);
278        encoding.insert(String::from("h"), vec![0x68]);
279        encoding.insert(String::from("i"), vec![0x69]);
280        encoding.insert(String::from("j"), vec![0x6a]);
281        encoding.insert(String::from("k"), vec![0x6b]);
282        encoding.insert(String::from("l"), vec![0x6c]);
283        encoding.insert(String::from("m"), vec![0x6d]);
284        encoding.insert(String::from("n"), vec![0x6e]);
285        encoding.insert(String::from("o"), vec![0x6f]);
286        encoding.insert(String::from("p"), vec![0x70]);
287        encoding.insert(String::from("q"), vec![0x71]);
288        encoding.insert(String::from("r"), vec![0x72]);
289        encoding.insert(String::from("s"), vec![0x73]);
290        encoding.insert(String::from("t"), vec![0x74]);
291        encoding.insert(String::from("u"), vec![0x75]);
292        encoding.insert(String::from("v"), vec![0x76]);
293        encoding.insert(String::from("w"), vec![0x77]);
294        encoding.insert(String::from("x"), vec![0x78]);
295        encoding.insert(String::from("y"), vec![0x79]);
296        encoding.insert(String::from("z"), vec![0x7a]);
297        encoding.insert(String::from("{"), vec![0x7b]);
298        encoding.insert(String::from("|"), vec![0x7c]);
299        encoding.insert(String::from("}"), vec![0x7d]);
300        encoding.insert(String::from("~"), vec![0x7e]);
301        encoding.insert(String::from("\x7f"), vec![0x7f]);
302        encoding.insert(String::from("\\u128"), vec![0x80]);
303
304
305        self.encoding = encoding.clone();
306
307        Alphabet {
308            encoding: encoding
309        }
310    }
311
312    pub fn pokered_charset_encoding(&mut self) -> Self {
313        let mut encoding = BiBTreeMap::new();
314        encoding.insert(String::from("<NULL>"), vec![0x00]);
315        encoding.insert(String::from("<PAGE>"), vec![0x49]);
316        encoding.insert(String::from("<PKMN>"), vec![0x4a]);
317    
318        self.encoding = encoding.clone();
319
320        Alphabet {
321            encoding: encoding
322        }
323    }
324
325    pub fn uppercase_no_space_ascii_alphabet_encoding(&mut self) -> Self {
326        let mut encoding = BiBTreeMap::new();
327        encoding.insert(String::from("A"), vec![0x41]);
328        encoding.insert(String::from("B"), vec![0x42]);
329        encoding.insert(String::from("C"), vec![0x43]);
330        encoding.insert(String::from("D"), vec![0x44]);
331        encoding.insert(String::from("E"), vec![0x45]);
332        encoding.insert(String::from("F"), vec![0x46]);
333        encoding.insert(String::from("G"), vec![0x47]);
334        encoding.insert(String::from("H"), vec![0x48]);
335        encoding.insert(String::from("I"), vec![0x49]);
336        encoding.insert(String::from("J"), vec![0x4a]);
337        encoding.insert(String::from("K"), vec![0x4b]);
338        encoding.insert(String::from("L"), vec![0x4c]);
339        encoding.insert(String::from("M"), vec![0x4d]);
340        encoding.insert(String::from("N"), vec![0x4e]);
341        encoding.insert(String::from("O"), vec![0x4f]);
342        encoding.insert(String::from("P"), vec![0x50]);
343        encoding.insert(String::from("Q"), vec![0x51]);
344        encoding.insert(String::from("R"), vec![0x52]);
345        encoding.insert(String::from("S"), vec![0x53]);
346        encoding.insert(String::from("T"), vec![0x54]);
347        encoding.insert(String::from("U"), vec![0x55]);
348        encoding.insert(String::from("V"), vec![0x56]);
349        encoding.insert(String::from("W"), vec![0x57]);
350        encoding.insert(String::from("X"), vec![0x58]);
351        encoding.insert(String::from("Y"), vec![0x59]);
352        encoding.insert(String::from("Z"), vec![0x5a]);
353    
354        self.encoding = encoding.clone();
355
356        Alphabet { 
357            encoding: encoding
358        }
359    }
360
361    pub fn intel_x86_32_encoding(&mut self) -> Self {
362        let mut encoding = BiBTreeMap::new();
363        encoding.insert(String::from("mov rax, rax"), vec![0x00]);
364        encoding.insert(String::from("mov rax, rbx"), vec![0x01]);
365    
366        self.encoding = encoding.clone();
367
368        Alphabet {
369            encoding: encoding
370        }
371    }
372
373    /// Unknow opcodes
374    ///
375    /// Use this alphabet to make statistics on stream cipher when you ignore the assembly langauge or natural language.
376    pub fn unknow_opcodes(&mut self) -> Self {
377        let mut encoding = BiBTreeMap::new();
378        for i in 0..255 {
379            let mut invalid_instruction = String::from("invalid");
380            invalid_instruction.push_str(&i.to_string());
381            encoding.insert(invalid_instruction, vec![i]);
382        }
383    
384        self.encoding = encoding.clone();
385
386        Alphabet {
387            encoding: encoding
388        }
389    }
390
391
392    /// Full Hexadecimal (0x00-0xff)
393    ///
394    /// Use this alphabet if you are working on hash because the hash are often hexadecimal. The alphabet is from hex string to the corresponding ascii value in hex byte value.
395    ///
396    /// This method has no argument.
397    /// Returns an alphabet made with hexadecimal and lowercase only values.
398    pub fn full_hexadecimal_alphabet() -> Self {
399        let mut encoding = BiBTreeMap::new();
400        encoding.insert(String::from("00"), vec![0x00]);
401        encoding.insert(String::from("01"), vec![0x01]);
402        encoding.insert(String::from("02"), vec![0x02]);
403        encoding.insert(String::from("03"), vec![0x03]);
404        encoding.insert(String::from("04"), vec![0x04]);
405        encoding.insert(String::from("05"), vec![0x05]);
406        encoding.insert(String::from("06"), vec![0x06]);
407        encoding.insert(String::from("07"), vec![0x07]);
408        encoding.insert(String::from("08"), vec![0x08]);
409        encoding.insert(String::from("09"), vec![0x09]);
410        encoding.insert(String::from("0a"), vec![0x0a]);
411        encoding.insert(String::from("0b"), vec![0x0b]);
412        encoding.insert(String::from("0c"), vec![0x0c]);
413        encoding.insert(String::from("0d"), vec![0x0d]);
414        encoding.insert(String::from("0e"), vec![0x0e]);
415        encoding.insert(String::from("0f"), vec![0x0f]);
416
417        encoding.insert(String::from("10"), vec![0x10]);
418        encoding.insert(String::from("11"), vec![0x11]);
419        encoding.insert(String::from("12"), vec![0x12]);
420        encoding.insert(String::from("13"), vec![0x13]);
421        encoding.insert(String::from("14"), vec![0x14]);
422        encoding.insert(String::from("15"), vec![0x15]);
423        encoding.insert(String::from("16"), vec![0x16]);
424        encoding.insert(String::from("17"), vec![0x17]);
425        encoding.insert(String::from("18"), vec![0x18]);
426        encoding.insert(String::from("19"), vec![0x19]);
427        encoding.insert(String::from("1a"), vec![0x1a]);
428        encoding.insert(String::from("1b"), vec![0x1b]);
429        encoding.insert(String::from("1c"), vec![0x1c]);
430        encoding.insert(String::from("1d"), vec![0x1d]);
431        encoding.insert(String::from("1e"), vec![0x1e]);
432        encoding.insert(String::from("1f"), vec![0x1f]);
433
434        encoding.insert(String::from("20"), vec![0x20]);
435        encoding.insert(String::from("21"), vec![0x21]);
436        encoding.insert(String::from("22"), vec![0x22]);
437        encoding.insert(String::from("23"), vec![0x23]);
438        encoding.insert(String::from("24"), vec![0x24]);
439        encoding.insert(String::from("25"), vec![0x25]);
440        encoding.insert(String::from("26"), vec![0x26]);
441        encoding.insert(String::from("27"), vec![0x27]);
442        encoding.insert(String::from("28"), vec![0x28]);
443        encoding.insert(String::from("29"), vec![0x29]);
444        encoding.insert(String::from("2a"), vec![0x2a]);
445        encoding.insert(String::from("2b"), vec![0x2b]);
446        encoding.insert(String::from("2c"), vec![0x2c]);
447        encoding.insert(String::from("2d"), vec![0x2d]);
448        encoding.insert(String::from("2e"), vec![0x2e]);
449        encoding.insert(String::from("2f"), vec![0x2f]);
450
451        encoding.insert(String::from("30"), vec![0x30]);
452        encoding.insert(String::from("31"), vec![0x31]);
453        encoding.insert(String::from("32"), vec![0x32]);
454        encoding.insert(String::from("33"), vec![0x33]);
455        encoding.insert(String::from("34"), vec![0x34]);
456        encoding.insert(String::from("35"), vec![0x35]);
457        encoding.insert(String::from("36"), vec![0x36]);
458        encoding.insert(String::from("37"), vec![0x37]);
459        encoding.insert(String::from("38"), vec![0x38]);
460        encoding.insert(String::from("39"), vec![0x39]);
461        encoding.insert(String::from("3a"), vec![0x3a]);
462        encoding.insert(String::from("3b"), vec![0x3b]);
463        encoding.insert(String::from("3c"), vec![0x3c]);
464        encoding.insert(String::from("3d"), vec![0x3d]);
465        encoding.insert(String::from("3e"), vec![0x3e]);
466        encoding.insert(String::from("3f"), vec![0x3f]);
467
468        encoding.insert(String::from("40"), vec![0x40]);
469        encoding.insert(String::from("41"), vec![0x41]);
470        encoding.insert(String::from("42"), vec![0x42]);
471        encoding.insert(String::from("43"), vec![0x43]);
472        encoding.insert(String::from("44"), vec![0x44]);
473        encoding.insert(String::from("45"), vec![0x45]);
474        encoding.insert(String::from("46"), vec![0x46]);
475        encoding.insert(String::from("47"), vec![0x47]);
476        encoding.insert(String::from("48"), vec![0x48]);
477        encoding.insert(String::from("49"), vec![0x49]);
478        encoding.insert(String::from("4a"), vec![0x4a]);
479        encoding.insert(String::from("4b"), vec![0x4b]);
480        encoding.insert(String::from("4c"), vec![0x4c]);
481        encoding.insert(String::from("4d"), vec![0x4d]);
482        encoding.insert(String::from("4e"), vec![0x4e]);
483        encoding.insert(String::from("4f"), vec![0x4f]);
484
485        encoding.insert(String::from("50"), vec![0x50]);
486        encoding.insert(String::from("51"), vec![0x51]);
487        encoding.insert(String::from("52"), vec![0x52]);
488        encoding.insert(String::from("53"), vec![0x53]);
489        encoding.insert(String::from("54"), vec![0x54]);
490        encoding.insert(String::from("55"), vec![0x55]);
491        encoding.insert(String::from("56"), vec![0x56]);
492        encoding.insert(String::from("57"), vec![0x57]);
493        encoding.insert(String::from("58"), vec![0x58]);
494        encoding.insert(String::from("59"), vec![0x59]);
495        encoding.insert(String::from("5a"), vec![0x5a]);
496        encoding.insert(String::from("5b"), vec![0x5b]);
497        encoding.insert(String::from("5c"), vec![0x5c]);
498        encoding.insert(String::from("5d"), vec![0x5d]);
499        encoding.insert(String::from("5e"), vec![0x5e]);
500        encoding.insert(String::from("5f"), vec![0x5f]);
501
502        encoding.insert(String::from("60"), vec![0x60]);
503        encoding.insert(String::from("61"), vec![0x61]);
504        encoding.insert(String::from("62"), vec![0x62]);
505        encoding.insert(String::from("63"), vec![0x63]);
506        encoding.insert(String::from("64"), vec![0x64]);
507        encoding.insert(String::from("65"), vec![0x65]);
508        encoding.insert(String::from("66"), vec![0x66]);
509        encoding.insert(String::from("67"), vec![0x67]);
510        encoding.insert(String::from("68"), vec![0x68]);
511        encoding.insert(String::from("69"), vec![0x69]);
512        encoding.insert(String::from("6a"), vec![0x6a]);
513        encoding.insert(String::from("6b"), vec![0x6b]);
514        encoding.insert(String::from("6c"), vec![0x6c]);
515        encoding.insert(String::from("6d"), vec![0x6d]);
516        encoding.insert(String::from("6e"), vec![0x6e]);
517        encoding.insert(String::from("6f"), vec![0x6f]);
518
519        encoding.insert(String::from("70"), vec![0x70]);
520        encoding.insert(String::from("71"), vec![0x71]);
521        encoding.insert(String::from("72"), vec![0x72]);
522        encoding.insert(String::from("73"), vec![0x73]);
523        encoding.insert(String::from("74"), vec![0x74]);
524        encoding.insert(String::from("75"), vec![0x75]);
525        encoding.insert(String::from("76"), vec![0x76]);
526        encoding.insert(String::from("77"), vec![0x77]);
527        encoding.insert(String::from("78"), vec![0x78]);
528        encoding.insert(String::from("79"), vec![0x79]);
529        encoding.insert(String::from("7a"), vec![0x7a]);
530        encoding.insert(String::from("7b"), vec![0x7b]);
531        encoding.insert(String::from("7c"), vec![0x7c]);
532        encoding.insert(String::from("7d"), vec![0x7d]);
533        encoding.insert(String::from("7e"), vec![0x7e]);
534        encoding.insert(String::from("7f"), vec![0x7f]);
535
536        encoding.insert(String::from("80"), vec![0x80]);
537        encoding.insert(String::from("81"), vec![0x81]);
538        encoding.insert(String::from("82"), vec![0x82]);
539        encoding.insert(String::from("83"), vec![0x83]);
540        encoding.insert(String::from("84"), vec![0x84]);
541        encoding.insert(String::from("85"), vec![0x85]);
542        encoding.insert(String::from("86"), vec![0x86]);
543        encoding.insert(String::from("87"), vec![0x87]);
544        encoding.insert(String::from("88"), vec![0x88]);
545        encoding.insert(String::from("89"), vec![0x89]);
546        encoding.insert(String::from("8a"), vec![0x8a]);
547        encoding.insert(String::from("8b"), vec![0x8b]);
548        encoding.insert(String::from("8c"), vec![0x8c]);
549        encoding.insert(String::from("8d"), vec![0x8d]);
550        encoding.insert(String::from("8e"), vec![0x8e]);
551        encoding.insert(String::from("8f"), vec![0x8f]);
552
553        encoding.insert(String::from("90"), vec![0x90]);
554        encoding.insert(String::from("91"), vec![0x91]);
555        encoding.insert(String::from("92"), vec![0x92]);
556        encoding.insert(String::from("93"), vec![0x93]);
557        encoding.insert(String::from("94"), vec![0x94]);
558        encoding.insert(String::from("95"), vec![0x95]);
559        encoding.insert(String::from("96"), vec![0x96]);
560        encoding.insert(String::from("97"), vec![0x97]);
561        encoding.insert(String::from("98"), vec![0x98]);
562        encoding.insert(String::from("99"), vec![0x99]);
563        encoding.insert(String::from("9a"), vec![0x9a]);
564        encoding.insert(String::from("9b"), vec![0x9b]);
565        encoding.insert(String::from("9c"), vec![0x9c]);
566        encoding.insert(String::from("9d"), vec![0x9d]);
567        encoding.insert(String::from("9e"), vec![0x9e]);
568        encoding.insert(String::from("9f"), vec![0x9f]);
569
570        encoding.insert(String::from("a0"), vec![0xa0]);
571        encoding.insert(String::from("a1"), vec![0xa1]);
572        encoding.insert(String::from("a2"), vec![0xa2]);
573        encoding.insert(String::from("a3"), vec![0xa3]);
574        encoding.insert(String::from("a4"), vec![0xa4]);
575        encoding.insert(String::from("a5"), vec![0xa5]);
576        encoding.insert(String::from("a6"), vec![0xa6]);
577        encoding.insert(String::from("a7"), vec![0xa7]);
578        encoding.insert(String::from("a8"), vec![0xa8]);
579        encoding.insert(String::from("a9"), vec![0xa9]);
580        encoding.insert(String::from("aa"), vec![0xaa]);
581        encoding.insert(String::from("ab"), vec![0xab]);
582        encoding.insert(String::from("ac"), vec![0xac]);
583        encoding.insert(String::from("ad"), vec![0xad]);
584        encoding.insert(String::from("ae"), vec![0xae]);
585        encoding.insert(String::from("af"), vec![0xaf]);
586
587        encoding.insert(String::from("b0"), vec![0xb0]);
588        encoding.insert(String::from("b1"), vec![0xb1]);
589        encoding.insert(String::from("b2"), vec![0xb2]);
590        encoding.insert(String::from("b3"), vec![0xb3]);
591        encoding.insert(String::from("b4"), vec![0xb4]);
592        encoding.insert(String::from("b5"), vec![0xb5]);
593        encoding.insert(String::from("b6"), vec![0xb6]);
594        encoding.insert(String::from("b7"), vec![0xb7]);
595        encoding.insert(String::from("b8"), vec![0xb8]);
596        encoding.insert(String::from("b9"), vec![0xb9]);
597        encoding.insert(String::from("ba"), vec![0xba]);
598        encoding.insert(String::from("bb"), vec![0xbb]);
599        encoding.insert(String::from("bc"), vec![0xbc]);
600        encoding.insert(String::from("bd"), vec![0xbd]);
601        encoding.insert(String::from("be"), vec![0xbe]);
602        encoding.insert(String::from("bf"), vec![0xbf]);
603
604        encoding.insert(String::from("c0"), vec![0xc0]);
605        encoding.insert(String::from("c1"), vec![0xc1]);
606        encoding.insert(String::from("c2"), vec![0xc2]);
607        encoding.insert(String::from("c3"), vec![0xc3]);
608        encoding.insert(String::from("c4"), vec![0xc4]);
609        encoding.insert(String::from("c5"), vec![0xc5]);
610        encoding.insert(String::from("c6"), vec![0xc6]);
611        encoding.insert(String::from("c7"), vec![0xc7]);
612        encoding.insert(String::from("c8"), vec![0xc8]);
613        encoding.insert(String::from("c9"), vec![0xc9]);
614        encoding.insert(String::from("ca"), vec![0xca]);
615        encoding.insert(String::from("cb"), vec![0xcb]);
616        encoding.insert(String::from("cc"), vec![0xcc]);
617        encoding.insert(String::from("cd"), vec![0xcd]);
618        encoding.insert(String::from("ce"), vec![0xce]);
619        encoding.insert(String::from("cf"), vec![0xcf]);
620
621        encoding.insert(String::from("d0"), vec![0xd0]);
622        encoding.insert(String::from("d1"), vec![0xd1]);
623        encoding.insert(String::from("d2"), vec![0xd2]);
624        encoding.insert(String::from("d3"), vec![0xd3]);
625        encoding.insert(String::from("d4"), vec![0xd4]);
626        encoding.insert(String::from("d5"), vec![0xd5]);
627        encoding.insert(String::from("d6"), vec![0xd6]);
628        encoding.insert(String::from("d7"), vec![0xd7]);
629        encoding.insert(String::from("d8"), vec![0xd8]);
630        encoding.insert(String::from("d9"), vec![0xd9]);
631        encoding.insert(String::from("da"), vec![0xda]);
632        encoding.insert(String::from("db"), vec![0xdb]);
633        encoding.insert(String::from("dc"), vec![0xdc]);
634        encoding.insert(String::from("dd"), vec![0xdd]);
635        encoding.insert(String::from("de"), vec![0xde]);
636        encoding.insert(String::from("df"), vec![0xdf]);
637
638        encoding.insert(String::from("e0"), vec![0xe0]);
639        encoding.insert(String::from("e1"), vec![0xe1]);
640        encoding.insert(String::from("e2"), vec![0xe2]);
641        encoding.insert(String::from("e3"), vec![0xe3]);
642        encoding.insert(String::from("e4"), vec![0xe4]);
643        encoding.insert(String::from("e5"), vec![0xe5]);
644        encoding.insert(String::from("e6"), vec![0xe6]);
645        encoding.insert(String::from("e7"), vec![0xe7]);
646        encoding.insert(String::from("e8"), vec![0xe8]);
647        encoding.insert(String::from("e9"), vec![0xe9]);
648        encoding.insert(String::from("ea"), vec![0xea]);
649        encoding.insert(String::from("eb"), vec![0xeb]);
650        encoding.insert(String::from("ec"), vec![0xec]);
651        encoding.insert(String::from("ed"), vec![0xed]);
652        encoding.insert(String::from("ee"), vec![0xee]);
653        encoding.insert(String::from("ef"), vec![0xef]);
654
655        encoding.insert(String::from("f0"), vec![0xf0]);
656        encoding.insert(String::from("f1"), vec![0xf1]);
657        encoding.insert(String::from("f2"), vec![0xf2]);
658        encoding.insert(String::from("f3"), vec![0xf3]);
659        encoding.insert(String::from("f4"), vec![0xf4]);
660        encoding.insert(String::from("f5"), vec![0xf5]);
661        encoding.insert(String::from("f6"), vec![0xf6]);
662        encoding.insert(String::from("f7"), vec![0xf7]);
663        encoding.insert(String::from("f8"), vec![0xf8]);
664        encoding.insert(String::from("f9"), vec![0xf9]);
665        encoding.insert(String::from("fa"), vec![0xfa]);
666        encoding.insert(String::from("fb"), vec![0xfb]);
667        encoding.insert(String::from("fc"), vec![0xfc]);
668        encoding.insert(String::from("fd"), vec![0xfd]);
669        encoding.insert(String::from("fe"), vec![0xfe]);
670        encoding.insert(String::from("ff"), vec![0xff]);
671
672        Alphabet {
673            encoding: encoding
674        }
675    }
676
677
678
679    /// Ascii lowercase hexadecimal alphabet
680    ///
681    /// Use this alphabet if you are working on hash because the hash are often hexadecimal. The alphabet is from hex string to the corresponding ascii value in hex byte value.
682    ///
683    /// This method has no argument.
684    /// Returns an alphabet made with hexadecimal and lowercase only values.
685    pub fn hexadecimal_ascii_lowercase_sixteen_bits_alphabet() -> Self {
686        let mut encoding = BiBTreeMap::new();
687        encoding.insert(String::from("0"), vec![0x30]);
688        encoding.insert(String::from("1"), vec![0x31]);
689        encoding.insert(String::from("2"), vec![0x32]);
690        encoding.insert(String::from("3"), vec![0x33]);
691        encoding.insert(String::from("4"), vec![0x34]);
692        encoding.insert(String::from("5"), vec![0x35]);
693        encoding.insert(String::from("6"), vec![0x36]);
694        encoding.insert(String::from("7"), vec![0x37]);
695        encoding.insert(String::from("8"), vec![0x38]);
696        encoding.insert(String::from("9"), vec![0x39]);
697        encoding.insert(String::from("a"), vec![0x61]);
698        encoding.insert(String::from("b"), vec![0x62]);
699        encoding.insert(String::from("c"), vec![0x63]);
700        encoding.insert(String::from("d"), vec![0x64]);
701        encoding.insert(String::from("e"), vec![0x65]);
702        encoding.insert(String::from("f"), vec![0x66]);
703
704        //self.encoding = encoding.clone();
705
706        Alphabet {
707            encoding: encoding
708        }
709    }
710
711
712    /// Extended ascii alphabet.
713    ///
714    /// Contains 256 values of ascii character.
715    /// This is the default alphabet that you should use when working on networking packets, program file or assembly language.
716    ///
717    /// This method has no argument.
718    /// Returns an alphabet made with extended ascii values..
719    pub fn extended_ascii_encoding(&mut self) -> Self {
720        let mut encoding = BiBTreeMap::new();
721        encoding.insert(String::from("\x00"), vec![0x00]);
722        encoding.insert(String::from("\x01"), vec![0x01]);
723        encoding.insert(String::from("\x02"), vec![0x02]);
724        encoding.insert(String::from("\x03"), vec![0x03]);
725        encoding.insert(String::from("\x04"), vec![0x04]);
726        encoding.insert(String::from("\x05"), vec![0x05]);
727        encoding.insert(String::from("\x06"), vec![0x06]);
728        encoding.insert(String::from("\x07"), vec![0x07]);
729        encoding.insert(String::from("\x08"), vec![0x08]);
730        encoding.insert(String::from("\x09"), vec![0x09]);
731        encoding.insert(String::from("\x0a"), vec![0x0a]);
732        encoding.insert(String::from("\x0b"), vec![0x0b]);
733        encoding.insert(String::from("\x0c"), vec![0x0c]);
734        encoding.insert(String::from("\x0d"), vec![0x0d]);
735        encoding.insert(String::from("\x0e"), vec![0x0e]);
736        encoding.insert(String::from("\x0f"), vec![0x0f]);
737        encoding.insert(String::from("\x10"), vec![0x10]);
738        encoding.insert(String::from("\x11"), vec![0x11]);
739        encoding.insert(String::from("\x12"), vec![0x12]);
740        encoding.insert(String::from("\x13"), vec![0x13]);
741        encoding.insert(String::from("\x14"), vec![0x14]);
742        encoding.insert(String::from("\x15"), vec![0x15]);
743        encoding.insert(String::from("\x16"), vec![0x16]);
744        encoding.insert(String::from("\x17"), vec![0x17]);
745        encoding.insert(String::from("\x18"), vec![0x18]);
746        encoding.insert(String::from("\x19"), vec![0x19]);
747        encoding.insert(String::from("\x1a"), vec![0x1a]);
748        encoding.insert(String::from("\x1b"), vec![0x1b]);
749        encoding.insert(String::from("\x1c"), vec![0x1c]);
750        encoding.insert(String::from("\x1d"), vec![0x1d]);
751        encoding.insert(String::from("\x1e"), vec![0x1e]);
752        encoding.insert(String::from("\x1f"), vec![0x1f]);
753        encoding.insert(String::from(" "), vec![0x20]);
754        encoding.insert(String::from("!"), vec![0x21]);
755        encoding.insert(String::from("\""), vec![0x22]);
756        encoding.insert(String::from("#"), vec![0x23]);
757        encoding.insert(String::from("$"), vec![0x24]);
758        encoding.insert(String::from("%"), vec![0x25]);
759        encoding.insert(String::from("&"), vec![0x26]);
760        encoding.insert(String::from("'"), vec![0x27]);
761        encoding.insert(String::from("("), vec![0x28]);
762        encoding.insert(String::from(")"), vec![0x29]);
763        encoding.insert(String::from("*"), vec![0x2a]);
764        encoding.insert(String::from("+"), vec![0x2b]);
765        encoding.insert(String::from(","), vec![0x2c]);
766        encoding.insert(String::from("-"), vec![0x2d]);
767        encoding.insert(String::from("."), vec![0x2e]);
768        encoding.insert(String::from("/"), vec![0x2f]);
769        encoding.insert(String::from("0"), vec![0x30]);
770        encoding.insert(String::from("1"), vec![0x31]);
771        encoding.insert(String::from("2"), vec![0x32]);
772        encoding.insert(String::from("3"), vec![0x33]);
773        encoding.insert(String::from("4"), vec![0x34]);
774        encoding.insert(String::from("5"), vec![0x35]);
775        encoding.insert(String::from("6"), vec![0x36]);
776        encoding.insert(String::from("7"), vec![0x37]);
777        encoding.insert(String::from("8"), vec![0x38]);
778        encoding.insert(String::from("9"), vec![0x39]);
779        encoding.insert(String::from(":"), vec![0x3a]);
780        encoding.insert(String::from(";"), vec![0x3b]);
781        encoding.insert(String::from("<"), vec![0x3c]);
782        encoding.insert(String::from("="), vec![0x3d]);
783        encoding.insert(String::from(">"), vec![0x3e]);
784        encoding.insert(String::from("?"), vec![0x3f]);
785        encoding.insert(String::from("@"), vec![0x40]);
786        encoding.insert(String::from("A"), vec![0x41]);
787        encoding.insert(String::from("B"), vec![0x42]);
788        encoding.insert(String::from("C"), vec![0x43]);
789        encoding.insert(String::from("D"), vec![0x44]);
790        encoding.insert(String::from("E"), vec![0x45]);
791        encoding.insert(String::from("F"), vec![0x46]);
792        encoding.insert(String::from("G"), vec![0x47]);
793        encoding.insert(String::from("H"), vec![0x48]);
794        encoding.insert(String::from("I"), vec![0x49]);
795        encoding.insert(String::from("J"), vec![0x4a]);
796        encoding.insert(String::from("K"), vec![0x4b]);
797        encoding.insert(String::from("L"), vec![0x4c]);
798        encoding.insert(String::from("M"), vec![0x4d]);
799        encoding.insert(String::from("N"), vec![0x4e]);
800        encoding.insert(String::from("O"), vec![0x4f]);
801        encoding.insert(String::from("P"), vec![0x50]);
802        encoding.insert(String::from("Q"), vec![0x51]);
803        encoding.insert(String::from("R"), vec![0x52]);
804        encoding.insert(String::from("S"), vec![0x53]);
805        encoding.insert(String::from("T"), vec![0x54]);
806        encoding.insert(String::from("U"), vec![0x55]);
807        encoding.insert(String::from("V"), vec![0x56]);
808        encoding.insert(String::from("W"), vec![0x57]);
809        encoding.insert(String::from("X"), vec![0x58]);
810        encoding.insert(String::from("Y"), vec![0x59]);
811        encoding.insert(String::from("Z"), vec![0x5a]);
812        encoding.insert(String::from("["), vec![0x5b]);
813        encoding.insert(String::from("\\"), vec![0x5c]);
814        encoding.insert(String::from("]"), vec![0x5d]);
815        encoding.insert(String::from("^"), vec![0x5e]);
816        encoding.insert(String::from("_"), vec![0x5f]);
817        encoding.insert(String::from("`"), vec![0x60]);
818        encoding.insert(String::from("a"), vec![0x61]);
819        encoding.insert(String::from("b"), vec![0x62]);
820        encoding.insert(String::from("c"), vec![0x63]);
821        encoding.insert(String::from("d"), vec![0x64]);
822        encoding.insert(String::from("e"), vec![0x65]);
823        encoding.insert(String::from("f"), vec![0x66]);
824        encoding.insert(String::from("g"), vec![0x67]);
825        encoding.insert(String::from("h"), vec![0x68]);
826        encoding.insert(String::from("i"), vec![0x69]);
827        encoding.insert(String::from("j"), vec![0x6a]);
828        encoding.insert(String::from("k"), vec![0x6b]);
829        encoding.insert(String::from("l"), vec![0x6c]);
830        encoding.insert(String::from("m"), vec![0x6d]);
831        encoding.insert(String::from("n"), vec![0x6e]);
832        encoding.insert(String::from("o"), vec![0x6f]);
833        encoding.insert(String::from("p"), vec![0x70]);
834        encoding.insert(String::from("q"), vec![0x71]);
835        encoding.insert(String::from("r"), vec![0x72]);
836        encoding.insert(String::from("s"), vec![0x73]);
837        encoding.insert(String::from("t"), vec![0x74]);
838        encoding.insert(String::from("u"), vec![0x75]);
839        encoding.insert(String::from("v"), vec![0x76]);
840        encoding.insert(String::from("w"), vec![0x77]);
841        encoding.insert(String::from("x"), vec![0x78]);
842        encoding.insert(String::from("y"), vec![0x79]);
843        encoding.insert(String::from("z"), vec![0x7a]);
844        encoding.insert(String::from("{"), vec![0x7b]);
845        encoding.insert(String::from("|"), vec![0x7c]);
846        encoding.insert(String::from("}"), vec![0x7d]);
847        encoding.insert(String::from("~"), vec![0x7e]);
848        encoding.insert(String::from("\x7f"), vec![0x7f]);
849        encoding.insert(String::from("€"), vec![0x80]);//\\u128
850
851
852        self.encoding = encoding.clone();
853
854        Alphabet {
855            encoding: encoding
856        }
857    }
858
859    pub fn get_encoding(&self) -> Vec<Encoding> {
860        self.encoding.iter()
861            .map(|(str, bytes)| Encoding { str: str.clone(), bytes: bytes.clone() })
862            .collect_vec()
863    }
864
865    /// Convert opcodes to an human readable set of characters text in the same order as the original unconverted text.
866    ///
867    /// Once deciphered in plain characters, a cryptographic algorithm still need to be seen in a decodable format. This is why this method returns a Vector of `Encoded` struct.
868    ///
869    /// paramaters:
870    ///   - encoding: opcode vector to convert to a set of character.
871    ///
872    /// Returns: a converted human readable set of character text in the same order as the original unconverted text.
873    ///
874    /// ```
875    /// use cryptatools_core::utils::{convert::Encode, alphabets::split_bytes_by_characters_representation, alphabets::Alphabet};
876    /// use cryptatools_core::utils::alphabets::Encoding;
877    /// 
878    ///
879    /// let ascii_alphabet = Alphabet::new_empty().ascii_encoding();
880    /// let alph = ascii_alphabet.decode(vec![0x41, 0x41, 0x42, 0x42]);
881    /// let decoded = vec![Encoding{str: String::from("A"), bytes: vec![0x41]}, Encoding{str: String::from("A"), bytes: vec![0x41]}, Encoding{str: String::from("B"), bytes: vec![0x42]}, Encoding{str: String::from("B"), bytes: vec![0x42]}];
882    /// assert_eq!(alph, decoded);
883    /// ```
884    pub fn decode(&self, encoded: Vec<u8>) -> Vec<Encoding> {
885        let mut alway_iterate = 0;
886        let mut iterate_foreach_character_decoded = 0;
887        let mut out: Vec<Encoding> = vec![];
888        while iterate_foreach_character_decoded < encoded.len() {
889            let part: Vec<u8> = encoded[iterate_foreach_character_decoded..alway_iterate].to_vec();
890            match self.encoding.contains_right(&part) {
891                true => {
892                    let decoded = self.encoding.get_by_right(&part);
893                    out.push(Encoding{str: String::from(decoded.unwrap()),
894                        bytes: part});
895                    iterate_foreach_character_decoded += 1;
896                },
897                false => {
898
899                }
900            }
901            alway_iterate += 1;
902        }
903
904        out
905    }
906}
907
908/*
909let decoded = encoded[j..i].into_iter().map(|e| (e.str, e.bytes))
910            .collect::<BiBTreeMap<_, _>>();
911*/