1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
//! # DES (Data Encryption Standard) Implementation
//!
//! This module provides a simplified educational implementation of the DES block cipher.
//! DES was the standard encryption algorithm from 1977 to 2001 but is now considered
//! cryptographically broken due to its small key size.
//!
//! ⚠️ **Security Warning**: DES is **not secure** for modern use due to its 56-bit
//! effective key size. It can be broken by brute force in hours with modern hardware.
//! Use only for educational purposes or legacy system compatibility.
//!
//! ## Algorithm Overview
//!
//! - **Block Size**: 64 bits (8 bytes)
//! - **Key Size**: 64 bits (8 bytes) with 56 effective bits
//! - **Rounds**: 16 Feistel rounds
//! - **Structure**: Feistel network with substitution and permutation
//!
//! ## Supported Modes
//!
//! - **ECB (Electronic Codebook)**: Each block encrypted independently
//! - **CBC (Cipher Block Chaining)**: Each block XORed with previous ciphertext
//!
//! ## Historical Context
//!
//! DES was developed by IBM and adopted as a federal standard in 1977. It served
//! as the foundation for modern block cipher design but became vulnerable to
//! brute force attacks as computing power increased.
//!
//! ## Examples
//!
//! ```rust
//! use ruscrypt::block::des;
//!
//! // Encrypt with DES-CBC
//! let encrypted = des::encrypt("Hello World", "password", "CBC", "base64").unwrap();
//!
//! // Decrypt
//! let decrypted = des::decrypt(&encrypted, "password", "CBC", "base64").unwrap();
//! ```
use crate;
use Result;
/// Encrypts data using DES with specified mode and encoding.
///
/// This function implements a simplified version of DES for educational purposes.
/// It demonstrates the core concepts of block cipher encryption including
/// padding, mode operations, and output encoding.
///
/// # Arguments
///
/// * `data` - The plaintext data to encrypt
/// * `key` - Encryption key (must be exactly 8 characters/64 bits)
/// * `mode` - Encryption mode ("ECB" or "CBC")
/// * `encoding` - Output encoding ("base64" or "hex")
///
/// # Returns
///
/// Returns the encrypted data encoded in the specified format.
///
/// # Key Requirements
///
/// DES requires exactly 8 bytes (64 bits) for the key:
/// - Each ASCII character = 8 bits
/// - Total: 8 characters × 8 bits = 64 bits
/// - Effective key strength: 56 bits (8 bits used for parity)
///
/// # Modes of Operation
///
/// - **ECB**: Each 8-byte block encrypted independently
/// - Simple but vulnerable to pattern analysis
/// - Identical plaintext blocks produce identical ciphertext
///
/// - **CBC**: Each block XORed with previous ciphertext block
/// - More secure than ECB
/// - Uses zero initialization vector for simplicity
///
/// # Examples
///
/// ```rust
/// use ruscrypt::block::des;
///
/// // Encrypt with CBC mode and base64 encoding
/// let encrypted = des::encrypt("Secret message", "password", "CBC", "base64")?;
///
/// // Encrypt with ECB mode and hex encoding
/// let encrypted = des::encrypt("Test data", "key12345", "ECB", "hex")?;
/// ```
///
/// # Errors
///
/// Returns an error if:
/// - Key length is not exactly 8 characters
/// - Mode is not "ECB" or "CBC"
/// - Encoding is not "base64" or "hex"
/// - Encryption process fails
/// Decrypts data encrypted with DES.
///
/// Reverses the DES encryption process using the same key and parameters
/// that were used during encryption. Handles decoding from the specified
/// format and removes padding from the result.
///
/// # Arguments
///
/// * `data` - The encrypted data in the specified encoding
/// * `key` - Decryption key (must match encryption key, 8 characters)
/// * `mode` - Decryption mode (must match encryption mode)
/// * `encoding` - Input encoding format ("base64" or "hex")
///
/// # Returns
///
/// Returns the decrypted plaintext as a UTF-8 string.
///
/// # Decryption Process
///
/// 1. Decode input from specified encoding (base64/hex)
/// 2. Apply reverse DES algorithm with specified mode
/// 3. Remove padding from decrypted blocks
/// 4. Convert result to UTF-8 string
///
/// # Examples
///
/// ```rust
/// use ruscrypt::block::des;
///
/// // Decrypt base64-encoded CBC ciphertext
/// let decrypted = des::decrypt("encrypted_data", "password", "CBC", "base64")?;
///
/// // Decrypt hex-encoded ECB ciphertext
/// let decrypted = des::decrypt("hex_data", "key12345", "ECB", "hex")?;
/// ```
///
/// # Errors
///
/// Returns an error if:
/// - Key length is not exactly 8 characters
/// - Mode is not "ECB" or "CBC"
/// - Encoding is not "base64" or "hex"
/// - Input data cannot be decoded from specified encoding
/// - Decrypted data is not valid UTF-8
/// - Padding removal fails
/// Encrypts data using DES in ECB mode.
///
/// Electronic Codebook mode encrypts each 8-byte block independently
/// using the same key. This is the simplest mode but has security
/// weaknesses due to pattern preservation.
///
/// # Arguments
///
/// * `data` - Padded input data (multiple of 8 bytes)
/// * `key` - 8-byte encryption key
///
/// # Returns
///
/// Returns the encrypted data as a byte vector.
///
/// # Security Note
///
/// ECB mode is vulnerable to pattern analysis because identical
/// plaintext blocks produce identical ciphertext blocks.
/// Decrypts data using DES in ECB mode.
///
/// Reverses ECB encryption by decrypting each 8-byte block
/// independently using the same key.
///
/// # Arguments
///
/// * `data` - Encrypted data (multiple of 8 bytes)
/// * `key` - 8-byte decryption key
///
/// # Returns
///
/// Returns the decrypted data as a byte vector.
/// Encrypts data using DES in CBC mode.
///
/// Cipher Block Chaining mode XORs each plaintext block with the
/// previous ciphertext block before encryption. This provides better
/// security than ECB by eliminating patterns.
///
/// # Arguments
///
/// * `data` - Padded input data (multiple of 8 bytes)
/// * `key` - 8-byte encryption key
///
/// # Returns
///
/// Returns the encrypted data as a byte vector.
///
/// # CBC Process
///
/// 1. Initialize with zero IV (Initialization Vector)
/// 2. XOR first plaintext block with IV
/// 3. Encrypt XORed block to get first ciphertext block
/// 4. XOR next plaintext block with previous ciphertext block
/// 5. Repeat until all blocks are processed
/// Decrypts data using DES in CBC mode.
///
/// Reverses CBC encryption by decrypting each block and XORing
/// with the previous ciphertext block to recover plaintext.
///
/// # Arguments
///
/// * `data` - Encrypted data (multiple of 8 bytes)
/// * `key` - 8-byte decryption key
///
/// # Returns
///
/// Returns the decrypted data as a byte vector.
///
/// # CBC Decryption Process
///
/// 1. Decrypt first ciphertext block
/// 2. XOR result with IV (zero) to get first plaintext block
/// 3. Decrypt next ciphertext block
/// 4. XOR result with previous ciphertext block
/// 5. Repeat until all blocks are processed
/// Encrypts a single 8-byte block using simplified DES algorithm.
///
/// This is an educational implementation that demonstrates the concepts
/// of block cipher rounds, key mixing, and bit manipulation. It is not
/// the full DES specification but captures the essential ideas.
///
/// # Arguments
///
/// * `block` - 8-byte input block to encrypt
/// * `key` - 8-byte encryption key
///
/// # Returns
///
/// Returns the encrypted 8-byte block.
///
/// # Simplified DES Process
///
/// 1. Copy input block to working state
/// 2. Perform 16 rounds of:
/// - XOR with round key (derived from main key)
/// - Add round number for variation
/// - Rotate bits for diffusion
/// - Reverse array for permutation
///
/// # Note
///
/// This implementation prioritizes educational clarity over
/// cryptographic accuracy. Real DES uses complex S-boxes,
/// P-boxes, and a sophisticated key schedule.
/// Decrypts a single 8-byte block using simplified DES algorithm.
///
/// Reverses the encryption process by applying the same operations
/// in reverse order with appropriate inverse transformations.
///
/// # Arguments
///
/// * `block` - 8-byte encrypted block to decrypt
/// * `key` - 8-byte decryption key (same as encryption key)
///
/// # Returns
///
/// Returns the decrypted 8-byte block.
///
/// # Decryption Process
///
/// 1. Copy encrypted block to working state
/// 2. Perform 16 rounds in reverse order (15 down to 0):
/// - Reverse permutation (array reversal)
/// - Reverse rotation (rotate right instead of left)
/// - Subtract round number
/// - XOR with round key
///
/// # Symmetric Property
///
/// DES is a symmetric cipher, meaning the same key is used for
/// both encryption and decryption. The algorithm structure
/// ensures that decryption reverses encryption exactly.