Skip to content

Commit 7f895fb

Browse files
committed
Added functions to calculate pair keys and also tested it intensively
0 parents  commit 7f895fb

File tree

5 files changed

+209
-0
lines changed

5 files changed

+209
-0
lines changed

.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
target

Cargo.lock

Lines changed: 4 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Cargo.toml

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
[package]
2+
name = "des_cipher"
3+
version = "0.1.0"
4+
authors = ["Scientist <ostafi_ion@yahoo.com>"]
5+
6+
7+
8+
[profile.dev]
9+
opt-level = 0 # Controls the --opt-level the compiler builds with
10+
debug = true # Controls whether the compiler passes `-g`
11+
rpath = false # Controls whether the compiler passes `-C rpath`
12+
lto = false # Controls `-C lto` for binaries and staticlibs
13+
debug-assertions = true # Controls whether debug assertions are enabled
14+
codegen-units = 1 # Controls whether the compiler passes `-C codegen-units`
15+
# `codegen-units` is ignored when `lto = true'

src/main.rs

Lines changed: 87 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,87 @@
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+
}

src/main_tests.rs

Lines changed: 102 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,102 @@
1+
use super::*;
2+
3+
4+
#[test]
5+
fn rotatig_bit_with_1_on_firstbit() {
6+
let bit_to_rotate : i64 = 0b1111000011110000111100001111;
7+
assert_eq!(0b1110000111100001111000011111, bit_rotate_left(bit_to_rotate, 1));
8+
}
9+
10+
11+
#[test]
12+
fn rotatig_bit_with_2_positions() {
13+
let bit_to_rotate : i64 = 0b1111_0000_1111_0000_1111_0000_1111;
14+
assert_eq!(0b1100_0011_1100_0011_1100_0011_1111, bit_rotate_left(bit_to_rotate, 2));
15+
}
16+
17+
18+
#[test]
19+
fn ones_for_2_is_11() {
20+
assert_eq!(0b11, bit_pattern_containing_ones(2));
21+
}
22+
23+
24+
#[test]
25+
fn creating_vector_with_keys_returns_correct_subkeys() {
26+
let subkeys = create_16_subkeys(0b1111000011001100101010101111, 0b0101010101100110011110001111);
27+
assert_eq!(16, subkeys.len());
28+
//1
29+
assert_eq!(0b1110000110011001010101011111, subkeys[0].0);
30+
assert_eq!(0b1010101011001100111100011110, subkeys[0].1);
31+
//2
32+
assert_eq!(0b1100001100110010101010111111, subkeys[1].0);
33+
assert_eq!(0b0101010110011001111000111101, subkeys[1].1);
34+
//3
35+
assert_eq!(0b0000110011001010101011111111, subkeys[2].0);
36+
assert_eq!(0b0101011001100111100011110101, subkeys[2].1);
37+
//4
38+
assert_eq!(0b0011001100101010101111111100, subkeys[3].0);
39+
assert_eq!(0b0101100110011110001111010101, subkeys[3].1);
40+
//5
41+
assert_eq!(0b1100110010101010111111110000, subkeys[4].0);
42+
assert_eq!(0b0110011001111000111101010101, subkeys[4].1);
43+
//6
44+
assert_eq!(0b0011001010101011111111000011, subkeys[5].0);
45+
assert_eq!(0b1001100111100011110101010101, subkeys[5].1);
46+
//7
47+
assert_eq!(0b1100101010101111111100001100, subkeys[6].0);
48+
assert_eq!(0b0110011110001111010101010110, subkeys[6].1);
49+
//8
50+
assert_eq!(0b0010101010111111110000110011, subkeys[7].0);
51+
assert_eq!(0b1001111000111101010101011001, subkeys[7].1);
52+
//9
53+
assert_eq!(0b0101010101111111100001100110, subkeys[8].0);
54+
assert_eq!(0b0011110001111010101010110011, subkeys[8].1);
55+
//10
56+
assert_eq!(0b0101010111111110000110011001, subkeys[9].0);
57+
assert_eq!(0b1111000111101010101011001100, subkeys[9].1);
58+
//11
59+
assert_eq!(0b0101011111111000011001100101, subkeys[10].0);
60+
assert_eq!(0b1100011110101010101100110011, subkeys[10].1);
61+
//12
62+
assert_eq!(0b0101111111100001100110010101, subkeys[11].0);
63+
assert_eq!(0b0001111010101010110011001111, subkeys[11].1);
64+
//13
65+
assert_eq!(0b0111111110000110011001010101, subkeys[12].0);
66+
assert_eq!(0b0111101010101011001100111100, subkeys[12].1);
67+
//14
68+
assert_eq!(0b1111111000011001100101010101, subkeys[13].0);
69+
assert_eq!(0b1110101010101100110011110001, subkeys[13].1);
70+
//15
71+
assert_eq!(0b1111100001100110010101010111, subkeys[14].0);
72+
assert_eq!(0b1010101010110011001111000111, subkeys[14].1);
73+
//16
74+
assert_eq!(0b1111000011001100101010101111, subkeys[15].0);
75+
assert_eq!(0b0101010101100110011110001111, subkeys[15].1);
76+
77+
}
78+
79+
80+
#[test]
81+
fn test_spliting_a_56_bit_key_into_2_x_28_keys() {
82+
let original_key = 0b11110000110011001010101011110101010101100110011110001111;
83+
let expected_left = 0b1111000011001100101010101111;
84+
let expected_right = 0b0101010101100110011110001111;
85+
assert_eq!((expected_left, expected_right), split_key(original_key, 56));
86+
}
87+
88+
89+
#[test]
90+
fn generate_key_plus_based_on_pc1_table() {
91+
let key = 0b0001001100110100010101110111100110011011101111001101111111110001;
92+
let key_plus = 0b11110000110011001010101011110101010101100110011110001111;
93+
assert_eq!(key_plus, generate_key_plus(key));
94+
}
95+
96+
#[test]
97+
fn creating_key_based_on_paris_and_PC2_table() {
98+
let left = 0b1110000110011001010101011111;
99+
let right = 0b1010101011001100111100011110;
100+
let expected_key = 0b000110110000001011101111111111000111000001110010;
101+
assert_eq!(expected_key, key_kn_from_pair(left, right));
102+
}

0 commit comments

Comments
 (0)