Skip to main content

edu_examples/
edu_examples.rs

1
2// use cryptocol::number::SmallUInt;
3// use cryptocol::symmetric::DES;
4// use cryptocol::random::Slapdash_PRNG_Creator;
5
6
7fn main()
8{
9    complement();
10    avalanche();
11    normal_keys();
12    weak_keys();
13    semi_weak_keys();
14
15    small_rsa();
16}
17
18fn complement()
19{
20    println!("Complement case");
21    use cryptocol::symmetric::DES;
22
23    let key = 0x_1234567890ABCDEF_u64;
24    println!("K =\t{:#018X}", key);
25    let mut a_des = DES::new_with_key_u64(key);
26
27    let message = 0x_1234567890ABCDEF_u64;
28    println!("M_u64 =\t{:#018X}", message);
29
30    let cipher = a_des.encrypt_u64(message);
31    println!("C_u64 (16 rounds) =\t{:#018X}", cipher);
32    assert_eq!(cipher, 0x_1BC4896735BBE206_u64);
33
34
35    let c_key = !0x_1234567890ABCDEF_u64;
36    println!("cK =\t{:#018X}", c_key);
37    let mut a_des = DES::new_with_key_u64(c_key);
38
39    let c_message = !0x_1234567890ABCDEF_u64;
40    println!("cM_u64 =\t{:#018X}", c_message);
41
42    let c_cipher = a_des.encrypt_u64(c_message);
43    println!("cC_u64 (16 rounds) =\t{:#018X}", c_cipher);
44    assert_eq!(c_cipher, !cipher);
45
46    println!("K  =\t\t{:#066b}", key);
47    println!("cK =\t\t{:#066b}", c_key);
48    println!("M_u64  =\t{:#066b}", message);
49    println!("cM_u64 =\t{:#066b}", c_message);
50    println!("C_u64  =\t{:#066b}", cipher);
51    println!("cC_u64 =\t{:#066b}", c_cipher);
52    println!("--------------------");
53}
54
55fn avalanche()
56{
57    println!("Avalanche case");
58    use cryptocol::symmetric::DES;
59
60    let key = 0x_1234567890ABCDEF_u64;
61    println!("K =\t{:#018X}", key);
62    let mut a_des = DES::new_with_key_u64(key);
63
64    let message = 0x_0000_0000_0000_0000_u64;
65    println!("M_u64 =\t{:#018X}", message);
66
67    let cipher = a_des.encrypt_u64(message);
68    println!("C_u64 (16 rounds) =\t{:#018X}", cipher);
69
70    let message2 = 0x_0000_0000_0000_0001_u64;
71    println!("M2_u64 =\t{:#018X}", message2);
72
73    let cipher2 = a_des.encrypt_u64(message2);
74    println!("C2_u64 (16 rounds) =\t{:#018X}", cipher2);
75
76    println!("K  =\t\t{:#066b}", key);
77    println!("M_u64  =\t{:#066b}", message);
78    println!("M2_u64 =\t{:#066b}", message2);
79    println!("C_u64  =\t{:#066b}", cipher);
80    println!("C2_u64 =\t{:#066b}", cipher2);
81    println!("--------------------");
82}
83
84fn normal_keys()
85{
86    println!("Normal key case");
87    use cryptocol::symmetric::DES;
88
89    let key = 0x_1234567890ABCDEF_u64;
90    println!("K =\t\t{:#018X}", key);
91    let mut a_des = DES::new_with_key_u64(key);
92
93    let message = 0x_FEDCBA0987654321_u64;
94    println!("M_u64 =\t\t{:#018X}", message);
95
96    let cipher = a_des.encrypt_u64(message);
97    println!("C_u64 =\t\t{:#018X}", cipher);
98
99    let cipher2 = a_des.encrypt_u64(cipher);
100    println!("C2_u64 =\t{:#018X}", cipher2);
101    println!("--------------------");
102}
103
104fn weak_keys()
105{
106    println!("Weak key case");
107    use cryptocol::symmetric::DES;
108    
109    let key = 0x_0101010101010101_u64.to_be();
110    println!("K =\t\t{:#018X}", key);
111    let mut a_des = DES::new_with_key_u64(key);
112
113    let message = 0x_FEDCBA0987654321_u64;
114    println!("M_u64 =\t\t{:#018X}", message);
115
116    let cipher = a_des.encrypt_u64(message);
117    println!("C_u64 =\t\t{:#018X}", cipher);
118
119    let cipher2 = a_des.encrypt_u64(cipher);
120    println!("C2_u64 =\t{:#018X}", cipher2);
121    println!("--------------------");
122}
123
124fn semi_weak_keys()
125{
126    println!("Semi-Weak key case");
127    use cryptocol::symmetric::DES;
128
129    let key1 = 0x_011F011F010E010E_u64.to_be();
130    let key2 = 0x_1F011F010E010E01_u64.to_be();
131    println!("K1 =\t\t{:#018X}", key1);
132    println!("K2 =\t\t{:#018X}", key2);
133    let mut a_des = DES::new_with_key_u64(key1);
134    let mut b_des = DES::new_with_key_u64(key2);
135
136    let message = 0x_FEDCBA0987654321_u64;
137    println!("M_u64 =\t\t{:#018X}", message);
138
139    let cipher = a_des.encrypt_u64(message);
140    println!("C1_u64 =\t{:#018X}", cipher);
141
142    let cipher2 = b_des.encrypt_u64(cipher);
143    println!("C2_u64 =\t{:#018X}", cipher2);
144    println!("--------------------");
145}
146
147fn small_rsa()
148{
149    println!("small_rsa");
150    use cryptocol::number::SmallUInt;
151    use cryptocol::random::Slapdash_PRNG_Creator;
152    
153    let mut slapdash = Slapdash_PRNG_Creator::create();
154    let mut prime1 = slapdash.random_u32();
155    let mut prime2 = slapdash.random_u32();
156
157    prime1.set_msb();
158    while !prime1.is_prime()
159    {
160        prime1 = slapdash.random_u32();
161        prime1.set_msb();
162    }
163
164    prime2.set_msb();
165    while !prime2.is_prime()
166    {
167        prime2 = slapdash.random_u32();
168        prime2.set_msb();
169    }
170
171    let modulo = prime1 as u64 * prime2 as u64;
172    println!("Prime 1 = {}", prime1);
173    println!("Prime 2 = {}", prime2);
174    println!("Modulo = {}", modulo);
175    let phi = (prime1 - 1) as u64 * (prime2 - 1) as u64;
176
177    let mut key1 = 2_u64;
178    let (mut one, mut key2, _) = key1.extended_gcd(phi);
179
180    while !one.is_one()
181    {
182        key1 += 1;
183        (one, key2, _) = key1.extended_gcd(phi);
184    }
185    if key2 > phi
186        { key2 = phi.wrapping_sub(0_u64.wrapping_sub(key2)); }
187    else
188        { key2 %= phi; }
189
190    println!("Public Key = {}", key1);
191    println!("Private Key = {}", key2);
192
193    let message = 3_u64;
194    let cipher = message.modular_pow(key1, modulo);
195    let recover = cipher.modular_pow(key2, modulo);
196    println!("Message = {}", message);
197    println!("Cipher = {}", cipher);
198    println!("Recover = {}", recover);
199
200    let product = key1.modular_mul(key2, phi);
201    println!("product = {} X {} (mod {}) = {}", key1, key2, phi, product);
202    println!("--------------------");
203}