edu_examples/
edu_examples.rs1
2fn 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}