|
| 1 | +#[cfg(test)] |
| 2 | +mod main_tests; |
| 3 | + |
| 4 | +//const MESS : i64 = 0x0123456789ABCDEF; |
| 5 | +const KEY : i64 = 0x133457799BBCDFF1; |
| 6 | + |
| 7 | + |
| 8 | + |
| 9 | +fn main() { |
| 10 | + let key_plus = generate_key_plus(KEY); |
| 11 | + let (left, right) = split_key(key_plus, 56); |
| 12 | + let subkeys = create_16_subkeys(left, right); |
| 13 | + for idx in 0..subkeys.len() { |
| 14 | + println!("[{0}]{1:b}\n[{0}]{2:b}\n\n",idx, subkeys[idx].0, subkeys[idx].1); |
| 15 | + } |
| 16 | + //println!("{:b}\n{:b}", left, right); |
| 17 | +} |
| 18 | + |
| 19 | + |
| 20 | +//Step 1: Create 16 subkeys, each of which is 48-bits long. |
| 21 | +const PC1 : [u8; 56] = |
| 22 | +[57, 49, 41, 33, 25, 17, 9, 1, |
| 23 | +58, 50, 42, 34, 26, 18, 10, 2, |
| 24 | +59, 51, 43, 35, 27, 19, 11, 3, |
| 25 | +60, 52, 44, 36, 63, 55, 47, 39, |
| 26 | +31, 23, 15, 7, 62, 54, 46, 38, |
| 27 | +30, 22, 14, 6, 61, 53, 45, 37, |
| 28 | +29, 21, 13, 5, 28, 20, 12, 4]; |
| 29 | + |
| 30 | + |
| 31 | +pub fn generate_key_plus(key: i64) -> i64 { |
| 32 | + let mut key_plus : i64 = 0; |
| 33 | + for idx in 0..56 { |
| 34 | + let bit_to_add = key >> (64 - PC1[idx]) & 1; |
| 35 | + key_plus = key_plus << 1; |
| 36 | + key_plus = key_plus | bit_to_add; |
| 37 | + } |
| 38 | + key_plus |
| 39 | +} |
| 40 | + |
| 41 | + |
| 42 | +pub fn split_key(key : i64, key_len: i8) -> (i64, i64) { |
| 43 | + let left_half = key >> key_len / 2; |
| 44 | + let right_half = (key << 64 - key_len + key_len / 2) >> 64 - key_len + key_len / 2; |
| 45 | + (left_half,right_half) |
| 46 | +} |
| 47 | + |
| 48 | + |
| 49 | +const LEFT_SHIFTS : [u8; 16] = [1,1,2,2,2,2,2,2,1,2,2,2,2,2,2,1]; |
| 50 | + |
| 51 | +pub fn create_16_subkeys(left_half: i64, right_half: i64) -> Vec<(i64, i64)> { |
| 52 | + let mut subkeys : Vec<(i64, i64)> = Vec::new(); |
| 53 | + subkeys.push((left_half, right_half)); |
| 54 | + for idx in 0..16 { |
| 55 | + let next_left = bit_rotate_left(subkeys[idx].0, LEFT_SHIFTS[idx]); |
| 56 | + let next_right = bit_rotate_left(subkeys[idx].1, LEFT_SHIFTS[idx]); |
| 57 | + subkeys.push((next_left, next_right)); |
| 58 | + } |
| 59 | + subkeys.remove(0); |
| 60 | + subkeys |
| 61 | +} |
| 62 | + |
| 63 | +pub fn bit_rotate_left(bit_array : i64, rol_count : u8) -> i64 { |
| 64 | + let rotated_bit = ((bit_pattern_containing_ones(rol_count) << 28 - rol_count) & bit_array) >> 28 - rol_count; |
| 65 | + ((bit_array << rol_count) & 0xffff_fff) | rotated_bit |
| 66 | +} |
| 67 | + |
| 68 | + |
| 69 | +pub fn bit_pattern_containing_ones(how_much: u8) -> i64 { |
| 70 | + ((2u64).pow(how_much as u32) - 1) as i64 |
| 71 | +} |
| 72 | + |
| 73 | + |
| 74 | +const PC2 : [u8; 48] = |
| 75 | +[14, 17, 11, 24, 1, 5, |
| 76 | + 3, 28, 15, 6, 21, 10, |
| 77 | + 23, 19, 12, 4, 26, 8, |
| 78 | + 16, 7, 27, 20, 13, 2, |
| 79 | + 41, 52, 31, 37, 47, 55, |
| 80 | + 30, 40, 51, 45, 33, 48, |
| 81 | + 44, 49, 39, 56, 34, 53, |
| 82 | + 46, 42, 50, 36, 29, 32]; |
| 83 | + |
| 84 | + |
| 85 | +pub fn key_kn_from_pair(left: i64, right: i64) -> i64 { |
| 86 | + 0 |
| 87 | +} |
0 commit comments