#![allow(missing_docs)]
#![allow(unused_must_use)]
#![allow(dead_code)]
#![allow(unused_imports)]
#![allow(non_snake_case)]
pub fn main()
{
des_quick_start_main();
des_basic_operation_main();
des_encrypt_decrypt_u64_array_u64_main();
}
fn des_quick_start_main()
{
des_quick_start_instantiation_with_key();
des_quick_start_instantiation_without_key();
des_quick_start_encryption_decryption_16_rounds();
des_quick_start_encryption_decryption_256_rounds();
des_quick_start_weak_keys();
des_quick_start_semi_weak_keys();
}
fn des_quick_start_instantiation_with_key()
{
println!("des_quick_start_instantiation_with_key()");
use cryptocol::symmetric::DES;
let key = 0x_1234567890ABCDEF_u64;
let mut _a_des = DES::new_with_key_u64(key);
let key = [0xEFu8, 0xCDu8, 0xABu8, 0x90u8, 0x78u8, 0x56u8, 0x34u8, 0x12u8];
let mut _a_des = DES::new_with_key(key);
println!("-------------------------------");
}
fn des_quick_start_instantiation_without_key()
{
println!("des_quick_start_instantiation_without_key()");
use cryptocol::symmetric::DES;
let mut a_des = DES::new();
let key = 0x_1234567890ABCDEF_u64;
a_des.set_key_u64(key);
let mut a_des = DES::new();
let key = [0xEFu8, 0xCDu8, 0xABu8, 0x90u8, 0x78u8, 0x56u8, 0x34u8, 0x12u8];
a_des.set_key(key);
println!("-------------------------------");
}
fn des_quick_start_encryption_decryption_16_rounds()
{
println!("des_quick_start_encryption_decryption_16_rounds()");
use std::io::Write;
use std::fmt::Write as _;
use cryptocol::symmetric::{ CBC_PKCS7, DES };
let mut a_des = DES::new_with_key([0xEFu8, 0xCDu8, 0xABu8, 0x90u8, 0x78u8, 0x56u8, 0x34u8, 0x12u8]);
let message = "In the beginning God created the heavens and the earth.";
println!("M =\t{}", message);
let iv = 0x_FEDCBA0987654321_u64;
println!("IV =\t{}", iv);
let mut cipher = Vec::<u8>::new();
a_des.encrypt_str_into_vec(iv, message, &mut cipher);
print!("C =\t");
for c in cipher.clone()
{ print!("{:02X} ", c); }
println!();
let mut txt = String::new();
for c in cipher.clone()
{ write!(txt, "{:02X} ", c); }
assert_eq!(txt, "4B B5 ED DC A0 58 7E 6D 6C 3B A2 00 38 C3 D4 29 42 B1 CF 0D E9 FA EA 11 11 6B C8 30 73 39 DD B7 3F 96 9B A3 76 05 34 7E 64 2F D4 CC B2 68 33 64 C5 9E EF 01 A9 4A FD 5B ");
let mut recovered = String::new();
a_des.decrypt_vec_into_string(iv, &cipher, &mut recovered);
println!("B (16 rounds) =\t{}", recovered);
assert_eq!(recovered, "In the beginning God created the heavens and the earth.");
assert_eq!(recovered, message);
println!("-------------------------------");
}
fn des_quick_start_encryption_decryption_256_rounds()
{
println!("des_quick_start_encryption_decryption_256_rounds()");
use std::io::Write;
use std::fmt::Write as _;
use cryptocol::symmetric::{ CBC_PKCS7, DES_Expanded };
let mut a_des = DES_Expanded::<128, 0x_8103_8103_8103_8103_8103_8103_8103_8103_u128>::new_with_key([0xEFu8, 0xCDu8, 0xABu8, 0x90u8, 0x78u8, 0x56u8, 0x34u8, 0x12u8]);
let message = "In the beginning God created the heavens and the earth.";
println!("M =\t{}", message);
let iv = 0x_FEDCBA0987654321_u64;
println!("IV =\t{}", iv);
let mut cipher = Vec::<u8>::new();
a_des.encrypt_into_vec(iv, message.as_ptr(), message.len() as u64, &mut cipher);
print!("C =\t");
for c in cipher.clone()
{ print!("{:02X} ", c); }
println!();
let mut txt = String::new();
for c in cipher.clone()
{ write!(txt, "{:02X} ", c); }
assert_eq!(txt, "0B EA 6B BC 68 F9 B0 3E 7D AF DE 71 9C 08 AA 16 42 40 1C C8 DC 40 51 C6 8D D4 E7 D2 0B A4 F2 09 02 02 C2 6E 99 BC 9E 2A F4 11 7E 48 A7 ED 76 70 C6 9D C6 BD A6 9B 58 8B ");
let mut recovered = String::new();
a_des.decrypt_vec_into_string(iv, &cipher, &mut recovered);
println!("B =\t{}", recovered);
assert_eq!(recovered, "In the beginning God created the heavens and the earth.");
assert_eq!(recovered, message);
println!("-------------------------------");
}
fn des_quick_start_weak_keys()
{
println!("des_quick_start_weak_keys()");
use cryptocol::symmetric::DES;
let message = 0x1234567890ABCDEF_u64;
let mut cipher: u64;
let weak_key = [0x0000000000000000_u64, 0x0101010101010101, 0xFFFFFFFFFFFFFFFF, 0xFEFEFEFEFEFEFEFE, 0xF1F1F1F1E0E0E0E0, 0xF0F0F0F0E1E1E1E1, 0x0E0E0E0E1F1F1F1F, 0x0F0F0F0F1E1E1E1E];
let mut des = DES::new();
for key in weak_key
{
println!("Weak Key:\t{:#018X}", key);
des.set_key_u64(key);
cipher = des.encrypt_u64(message);
cipher = des.encrypt_u64(cipher);
println!("Message =\t{:#018X}", message);
println!("Cipher =\t{:#018X}", cipher);
assert_eq!(message, cipher);
println!();
}
println!("-------------------------------");
}
fn des_quick_start_semi_weak_keys()
{
println!("des_quick_start_weak_keys()");
use cryptocol::symmetric::DES;
let message = 0x1234567890ABCDEF_u64;
let mut cipher: u64;
let semi_weak_key: [(u64, u64); 6] = [ (0x0E010E011F011F01, 0x010E010E011F011F),
(0xF101F101E001E001, 0x01F101F101E001E0),
(0xFE01FE01FE01FE01, 0x01FE01FE01FE01FE),
(0xF10EF10EE01FE01F, 0x0EF10EF11FE01FE0),
(0xFE0EFE0EFE1FFE1F, 0x0EFE0EFE1FFE1FFE),
(0xFEF1FEF1FEE0FEE0, 0xF1FEF1FEE0FEE0FE)];
let mut des = DES::new();
for key in semi_weak_key
{
println!("Semi-weak Key pair: {:#018X}, {:#018X}", key.0, key.1);
des.set_key_u64(key.0);
cipher = des.encrypt_u64(message);
des.set_key_u64(key.1);
cipher = des.encrypt_u64(cipher);
println!("Message =\t{:#018X}", message);
println!("Cipher =\t{:#018X}", cipher);
assert_eq!(message, cipher);
println!();
}
println!("-------------------------------");
}
fn des_basic_operation_main()
{
des_new();
des_new_with_key();
des_new_with_key_u64();
des_encryptor_with_key();
des_encryptor_with_key_u64();
des_decryptor_with_key();
des_decryptor_with_key_u64();
des_get_key();
des_get_key_u64();
des_set_key();
des_set_key_u64();
des_turn_inverse();
des_turn_encryptor();
des_turn_decryptor();
}
fn des_new()
{
println!("des_new()");
use cryptocol::symmetric::DES;
let mut des = DES::new(); let plaintext = 0x1234567890ABCDEF_u64;
let ciphertext = des.encrypt_u64(plaintext);
println!("Plaintext:\t\t{:#018X}", plaintext);
println!("Ciphertext:\t\t{:#018X}", ciphertext);
assert_eq!(ciphertext, 0x1E32B46B44C69201_u64);
let cipher_cipher_text = des.encrypt_u64(ciphertext);
println!("Cipher-ciphertext:\t{:#018X}", cipher_cipher_text);
assert_eq!(cipher_cipher_text, 0x1234567890ABCDEF_u64);
assert_eq!(cipher_cipher_text, plaintext);
#[cfg(test)]
des_compile_fail_new();
println!("-------------------------------");
}
#[test]
fn des_compile_fail_new()
{
use cryptocol::symmetric::DES;
let des = DES::new();
#[cfg(compile_fail)] des.encrypt_u64(0x1E32B46B44C69201_u64);
}
fn des_new_with_key()
{
println!("des_new_with_key()");
use cryptocol::symmetric::DES;
let mut des = DES::new_with_key([0x12, 0x34, 0x56, 0x78, 0x90, 0xAB, 0xCD, 0xEF]);
let plaintext = 0x1234567890ABCDEF_u64;
let ciphertext = des.encrypt_u64(plaintext);
println!("Plaintext:\t\t{:#018X}", plaintext);
println!("Ciphertext:\t\t{:#018X}", ciphertext);
assert_eq!(ciphertext, 0x3B6041D76AF28F23_u64);
let cipher_cipher_text = des.encrypt_u64(ciphertext);
println!("Cipher-ciphertext:\t{:#018X}\n", cipher_cipher_text);
assert_eq!(cipher_cipher_text, 0x7C5AAE491DC1310D_u64);
assert_ne!(cipher_cipher_text, plaintext);
println!();
let mut des1 = DES::new_with_key([0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00]);
let mut des2 = DES::new_with_key([0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01]);
let plaintext = 0x1234567890ABCDEF_u64;
let ciphertext1 = des1.encrypt_u64(plaintext);
let ciphertext2 = des2.encrypt_u64(plaintext);
println!("Plaintext:\t\t{:#018X}", plaintext);
println!("Ciphertext1:\t\t{:#018X}", ciphertext1);
println!("Ciphertext2:\t\t{:#018X}", ciphertext2);
assert_eq!(ciphertext1, 0x1E32B46B44C69201_u64);
assert_eq!(ciphertext2, 0x1E32B46B44C69201_u64);
assert_eq!(ciphertext1, ciphertext2);
let cipher_cipher_text1 = des1.encrypt_u64(ciphertext1);
let cipher_cipher_text2 = des2.encrypt_u64(ciphertext2);
println!("Cipher-ciphertext1:\t{:#018X}\n", cipher_cipher_text1);
println!("Cipher-ciphertext2:\t{:#018X}\n", cipher_cipher_text2);
assert_eq!(cipher_cipher_text1, 0x1234567890ABCDEF_u64);
assert_eq!(cipher_cipher_text2, 0x1234567890ABCDEF_u64);
assert_eq!(cipher_cipher_text1, plaintext);
assert_eq!(cipher_cipher_text2, plaintext);
println!();
let mut des1 = DES::new_with_key([0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF]);
let mut des2 = DES::new_with_key([0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE]);
let plaintext = 0x1234567890ABCDEF_u64;
let ciphertext1 = des1.encrypt_u64(plaintext);
let ciphertext2 = des2.encrypt_u64(plaintext);
println!("Plaintext:\t\t{:#018X}", plaintext);
println!("Ciphertext1:\t\t{:#018X}", ciphertext1);
println!("Ciphertext2:\t\t{:#018X}", ciphertext2);
assert_eq!(ciphertext1, 0xA5997AB38BC07250_u64);
assert_eq!(ciphertext2, 0xA5997AB38BC07250_u64);
assert_eq!(ciphertext1, ciphertext2);
let cipher_cipher_text1 = des1.encrypt_u64(ciphertext1);
let cipher_cipher_text2 = des2.encrypt_u64(ciphertext2);
println!("Cipher-ciphertext1:\t{:#018X}\n", cipher_cipher_text1);
println!("Cipher-ciphertext2:\t{:#018X}\n", cipher_cipher_text2);
assert_eq!(cipher_cipher_text1, 0x1234567890ABCDEF_u64);
assert_eq!(cipher_cipher_text2, 0x1234567890ABCDEF_u64);
assert_eq!(cipher_cipher_text1, plaintext);
assert_eq!(cipher_cipher_text2, plaintext);
println!();
let mut des1 = DES::new_with_key([0xE0, 0xE0, 0xE0, 0xE0, 0xF1, 0xF1, 0xF1, 0xF1]);
let mut des2 = DES::new_with_key([0xE1, 0xE1, 0xE1, 0xE1, 0xF0, 0xF0, 0xF0, 0xF0]);
let plaintext = 0x1234567890ABCDEF_u64;
let ciphertext1 = des1.encrypt_u64(plaintext);
let ciphertext2 = des2.encrypt_u64(plaintext);
println!("Plaintext:\t\t{:#018X}", plaintext);
println!("Ciphertext1:\t\t{:#018X}", ciphertext1);
println!("Ciphertext2:\t\t{:#018X}", ciphertext2);
assert_eq!(ciphertext1, 0x94CCA0201F033101_u64);
assert_eq!(ciphertext2, 0x94CCA0201F033101_u64);
assert_eq!(ciphertext1, ciphertext2);
let cipher_cipher_text1 = des1.encrypt_u64(ciphertext1);
let cipher_cipher_text2 = des2.encrypt_u64(ciphertext2);
println!("Cipher-ciphertext1:\t{:#018X}\n", cipher_cipher_text1);
println!("Cipher-ciphertext2:\t{:#018X}\n", cipher_cipher_text2);
assert_eq!(cipher_cipher_text1, 0x1234567890ABCDEF_u64);
assert_eq!(cipher_cipher_text2, 0x1234567890ABCDEF_u64);
assert_eq!(cipher_cipher_text1, plaintext);
assert_eq!(cipher_cipher_text2, plaintext);
println!();
let mut des1 = DES::new_with_key([0x1F, 0x1F, 0x1F, 0x1F, 0x0E, 0x0E, 0x0E, 0x0E]);
let mut des2 = DES::new_with_key([0x1E, 0x1E, 0x1E, 0x1E, 0x0F, 0x0F, 0x0F, 0x0F]);
let plaintext = 0x1234567890ABCDEF_u64;
let ciphertext1 = des1.encrypt_u64(plaintext);
let ciphertext2 = des2.encrypt_u64(plaintext);
println!("Plaintext:\t\t{:#018X}", plaintext);
println!("Ciphertext1:\t\t{:#018X}", ciphertext1);
println!("Ciphertext2:\t\t{:#018X}", ciphertext2);
assert_eq!(ciphertext1, 0x4FB6397B5352DB0C_u64);
assert_eq!(ciphertext2, 0x4FB6397B5352DB0C_u64);
assert_eq!(ciphertext1, ciphertext2);
let cipher_cipher_text1 = des1.encrypt_u64(ciphertext1);
let cipher_cipher_text2 = des2.encrypt_u64(ciphertext2);
println!("Cipher-ciphertext1:\t{:#018X}\n", cipher_cipher_text1);
println!("Cipher-ciphertext2:\t{:#018X}\n", cipher_cipher_text2);
assert_eq!(cipher_cipher_text1, 0x1234567890ABCDEF_u64);
assert_eq!(cipher_cipher_text2, 0x1234567890ABCDEF_u64);
assert_eq!(cipher_cipher_text1, plaintext);
assert_eq!(cipher_cipher_text2, plaintext);
println!();
let mut des1 = DES::new_with_key([0x01, 0x1F, 0x01, 0x1F, 0x01, 0x0E, 0x01, 0x0E]);
let mut des2 = DES::new_with_key([0x1F, 0x01, 0x1F, 0x01, 0x0E, 0x01, 0x0E, 0x01]);
let plaintext = 0x1234567890ABCDEF_u64;
let ciphertext = des1.encrypt_u64(plaintext);
println!("Plaintext:\t\t{:#018X}", plaintext);
println!("Ciphertext:\t\t{:#018X}", ciphertext);
assert_eq!(ciphertext, 0xC2C71D736E97876C_u64);
let cipher_cipher_text = des2.encrypt_u64(ciphertext);
println!("Cipher-ciphertext:\t{:#018X}\n", cipher_cipher_text);
assert_eq!(cipher_cipher_text, 0x1234567890ABCDEF_u64);
assert_eq!(cipher_cipher_text, plaintext);
let ciphertext = des2.encrypt_u64(plaintext);
println!("Plaintext:\t\t{:#018X}", plaintext);
println!("Ciphertext:\t\t{:#018X}", ciphertext);
assert_eq!(ciphertext, 0x063A6E55466423D2_u64);
let cipher_cipher_text = des1.encrypt_u64(ciphertext);
println!("Cipher-ciphertext:\t{:#018X}\n", cipher_cipher_text);
assert_eq!(cipher_cipher_text, 0x1234567890ABCDEF_u64);
assert_eq!(cipher_cipher_text, plaintext);
println!();
let mut des1 = DES::new_with_key([0x01, 0xE0, 0x01, 0xE0, 0x01, 0xF1, 0x01, 0xF1]);
let mut des2 = DES::new_with_key([0xE0, 0x01, 0xE0, 0x01, 0xF1, 0x01, 0xF1, 0x01]);
let plaintext = 0x1234567890ABCDEF_u64;
let ciphertext = des1.encrypt_u64(plaintext);
println!("Plaintext:\t\t{:#018X}", plaintext);
println!("Ciphertext:\t\t{:#018X}", ciphertext);
assert_eq!(ciphertext, 0x85A63690E79AAA15_u64);
let cipher_cipher_text = des2.encrypt_u64(ciphertext);
println!("Cipher-ciphertext:\t{:#018X}\n", cipher_cipher_text);
assert_eq!(cipher_cipher_text, 0x1234567890ABCDEF_u64);
assert_eq!(cipher_cipher_text, plaintext);
let ciphertext = des2.encrypt_u64(plaintext);
println!("Plaintext:\t\t{:#018X}", plaintext);
println!("Ciphertext:\t\t{:#018X}", ciphertext);
assert_eq!(ciphertext, 0x15B721BBB44A12F5_u64);
let cipher_cipher_text = des1.encrypt_u64(ciphertext);
println!("Cipher-ciphertext:\t{:#018X}\n", cipher_cipher_text);
assert_eq!(cipher_cipher_text, 0x1234567890ABCDEF_u64);
assert_eq!(cipher_cipher_text, plaintext);
println!();
let mut des1 = DES::new_with_key([0x01, 0xFE, 0x01, 0xFE, 0x01, 0xFE, 0x01, 0xFE]);
let mut des2 = DES::new_with_key([0xFE, 0x01, 0xFE, 0x01, 0xFE, 0x01, 0xFE, 0x01]);
let plaintext = 0x1234567890ABCDEF_u64;
let ciphertext = des1.encrypt_u64(plaintext);
println!("Plaintext:\t\t{:#018X}", plaintext);
println!("Ciphertext:\t\t{:#018X}", ciphertext);
assert_eq!(ciphertext, 0xAE38CC9D9FA48581_u64);
let cipher_cipher_text = des2.encrypt_u64(ciphertext);
println!("Cipher-ciphertext:\t{:#018X}\n", cipher_cipher_text);
assert_eq!(cipher_cipher_text, 0x1234567890ABCDEF_u64);
assert_eq!(cipher_cipher_text, plaintext);
let ciphertext = des2.encrypt_u64(plaintext);
println!("Plaintext:\t\t{:#018X}", plaintext);
println!("Ciphertext:\t\t{:#018X}", ciphertext);
assert_eq!(ciphertext, 0x7EE95658A653960D_u64);
let cipher_cipher_text = des1.encrypt_u64(ciphertext);
println!("Cipher-ciphertext:\t{:#018X}\n", cipher_cipher_text);
assert_eq!(cipher_cipher_text, 0x1234567890ABCDEF_u64);
assert_eq!(cipher_cipher_text, plaintext);
println!();
let mut des1 = DES::new_with_key([0x1F, 0xE0, 0x1F, 0xE0, 0x0E, 0xF1, 0x0E, 0xF1]);
let mut des2 = DES::new_with_key([0xE0, 0x1F, 0xE0, 0x1F, 0xF1, 0x0E, 0xF1, 0x0E]);
let plaintext = 0x1234567890ABCDEF_u64;
let ciphertext = des1.encrypt_u64(plaintext);
println!("Plaintext:\t\t{:#018X}", plaintext);
println!("Ciphertext:\t\t{:#018X}", ciphertext);
assert_eq!(ciphertext, 0x81ECC05B173F793E_u64);
let cipher_cipher_text = des2.encrypt_u64(ciphertext);
println!("Cipher-ciphertext:\t{:#018X}\n", cipher_cipher_text);
assert_eq!(cipher_cipher_text, 0x1234567890ABCDEF_u64);
assert_eq!(cipher_cipher_text, plaintext);
let ciphertext = des2.encrypt_u64(plaintext);
println!("Plaintext:\t\t{:#018X}", plaintext);
println!("Ciphertext:\t\t{:#018X}", ciphertext);
assert_eq!(ciphertext, 0x4D0AD4DC147E4BDF_u64);
let cipher_cipher_text = des1.encrypt_u64(ciphertext);
println!("Cipher-ciphertext:\t{:#018X}\n", cipher_cipher_text);
assert_eq!(cipher_cipher_text, 0x1234567890ABCDEF_u64);
assert_eq!(cipher_cipher_text, plaintext);
println!();
let mut des1 = DES::new_with_key([0x1F, 0xFE, 0x1F, 0xFE, 0x0E, 0xFE, 0x0E, 0xFE]);
let mut des2 = DES::new_with_key([0xFE, 0x1F, 0xFE, 0x1F, 0xFE, 0x0E, 0xFE, 0x0E]);
let plaintext = 0x1234567890ABCDEF_u64;
let ciphertext = des1.encrypt_u64(plaintext);
println!("Plaintext:\t\t{:#018X}", plaintext);
println!("Ciphertext:\t\t{:#018X}", ciphertext);
assert_eq!(ciphertext, 0x59735490F84A0AD0_u64);
let cipher_cipher_text = des2.encrypt_u64(ciphertext);
println!("Cipher-ciphertext:\t{:#018X}\n", cipher_cipher_text);
assert_eq!(cipher_cipher_text, 0x1234567890ABCDEF_u64);
assert_eq!(cipher_cipher_text, plaintext);
let ciphertext = des2.encrypt_u64(plaintext);
println!("Plaintext:\t\t{:#018X}", plaintext);
println!("Ciphertext:\t\t{:#018X}", ciphertext);
assert_eq!(ciphertext, 0x79FD3CBFE57F4B0B_u64);
let cipher_cipher_text = des1.encrypt_u64(ciphertext);
println!("Cipher-ciphertext:\t{:#018X}\n", cipher_cipher_text);
assert_eq!(cipher_cipher_text, 0x1234567890ABCDEF_u64);
assert_eq!(cipher_cipher_text, plaintext);
println!();
let mut des1 = DES::new_with_key([0xE0, 0xFE, 0xE0, 0xFE, 0xF1, 0xFE, 0xF1, 0xFE]);
let mut des2 = DES::new_with_key([0xFE, 0xE0, 0xFE, 0xE0, 0xFE, 0xF1, 0xFE, 0xF1]);
let plaintext = 0x1234567890ABCDEF_u64;
let ciphertext = des1.encrypt_u64(plaintext);
println!("Plaintext:\t\t{:#018X}", plaintext);
println!("Ciphertext:\t\t{:#018X}", ciphertext);
assert_eq!(ciphertext, 0x27C83AAE29571889_u64);
let cipher_cipher_text = des2.encrypt_u64(ciphertext);
println!("Cipher-ciphertext:\t{:#018X}\n", cipher_cipher_text);
assert_eq!(cipher_cipher_text, 0x1234567890ABCDEF_u64);
assert_eq!(cipher_cipher_text, plaintext);
let ciphertext = des2.encrypt_u64(plaintext);
println!("Plaintext:\t\t{:#018X}", plaintext);
println!("Ciphertext:\t\t{:#018X}", ciphertext);
assert_eq!(ciphertext, 0xDE76DF630C033919_u64);
let cipher_cipher_text = des1.encrypt_u64(ciphertext);
println!("Cipher-ciphertext:\t{:#018X}\n", cipher_cipher_text);
assert_eq!(cipher_cipher_text, 0x1234567890ABCDEF_u64);
assert_eq!(cipher_cipher_text, plaintext);
#[cfg(test)]
des_compile_fail_new_with_key();
println!("-------------------------------");
}
#[test]
fn des_compile_fail_new_with_key()
{
use cryptocol::symmetric::DES;
let des = DES::new_with_key([0x12, 0x34, 0x56, 0x78, 0x90, 0xAB, 0xCD, 0xEF]);
#[cfg(compile_fail)] des.encrypt_u64(0x1E32B46B44C69201_u64);
}
fn des_new_with_key_u64()
{
println!("des_new_with_key_u64");
use cryptocol::symmetric::DES;
let mut des = DES::new_with_key_u64(0xEFCDAB9078563412);
let plaintext = 0x1234567890ABCDEF_u64;
let ciphertext = des.encrypt_u64(plaintext);
println!("Plaintext:\t\t{:#018X}", plaintext);
println!("Ciphertext:\t\t{:#018X}", ciphertext);
assert_eq!(ciphertext, 0x3B6041D76AF28F23_u64);
let cipher_cipher_text = des.encrypt_u64(ciphertext);
println!("Cipher-ciphertext:\t{:#018X}\n", cipher_cipher_text);
assert_eq!(cipher_cipher_text, 0x7C5AAE491DC1310D_u64);
assert_ne!(cipher_cipher_text, plaintext);
println!();
let mut des1 = DES::new_with_key_u64(0x0000000000000000);
let mut des2 = DES::new_with_key_u64(0x0101010101010101);
let plaintext = 0x1234567890ABCDEF_u64;
let ciphertext1 = des1.encrypt_u64(plaintext);
let ciphertext2 = des2.encrypt_u64(plaintext);
println!("Plaintext:\t\t{:#018X}", plaintext);
println!("Ciphertext1:\t\t{:#018X}", ciphertext1);
println!("Ciphertext2:\t\t{:#018X}", ciphertext2);
assert_eq!(ciphertext1, 0x1E32B46B44C69201_u64);
assert_eq!(ciphertext2, 0x1E32B46B44C69201_u64);
assert_eq!(ciphertext1, ciphertext2);
let cipher_cipher_text1 = des1.encrypt_u64(ciphertext1);
let cipher_cipher_text2 = des2.encrypt_u64(ciphertext2);
println!("Cipher-ciphertext1:\t{:#018X}\n", cipher_cipher_text1);
println!("Cipher-ciphertext2:\t{:#018X}\n", cipher_cipher_text2);
assert_eq!(cipher_cipher_text1, 0x1234567890ABCDEF_u64);
assert_eq!(cipher_cipher_text2, 0x1234567890ABCDEF_u64);
assert_eq!(cipher_cipher_text1, plaintext);
assert_eq!(cipher_cipher_text2, plaintext);
println!();
let mut des1 = DES::new_with_key_u64(0xFFFFFFFFFFFFFFFF);
let mut des2 = DES::new_with_key_u64(0xFEFEFEFEFEFEFEFE);
let plaintext = 0x1234567890ABCDEF_u64;
let ciphertext1 = des1.encrypt_u64(plaintext);
let ciphertext2 = des2.encrypt_u64(plaintext);
println!("Plaintext:\t\t{:#018X}", plaintext);
println!("Ciphertext1:\t\t{:#018X}", ciphertext1);
println!("Ciphertext2:\t\t{:#018X}", ciphertext2);
assert_eq!(ciphertext1, 0xA5997AB38BC07250_u64);
assert_eq!(ciphertext2, 0xA5997AB38BC07250_u64);
assert_eq!(ciphertext1, ciphertext2);
let cipher_cipher_text1 = des1.encrypt_u64(ciphertext1);
let cipher_cipher_text2 = des2.encrypt_u64(ciphertext2);
println!("Cipher-ciphertext1:\t{:#018X}\n", cipher_cipher_text1);
println!("Cipher-ciphertext2:\t{:#018X}\n", cipher_cipher_text2);
assert_eq!(cipher_cipher_text1, 0x1234567890ABCDEF_u64);
assert_eq!(cipher_cipher_text2, 0x1234567890ABCDEF_u64);
assert_eq!(cipher_cipher_text1, plaintext);
assert_eq!(cipher_cipher_text2, plaintext);
println!();
let mut des1 = DES::new_with_key_u64(0xF1F1F1F1E0E0E0E0);
let mut des2 = DES::new_with_key_u64(0xF0F0F0F0E1E1E1E1);
let plaintext = 0x1234567890ABCDEF_u64;
let ciphertext1 = des1.encrypt_u64(plaintext);
let ciphertext2 = des2.encrypt_u64(plaintext);
println!("Plaintext:\t\t{:#018X}", plaintext);
println!("Ciphertext1:\t\t{:#018X}", ciphertext1);
println!("Ciphertext2:\t\t{:#018X}", ciphertext2);
assert_eq!(ciphertext1, 0x94CCA0201F033101_u64);
assert_eq!(ciphertext2, 0x94CCA0201F033101_u64);
assert_eq!(ciphertext1, ciphertext2);
let cipher_cipher_text1 = des1.encrypt_u64(ciphertext1);
let cipher_cipher_text2 = des2.encrypt_u64(ciphertext2);
println!("Cipher-ciphertext1:\t{:#018X}\n", cipher_cipher_text1);
println!("Cipher-ciphertext2:\t{:#018X}\n", cipher_cipher_text2);
assert_eq!(cipher_cipher_text1, 0x1234567890ABCDEF_u64);
assert_eq!(cipher_cipher_text2, 0x1234567890ABCDEF_u64);
assert_eq!(cipher_cipher_text1, plaintext);
assert_eq!(cipher_cipher_text2, plaintext);
println!();
let mut des1 = DES::new_with_key_u64(0x0E0E0E0E1F1F1F1F);
let mut des2 = DES::new_with_key_u64(0x0F0F0F0F1E1E1E1E);
let plaintext = 0x1234567890ABCDEF_u64;
let ciphertext1 = des1.encrypt_u64(plaintext);
let ciphertext2 = des2.encrypt_u64(plaintext);
println!("Plaintext:\t\t{:#018X}", plaintext);
println!("Ciphertext1:\t\t{:#018X}", ciphertext1);
println!("Ciphertext2:\t\t{:#018X}", ciphertext2);
assert_eq!(ciphertext1, 0x4FB6397B5352DB0C_u64);
assert_eq!(ciphertext2, 0x4FB6397B5352DB0C_u64);
assert_eq!(ciphertext1, ciphertext2);
let cipher_cipher_text1 = des1.encrypt_u64(ciphertext1);
let cipher_cipher_text2 = des2.encrypt_u64(ciphertext2);
println!("Cipher-ciphertext1:\t{:#018X}\n", cipher_cipher_text1);
println!("Cipher-ciphertext2:\t{:#018X}\n", cipher_cipher_text2);
assert_eq!(cipher_cipher_text1, 0x1234567890ABCDEF_u64);
assert_eq!(cipher_cipher_text2, 0x1234567890ABCDEF_u64);
assert_eq!(cipher_cipher_text1, plaintext);
assert_eq!(cipher_cipher_text2, plaintext);
println!();
let mut des1 = DES::new_with_key_u64(0x0E010E011F011F01);
let mut des2 = DES::new_with_key_u64(0x010E010E011F011F);
let plaintext = 0x1234567890ABCDEF_u64;
let ciphertext = des1.encrypt_u64(plaintext);
println!("Plaintext:\t\t{:#018X}", plaintext);
println!("Ciphertext:\t\t{:#018X}", ciphertext);
assert_eq!(ciphertext, 0xC2C71D736E97876C_u64);
let cipher_cipher_text = des2.encrypt_u64(ciphertext);
println!("Cipher-ciphertext:\t{:#018X}\n", cipher_cipher_text);
assert_eq!(cipher_cipher_text, 0x1234567890ABCDEF_u64);
assert_eq!(cipher_cipher_text, plaintext);
let ciphertext = des2.encrypt_u64(plaintext);
println!("Plaintext:\t\t{:#018X}", plaintext);
println!("Ciphertext:\t\t{:#018X}", ciphertext);
assert_eq!(ciphertext, 0x063A6E55466423D2_u64);
let cipher_cipher_text = des1.encrypt_u64(ciphertext);
println!("Cipher-ciphertext:\t{:#018X}\n", cipher_cipher_text);
assert_eq!(cipher_cipher_text, 0x1234567890ABCDEF_u64);
assert_eq!(cipher_cipher_text, plaintext);
println!();
let mut des1 = DES::new_with_key_u64(0xF101F101E001E001);
let mut des2 = DES::new_with_key_u64(0x01F101F101E001E0);
let plaintext = 0x1234567890ABCDEF_u64;
let ciphertext = des1.encrypt_u64(plaintext);
println!("Plaintext:\t\t{:#018X}", plaintext);
println!("Ciphertext:\t\t{:#018X}", ciphertext);
assert_eq!(ciphertext, 0x85A63690E79AAA15_u64);
let cipher_cipher_text = des2.encrypt_u64(ciphertext);
println!("Cipher-ciphertext:\t{:#018X}\n", cipher_cipher_text);
assert_eq!(cipher_cipher_text, 0x1234567890ABCDEF_u64);
assert_eq!(cipher_cipher_text, plaintext);
let ciphertext = des2.encrypt_u64(plaintext);
println!("Plaintext:\t\t{:#018X}", plaintext);
println!("Ciphertext:\t\t{:#018X}", ciphertext);
assert_eq!(ciphertext, 0x15B721BBB44A12F5_u64);
let cipher_cipher_text = des1.encrypt_u64(ciphertext);
println!("Cipher-ciphertext:\t{:#018X}\n", cipher_cipher_text);
assert_eq!(cipher_cipher_text, 0x1234567890ABCDEF_u64);
assert_eq!(cipher_cipher_text, plaintext);
println!();
let mut des1 = DES::new_with_key_u64(0xFE01FE01FE01FE01);
let mut des2 = DES::new_with_key_u64(0x01FE01FE01FE01FE);
let plaintext = 0x1234567890ABCDEF_u64;
let ciphertext = des1.encrypt_u64(plaintext);
println!("Plaintext:\t\t{:#018X}", plaintext);
println!("Ciphertext:\t\t{:#018X}", ciphertext);
assert_eq!(ciphertext, 0xAE38CC9D9FA48581_u64);
let cipher_cipher_text = des2.encrypt_u64(ciphertext);
println!("Cipher-ciphertext:\t{:#018X}\n", cipher_cipher_text);
assert_eq!(cipher_cipher_text, 0x1234567890ABCDEF_u64);
assert_eq!(cipher_cipher_text, plaintext);
let ciphertext = des2.encrypt_u64(plaintext);
println!("Plaintext:\t\t{:#018X}", plaintext);
println!("Ciphertext:\t\t{:#018X}", ciphertext);
assert_eq!(ciphertext, 0x7EE95658A653960D_u64);
let cipher_cipher_text = des1.encrypt_u64(ciphertext);
println!("Cipher-ciphertext:\t{:#018X}\n", cipher_cipher_text);
assert_eq!(cipher_cipher_text, 0x1234567890ABCDEF_u64);
assert_eq!(cipher_cipher_text, plaintext);
println!();
let mut des1 = DES::new_with_key_u64(0xF10EF10EE01FE01F);
let mut des2 = DES::new_with_key_u64(0x0EF10EF11FE01FE0);
let plaintext = 0x1234567890ABCDEF_u64;
let ciphertext = des1.encrypt_u64(plaintext);
println!("Plaintext:\t\t{:#018X}", plaintext);
println!("Ciphertext:\t\t{:#018X}", ciphertext);
assert_eq!(ciphertext, 0x81ECC05B173F793E_u64);
let cipher_cipher_text = des2.encrypt_u64(ciphertext);
println!("Cipher-ciphertext:\t{:#018X}\n", cipher_cipher_text);
assert_eq!(cipher_cipher_text, 0x1234567890ABCDEF_u64);
assert_eq!(cipher_cipher_text, plaintext);
let ciphertext = des2.encrypt_u64(plaintext);
println!("Plaintext:\t\t{:#018X}", plaintext);
println!("Ciphertext:\t\t{:#018X}", ciphertext);
assert_eq!(ciphertext, 0x4D0AD4DC147E4BDF_u64);
let cipher_cipher_text = des1.encrypt_u64(ciphertext);
println!("Cipher-ciphertext:\t{:#018X}\n", cipher_cipher_text);
assert_eq!(cipher_cipher_text, 0x1234567890ABCDEF_u64);
assert_eq!(cipher_cipher_text, plaintext);
println!();
let mut des1 = DES::new_with_key_u64(0xFE0EFE0EFE1FFE1F);
let mut des2 = DES::new_with_key_u64(0x0EFE0EFE1FFE1FFE);
let plaintext = 0x1234567890ABCDEF_u64;
let ciphertext = des1.encrypt_u64(plaintext);
println!("Plaintext:\t\t{:#018X}", plaintext);
println!("Ciphertext:\t\t{:#018X}", ciphertext);
assert_eq!(ciphertext, 0x59735490F84A0AD0_u64);
let cipher_cipher_text = des2.encrypt_u64(ciphertext);
println!("Cipher-ciphertext:\t{:#018X}\n", cipher_cipher_text);
assert_eq!(cipher_cipher_text, 0x1234567890ABCDEF_u64);
assert_eq!(cipher_cipher_text, plaintext);
let ciphertext = des2.encrypt_u64(plaintext);
println!("Plaintext:\t\t{:#018X}", plaintext);
println!("Ciphertext:\t\t{:#018X}", ciphertext);
assert_eq!(ciphertext, 0x79FD3CBFE57F4B0B_u64);
let cipher_cipher_text = des1.encrypt_u64(ciphertext);
println!("Cipher-ciphertext:\t{:#018X}\n", cipher_cipher_text);
assert_eq!(cipher_cipher_text, 0x1234567890ABCDEF_u64);
assert_eq!(cipher_cipher_text, plaintext);
println!();
let mut des1 = DES::new_with_key_u64(0xFEF1FEF1FEE0FEE0);
let mut des2 = DES::new_with_key_u64(0xF1FEF1FEE0FEE0FE);
let plaintext = 0x1234567890ABCDEF_u64;
let ciphertext = des1.encrypt_u64(plaintext);
println!("Plaintext:\t\t{:#018X}", plaintext);
println!("Ciphertext:\t\t{:#018X}", ciphertext);
assert_eq!(ciphertext, 0x27C83AAE29571889_u64);
let cipher_cipher_text = des2.encrypt_u64(ciphertext);
println!("Cipher-ciphertext:\t{:#018X}\n", cipher_cipher_text);
assert_eq!(cipher_cipher_text, 0x1234567890ABCDEF_u64);
assert_eq!(cipher_cipher_text, plaintext);
let ciphertext = des2.encrypt_u64(plaintext);
println!("Plaintext:\t\t{:#018X}", plaintext);
println!("Ciphertext:\t\t{:#018X}", ciphertext);
assert_eq!(ciphertext, 0xDE76DF630C033919_u64);
let cipher_cipher_text = des1.encrypt_u64(ciphertext);
println!("Cipher-ciphertext:\t{:#018X}\n", cipher_cipher_text);
assert_eq!(cipher_cipher_text, 0x1234567890ABCDEF_u64);
assert_eq!(cipher_cipher_text, plaintext);
println!("-------------------------------");
}
fn des_encryptor_with_key()
{
println!("des_encryptor_with_key");
use cryptocol::symmetric::{ DES, BigCryptor64, SmallCryptor };
let keys: [Box<dyn SmallCryptor<u64, 8>>; 3]
= [ Box::new(DES::encryptor_with_key([0xEF_u8, 0xCD, 0xAB, 0x90, 0x78, 0x56, 0x34, 0x12])),
Box::new(DES::decryptor_with_key([0x21_u8, 0x43, 0x65, 0x87, 0x09, 0xBA, 0xDC, 0xFE])),
Box::new(DES::encryptor_with_key([0xEF_u8, 0xCD, 0xAB, 0x90, 0x78, 0x56, 0x34, 0x12])) ];
let mut tdes = BigCryptor64::new_with_small_cryptor_array(keys);
let plaintext = 0x_1234567890ABCDEF_u64;
let ciphertext = tdes.encrypt_u64(plaintext);
println!("Plaintext:\t\t{:#018X}", plaintext);
println!("Ciphertext:\t\t{:#018X}", ciphertext);
assert_eq!(ciphertext, 0x272A2AC7B4E66748_u64);
let cipher_cipher_text = tdes.decrypt_u64(ciphertext);
println!("Cipher-ciphertext:\t{:#018X}", cipher_cipher_text);
assert_eq!(cipher_cipher_text, 0x1234567890ABCDEF_u64);
assert_eq!(cipher_cipher_text, plaintext);
println!();
let mut tdes = BigCryptor64::new()
+ DES::encryptor_with_key([0xEF_u8, 0xCD, 0xAB, 0x90, 0x78, 0x56, 0x34, 0x12])
- DES::encryptor_with_key([0x21_u8, 0x43, 0x65, 0x87, 0x09, 0xBA, 0xDC, 0xFE])
+ DES::encryptor_with_key([0xEF_u8, 0xCD, 0xAB, 0x90, 0x78, 0x56, 0x34, 0x12]);
let plaintext = 0x_1234567890ABCDEF_u64;
let ciphertext = tdes.encrypt_u64(plaintext);
println!("Plaintext:\t\t{:#018X}", plaintext);
println!("Ciphertext:\t\t{:#018X}", ciphertext);
assert_eq!(ciphertext, 0x_272A2AC7B4E66748_u64);
let cipher_cipher_text = tdes.decrypt_u64(ciphertext);
println!("Cipher-ciphertext:\t{:#018X}", cipher_cipher_text);
assert_eq!(cipher_cipher_text, 0x_1234567890ABCDEF_u64);
assert_eq!(cipher_cipher_text, plaintext);
println!("-------------------------------");
}
fn des_encryptor_with_key_u64()
{
println!("des_encryptor_with_key_u64");
use cryptocol::symmetric::{ BigCryptor64, DES };
let mut tdes = BigCryptor64::new_with_small_cryptor_array(
[Box::new(DES::encryptor_with_key_u64(0x_1234567890ABCDEF_u64)),
Box::new(DES::decryptor_with_key_u64(0x_FEDCBA0987654321_u64)),
Box::new(DES::encryptor_with_key_u64(0x_1234567890ABCDEF_u64))]
);
let plaintext = 0x_1234567890ABCDEF_u64;
let ciphertext = tdes.encrypt_u64(plaintext);
println!("Plaintext:\t\t{:#018X}", plaintext);
println!("Ciphertext:\t\t{:#018X}", ciphertext);
assert_eq!(ciphertext, 0x_272A2AC7B4E66748_u64);
let cipher_cipher_text = tdes.decrypt_u64(ciphertext);
println!("Cipher-ciphertext:\t{:#018X}", cipher_cipher_text);
assert_eq!(cipher_cipher_text, 0x1234567890ABCDEF_u64);
assert_eq!(cipher_cipher_text, plaintext);
println!();
let mut tdes = BigCryptor64::new()
+ DES::encryptor_with_key_u64(0x_1234567890ABCDEF_u64)
- DES::encryptor_with_key_u64(0x_FEDCBA0987654321_u64)
+ DES::encryptor_with_key_u64(0x_1234567890ABCDEF_u64);
let plaintext = 0x_1234567890ABCDEF_u64;
let ciphertext = tdes.encrypt_u64(plaintext);
println!("Plaintext:\t\t{:#018X}", plaintext);
println!("Ciphertext:\t\t{:#018X}", ciphertext);
assert_eq!(ciphertext, 0x_272A2AC7B4E66748_u64);
let cipher_cipher_text = tdes.decrypt_u64(ciphertext);
println!("Cipher-ciphertext:\t{:#018X}", cipher_cipher_text);
assert_eq!(cipher_cipher_text, 0x_1234567890ABCDEF_u64);
assert_eq!(cipher_cipher_text, plaintext);
println!("-------------------------------");
}
fn des_decryptor_with_key()
{
println!("des_decryptor_with_key_u64");
use cryptocol::symmetric::{ DES, BigCryptor64, SmallCryptor };
let keys: [Box<dyn SmallCryptor<u64, 8>>; 3]
= [ Box::new(DES::encryptor_with_key([0xEF_u8, 0xCD, 0xAB, 0x90, 0x78, 0x56, 0x34, 0x12])),
Box::new(DES::decryptor_with_key([0x21_u8, 0x43, 0x65, 0x87, 0x09, 0xBA, 0xDC, 0xFE])),
Box::new(DES::encryptor_with_key([0xEF_u8, 0xCD, 0xAB, 0x90, 0x78, 0x56, 0x34, 0x12])) ];
let mut tdes = BigCryptor64::new_with_small_cryptor_array(keys);
let plaintext = 0x_1234567890ABCDEF_u64;
let ciphertext = tdes.encrypt_u64(plaintext);
println!("Plaintext:\t\t{:#018X}", plaintext);
println!("Ciphertext:\t\t{:#018X}", ciphertext);
assert_eq!(ciphertext, 0x272A2AC7B4E66748_u64);
let cipher_cipher_text = tdes.decrypt_u64(ciphertext);
println!("Cipher-ciphertext:\t{:#018X}", cipher_cipher_text);
assert_eq!(cipher_cipher_text, 0x1234567890ABCDEF_u64);
assert_eq!(cipher_cipher_text, plaintext);
println!();
let mut tdes = BigCryptor64::new()
- DES::decryptor_with_key([0xEF_u8, 0xCD, 0xAB, 0x90, 0x78, 0x56, 0x34, 0x12])
- DES::encryptor_with_key([0x21_u8, 0x43, 0x65, 0x87, 0x09, 0xBA, 0xDC, 0xFE])
- DES::decryptor_with_key([0xEF_u8, 0xCD, 0xAB, 0x90, 0x78, 0x56, 0x34, 0x12]);
let plaintext = 0x_1234567890ABCDEF_u64;
let ciphertext = tdes.encrypt_u64(plaintext);
println!("Plaintext:\t\t{:#018X}", plaintext);
println!("Ciphertext:\t\t{:#018X}", ciphertext);
assert_eq!(ciphertext, 0x_272A2AC7B4E66748_u64);
let cipher_cipher_text = tdes.decrypt_u64(ciphertext);
println!("Cipher-ciphertext:\t{:#018X}", cipher_cipher_text);
assert_eq!(cipher_cipher_text, 0x_1234567890ABCDEF_u64);
assert_eq!(cipher_cipher_text, plaintext);
println!("-------------------------------");
}
fn des_decryptor_with_key_u64()
{
println!("des_decryptor_with_key_u64");
use cryptocol::symmetric::{ BigCryptor64, DES };
let mut tdes = BigCryptor64::new_with_small_cryptor_array(
[ Box::new(DES::encryptor_with_key_u64(0x_1234567890ABCDEF_u64)),
Box::new(DES::decryptor_with_key_u64(0x_FEDCBA0987654321_u64)),
Box::new(DES::encryptor_with_key_u64(0x_1234567890ABCDEF_u64)) ] );
let plaintext = 0x_1234567890ABCDEF_u64;
let ciphertext = tdes.encrypt_u64(plaintext);
println!("Plaintext:\t\t{:#018X}", plaintext);
println!("Ciphertext:\t\t{:#018X}", ciphertext);
assert_eq!(ciphertext, 0x272A2AC7B4E66748_u64);
let cipher_cipher_text = tdes.decrypt_u64(ciphertext);
println!("Cipher-ciphertext:\t{:#018X}", cipher_cipher_text);
assert_eq!(cipher_cipher_text, 0x1234567890ABCDEF_u64);
assert_eq!(cipher_cipher_text, plaintext);
println!();
let mut tdes = BigCryptor64::new()
- DES::decryptor_with_key_u64(0x_1234567890ABCDEF_u64)
+ DES::decryptor_with_key_u64(0x_FEDCBA0987654321_u64)
- DES::decryptor_with_key_u64(0x_1234567890ABCDEF_u64);
let plaintext = 0x_1234567890ABCDEF_u64;
let ciphertext = tdes.encrypt_u64(plaintext);
println!("Plaintext:\t\t{:#018X}", plaintext);
println!("Ciphertext:\t\t{:#018X}", ciphertext);
assert_eq!(ciphertext, 0x_272A2AC7B4E66748_u64);
let cipher_cipher_text = tdes.decrypt_u64(ciphertext);
println!("Cipher-ciphertext:\t{:#018X}", cipher_cipher_text);
assert_eq!(cipher_cipher_text, 0x_1234567890ABCDEF_u64);
assert_eq!(cipher_cipher_text, plaintext);
println!("-------------------------------");
}
fn des_get_key()
{
println!("des_get_key");
use cryptocol::symmetric::DES;
let mut des = DES::new();
des.set_key([0x12, 0x34, 0x56, 0x78, 0x90, 0xAB, 0xCD, 0xEF]);
let key = des.get_key();
print!("K = ");
for k in key
{ print!("{:#02X} ", k); }
assert_eq!(key, [0x12, 0x34, 0x56, 0x78, 0x90, 0xAB, 0xCD, 0xEF]);
}
fn des_get_key_u64()
{
println!("des_get_key_u64");
use cryptocol::symmetric::DES;
let mut des = DES::new();
des.set_key_u64(0xEFCDAB9078563412);
let key = des.get_key_u64();
println!("Key = {}", key);
assert_eq!(key, 0xEFCDAB9078563412_u64);
}
fn des_set_key()
{
println!("des_set_key");
use cryptocol::symmetric::DES;
let mut des = DES::new();
des.set_key([0x12, 0x34, 0x56, 0x78, 0x90, 0xAB, 0xCD, 0xEF]);
let plaintext = 0x1234567890ABCDEF_u64;
let ciphertext = des.encrypt_u64(plaintext);
println!("Plaintext:\t\t{:#018X}", plaintext);
println!("Ciphertext:\t\t{:#018X}", ciphertext);
assert_eq!(ciphertext, 0x3B6041D76AF28F23_u64);
let cipher_cipher_text = des.encrypt_u64(ciphertext);
println!("Cipher-ciphertext:\t{:#018X}\n", cipher_cipher_text);
assert_eq!(cipher_cipher_text, 0x7C5AAE491DC1310D_u64);
assert_ne!(cipher_cipher_text, plaintext);
println!();
let mut des1 = DES::new();
let mut des2 = DES::new();
des1.set_key([0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00]);
des2.set_key([0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01]);
let plaintext = 0x1234567890ABCDEF_u64;
let ciphertext1 = des1.encrypt_u64(plaintext);
let ciphertext2 = des2.encrypt_u64(plaintext);
println!("Plaintext:\t\t{:#018X}", plaintext);
println!("Ciphertext1:\t\t{:#018X}", ciphertext1);
println!("Ciphertext2:\t\t{:#018X}", ciphertext2);
assert_eq!(ciphertext1, 0x1E32B46B44C69201_u64);
assert_eq!(ciphertext2, 0x1E32B46B44C69201_u64);
assert_eq!(ciphertext1, ciphertext2);
let cipher_cipher_text1 = des1.encrypt_u64(ciphertext1);
let cipher_cipher_text2 = des2.encrypt_u64(ciphertext2);
println!("Cipher-ciphertext1:\t{:#018X}\n", cipher_cipher_text1);
println!("Cipher-ciphertext2:\t{:#018X}\n", cipher_cipher_text2);
assert_eq!(cipher_cipher_text1, 0x1234567890ABCDEF_u64);
assert_eq!(cipher_cipher_text2, 0x1234567890ABCDEF_u64);
assert_eq!(cipher_cipher_text1, plaintext);
assert_eq!(cipher_cipher_text2, plaintext);
println!();
let mut des1 = DES::new();
let mut des2 = DES::new();
des1.set_key([0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF]);
des2.set_key([0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE]);
let plaintext = 0x1234567890ABCDEF_u64;
let ciphertext1 = des1.encrypt_u64(plaintext);
let ciphertext2 = des2.encrypt_u64(plaintext);
println!("Plaintext:\t\t{:#018X}", plaintext);
println!("Ciphertext1:\t\t{:#018X}", ciphertext1);
println!("Ciphertext2:\t\t{:#018X}", ciphertext2);
assert_eq!(ciphertext1, 0xA5997AB38BC07250_u64);
assert_eq!(ciphertext2, 0xA5997AB38BC07250_u64);
assert_eq!(ciphertext1, ciphertext2);
let cipher_cipher_text1 = des1.encrypt_u64(ciphertext1);
let cipher_cipher_text2 = des2.encrypt_u64(ciphertext2);
println!("Cipher-ciphertext1:\t{:#018X}\n", cipher_cipher_text1);
println!("Cipher-ciphertext2:\t{:#018X}\n", cipher_cipher_text2);
assert_eq!(cipher_cipher_text1, 0x1234567890ABCDEF_u64);
assert_eq!(cipher_cipher_text2, 0x1234567890ABCDEF_u64);
assert_eq!(cipher_cipher_text1, plaintext);
assert_eq!(cipher_cipher_text2, plaintext);
println!();
let mut des1 = DES::new();
let mut des2 = DES::new();
des1.set_key([0xE0, 0xE0, 0xE0, 0xE0, 0xF1, 0xF1, 0xF1, 0xF1]);
des2.set_key([0xE1, 0xE1, 0xE1, 0xE1, 0xF0, 0xF0, 0xF0, 0xF0]);
let plaintext = 0x1234567890ABCDEF_u64;
let ciphertext1 = des1.encrypt_u64(plaintext);
let ciphertext2 = des2.encrypt_u64(plaintext);
println!("Plaintext:\t\t{:#018X}", plaintext);
println!("Ciphertext1:\t\t{:#018X}", ciphertext1);
println!("Ciphertext2:\t\t{:#018X}", ciphertext2);
assert_eq!(ciphertext1, 0x94CCA0201F033101_u64);
assert_eq!(ciphertext2, 0x94CCA0201F033101_u64);
assert_eq!(ciphertext1, ciphertext2);
let cipher_cipher_text1 = des1.encrypt_u64(ciphertext1);
let cipher_cipher_text2 = des2.encrypt_u64(ciphertext2);
println!("Cipher-ciphertext1:\t{:#018X}\n", cipher_cipher_text1);
println!("Cipher-ciphertext2:\t{:#018X}\n", cipher_cipher_text2);
assert_eq!(cipher_cipher_text1, 0x1234567890ABCDEF_u64);
assert_eq!(cipher_cipher_text2, 0x1234567890ABCDEF_u64);
assert_eq!(cipher_cipher_text1, plaintext);
assert_eq!(cipher_cipher_text2, plaintext);
println!();
let mut des1 = DES::new();
let mut des2 = DES::new();
des1.set_key([0x1F, 0x1F, 0x1F, 0x1F, 0x0E, 0x0E, 0x0E, 0x0E]);
des2.set_key([0x1E, 0x1E, 0x1E, 0x1E, 0x0F, 0x0F, 0x0F, 0x0F]);
let plaintext = 0x1234567890ABCDEF_u64;
let ciphertext1 = des1.encrypt_u64(plaintext);
let ciphertext2 = des2.encrypt_u64(plaintext);
println!("Plaintext:\t\t{:#018X}", plaintext);
println!("Ciphertext1:\t\t{:#018X}", ciphertext1);
println!("Ciphertext2:\t\t{:#018X}", ciphertext2);
assert_eq!(ciphertext1, 0x4FB6397B5352DB0C_u64);
assert_eq!(ciphertext2, 0x4FB6397B5352DB0C_u64);
assert_eq!(ciphertext1, ciphertext2);
let cipher_cipher_text1 = des1.encrypt_u64(ciphertext1);
let cipher_cipher_text2 = des2.encrypt_u64(ciphertext2);
println!("Cipher-ciphertext1:\t{:#018X}\n", cipher_cipher_text1);
println!("Cipher-ciphertext2:\t{:#018X}\n", cipher_cipher_text2);
assert_eq!(cipher_cipher_text1, 0x1234567890ABCDEF_u64);
assert_eq!(cipher_cipher_text2, 0x1234567890ABCDEF_u64);
assert_eq!(cipher_cipher_text1, plaintext);
assert_eq!(cipher_cipher_text2, plaintext);
println!();
let mut des1 = DES::new();
let mut des2 = DES::new();
des1.set_key([0x01, 0x1F, 0x01, 0x1F, 0x01, 0x0E, 0x01, 0x0E]);
des2.set_key([0x1F, 0x01, 0x1F, 0x01, 0x0E, 0x01, 0x0E, 0x01]);
let plaintext = 0x1234567890ABCDEF_u64;
let ciphertext = des1.encrypt_u64(plaintext);
println!("Plaintext:\t\t{:#018X}", plaintext);
println!("Ciphertext:\t\t{:#018X}", ciphertext);
assert_eq!(ciphertext, 0xC2C71D736E97876C_u64);
let cipher_cipher_text = des2.encrypt_u64(ciphertext);
println!("Cipher-ciphertext:\t{:#018X}\n", cipher_cipher_text);
assert_eq!(cipher_cipher_text, 0x1234567890ABCDEF_u64);
assert_eq!(cipher_cipher_text, plaintext);
let ciphertext = des2.encrypt_u64(plaintext);
println!("Plaintext:\t\t{:#018X}", plaintext);
println!("Ciphertext:\t\t{:#018X}", ciphertext);
assert_eq!(ciphertext, 0x063A6E55466423D2_u64);
let cipher_cipher_text = des1.encrypt_u64(ciphertext);
println!("Cipher-ciphertext:\t{:#018X}\n", cipher_cipher_text);
assert_eq!(cipher_cipher_text, 0x1234567890ABCDEF_u64);
assert_eq!(cipher_cipher_text, plaintext);
println!();
let mut des1 = DES::new();
let mut des2 = DES::new();
des1.set_key([0x01, 0xE0, 0x01, 0xE0, 0x01, 0xF1, 0x01, 0xF1]);
des2.set_key([0xE0, 0x01, 0xE0, 0x01, 0xF1, 0x01, 0xF1, 0x01]);
let plaintext = 0x1234567890ABCDEF_u64;
let ciphertext = des1.encrypt_u64(plaintext);
println!("Plaintext:\t\t{:#018X}", plaintext);
println!("Ciphertext:\t\t{:#018X}", ciphertext);
assert_eq!(ciphertext, 0x85A63690E79AAA15_u64);
let cipher_cipher_text = des2.encrypt_u64(ciphertext);
println!("Cipher-ciphertext:\t{:#018X}\n", cipher_cipher_text);
assert_eq!(cipher_cipher_text, 0x1234567890ABCDEF_u64);
assert_eq!(cipher_cipher_text, plaintext);
let ciphertext = des2.encrypt_u64(plaintext);
println!("Plaintext:\t\t{:#018X}", plaintext);
println!("Ciphertext:\t\t{:#018X}", ciphertext);
assert_eq!(ciphertext, 0x15B721BBB44A12F5_u64);
let cipher_cipher_text = des1.encrypt_u64(ciphertext);
println!("Cipher-ciphertext:\t{:#018X}\n", cipher_cipher_text);
assert_eq!(cipher_cipher_text, 0x1234567890ABCDEF_u64);
assert_eq!(cipher_cipher_text, plaintext);
println!();
let mut des1 = DES::new();
let mut des2 = DES::new();
des1.set_key([0x01, 0xFE, 0x01, 0xFE, 0x01, 0xFE, 0x01, 0xFE]);
des2.set_key([0xFE, 0x01, 0xFE, 0x01, 0xFE, 0x01, 0xFE, 0x01]);
let plaintext = 0x1234567890ABCDEF_u64;
let ciphertext = des1.encrypt_u64(plaintext);
println!("Plaintext:\t\t{:#018X}", plaintext);
println!("Ciphertext:\t\t{:#018X}", ciphertext);
assert_eq!(ciphertext, 0xAE38CC9D9FA48581_u64);
let cipher_cipher_text = des2.encrypt_u64(ciphertext);
println!("Cipher-ciphertext:\t{:#018X}\n", cipher_cipher_text);
assert_eq!(cipher_cipher_text, 0x1234567890ABCDEF_u64);
assert_eq!(cipher_cipher_text, plaintext);
let ciphertext = des2.encrypt_u64(plaintext);
println!("Plaintext:\t\t{:#018X}", plaintext);
println!("Ciphertext:\t\t{:#018X}", ciphertext);
assert_eq!(ciphertext, 0x7EE95658A653960D_u64);
let cipher_cipher_text = des1.encrypt_u64(ciphertext);
println!("Cipher-ciphertext:\t{:#018X}\n", cipher_cipher_text);
assert_eq!(cipher_cipher_text, 0x1234567890ABCDEF_u64);
assert_eq!(cipher_cipher_text, plaintext);
println!();
let mut des1 = DES::new();
let mut des2 = DES::new();
des1.set_key([0x1F, 0xE0, 0x1F, 0xE0, 0x0E, 0xF1, 0x0E, 0xF1]);
des2.set_key([0xE0, 0x1F, 0xE0, 0x1F, 0xF1, 0x0E, 0xF1, 0x0E]);
let plaintext = 0x1234567890ABCDEF_u64;
let ciphertext = des1.encrypt_u64(plaintext);
println!("Plaintext:\t\t{:#018X}", plaintext);
println!("Ciphertext:\t\t{:#018X}", ciphertext);
assert_eq!(ciphertext, 0x81ECC05B173F793E_u64);
let cipher_cipher_text = des2.encrypt_u64(ciphertext);
println!("Cipher-ciphertext:\t{:#018X}\n", cipher_cipher_text);
assert_eq!(cipher_cipher_text, 0x1234567890ABCDEF_u64);
assert_eq!(cipher_cipher_text, plaintext);
let ciphertext = des2.encrypt_u64(plaintext);
println!("Plaintext:\t\t{:#018X}", plaintext);
println!("Ciphertext:\t\t{:#018X}", ciphertext);
assert_eq!(ciphertext, 0x4D0AD4DC147E4BDF_u64);
let cipher_cipher_text = des1.encrypt_u64(ciphertext);
println!("Cipher-ciphertext:\t{:#018X}\n", cipher_cipher_text);
assert_eq!(cipher_cipher_text, 0x1234567890ABCDEF_u64);
assert_eq!(cipher_cipher_text, plaintext);
println!();
let mut des1 = DES::new();
let mut des2 = DES::new();
des1.set_key([0x1F, 0xFE, 0x1F, 0xFE, 0x0E, 0xFE, 0x0E, 0xFE]);
des2.set_key([0xFE, 0x1F, 0xFE, 0x1F, 0xFE, 0x0E, 0xFE, 0x0E]);
let plaintext = 0x1234567890ABCDEF_u64;
let ciphertext = des1.encrypt_u64(plaintext);
println!("Plaintext:\t\t{:#018X}", plaintext);
println!("Ciphertext:\t\t{:#018X}", ciphertext);
assert_eq!(ciphertext, 0x59735490F84A0AD0_u64);
let cipher_cipher_text = des2.encrypt_u64(ciphertext);
println!("Cipher-ciphertext:\t{:#018X}\n", cipher_cipher_text);
assert_eq!(cipher_cipher_text, 0x1234567890ABCDEF_u64);
assert_eq!(cipher_cipher_text, plaintext);
let ciphertext = des2.encrypt_u64(plaintext);
println!("Plaintext:\t\t{:#018X}", plaintext);
println!("Ciphertext:\t\t{:#018X}", ciphertext);
assert_eq!(ciphertext, 0x79FD3CBFE57F4B0B_u64);
let cipher_cipher_text = des1.encrypt_u64(ciphertext);
println!("Cipher-ciphertext:\t{:#018X}\n", cipher_cipher_text);
assert_eq!(cipher_cipher_text, 0x1234567890ABCDEF_u64);
assert_eq!(cipher_cipher_text, plaintext);
println!();
let mut des1 = DES::new();
let mut des2 = DES::new();
des1.set_key([0xE0, 0xFE, 0xE0, 0xFE, 0xF1, 0xFE, 0xF1, 0xFE]);
des2.set_key([0xFE, 0xE0, 0xFE, 0xE0, 0xFE, 0xF1, 0xFE, 0xF1]);
let plaintext = 0x1234567890ABCDEF_u64;
let ciphertext = des1.encrypt_u64(plaintext);
println!("Plaintext:\t\t{:#018X}", plaintext);
println!("Ciphertext:\t\t{:#018X}", ciphertext);
assert_eq!(ciphertext, 0x27C83AAE29571889_u64);
let cipher_cipher_text = des2.encrypt_u64(ciphertext);
println!("Cipher-ciphertext:\t{:#018X}\n", cipher_cipher_text);
assert_eq!(cipher_cipher_text, 0x1234567890ABCDEF_u64);
assert_eq!(cipher_cipher_text, plaintext);
let ciphertext = des2.encrypt_u64(plaintext);
println!("Plaintext:\t\t{:#018X}", plaintext);
println!("Ciphertext:\t\t{:#018X}", ciphertext);
assert_eq!(ciphertext, 0xDE76DF630C033919_u64);
let cipher_cipher_text = des1.encrypt_u64(ciphertext);
println!("Cipher-ciphertext:\t{:#018X}\n", cipher_cipher_text);
assert_eq!(cipher_cipher_text, 0x1234567890ABCDEF_u64);
assert_eq!(cipher_cipher_text, plaintext);
println!("-------------------------------");
}
fn des_set_key_u64()
{
println!("des_set_key_u64");
use cryptocol::symmetric::DES;
let mut des = DES::new();
des.set_key_u64(0xEFCDAB9078563412);
let plaintext = 0x1234567890ABCDEF_u64;
let ciphertext = des.encrypt_u64(plaintext);
println!("Plaintext:\t\t{:#018X}", plaintext);
println!("Ciphertext:\t\t{:#018X}", ciphertext);
assert_eq!(ciphertext, 0x3B6041D76AF28F23_u64);
let cipher_cipher_text = des.encrypt_u64(ciphertext);
println!("Cipher-ciphertext:\t{:#018X}\n", cipher_cipher_text);
assert_eq!(cipher_cipher_text, 0x7C5AAE491DC1310D_u64);
assert_ne!(cipher_cipher_text, plaintext);
println!();
let mut des1 = DES::new();
let mut des2 = DES::new();
des1.set_key_u64(0x0000000000000000);
des2.set_key_u64(0x0101010101010101);
let plaintext = 0x1234567890ABCDEF_u64;
let ciphertext1 = des1.encrypt_u64(plaintext);
let ciphertext2 = des2.encrypt_u64(plaintext);
println!("Plaintext:\t\t{:#018X}", plaintext);
println!("Ciphertext1:\t\t{:#018X}", ciphertext1);
println!("Ciphertext2:\t\t{:#018X}", ciphertext2);
assert_eq!(ciphertext1, 0x1E32B46B44C69201_u64);
assert_eq!(ciphertext2, 0x1E32B46B44C69201_u64);
assert_eq!(ciphertext1, ciphertext2);
let cipher_cipher_text1 = des1.encrypt_u64(ciphertext1);
let cipher_cipher_text2 = des2.encrypt_u64(ciphertext2);
println!("Cipher-ciphertext1:\t{:#018X}\n", cipher_cipher_text1);
println!("Cipher-ciphertext2:\t{:#018X}\n", cipher_cipher_text2);
assert_eq!(cipher_cipher_text1, 0x1234567890ABCDEF_u64);
assert_eq!(cipher_cipher_text2, 0x1234567890ABCDEF_u64);
assert_eq!(cipher_cipher_text1, plaintext);
assert_eq!(cipher_cipher_text2, plaintext);
println!();
let mut des1 = DES::new();
let mut des2 = DES::new();
des1.set_key_u64(0xFFFFFFFFFFFFFFFF);
des2.set_key_u64(0xFEFEFEFEFEFEFEFE);
let plaintext = 0x1234567890ABCDEF_u64;
let ciphertext1 = des1.encrypt_u64(plaintext);
let ciphertext2 = des2.encrypt_u64(plaintext);
println!("Plaintext:\t\t{:#018X}", plaintext);
println!("Ciphertext1:\t\t{:#018X}", ciphertext1);
println!("Ciphertext2:\t\t{:#018X}", ciphertext2);
assert_eq!(ciphertext1, 0xA5997AB38BC07250_u64);
assert_eq!(ciphertext2, 0xA5997AB38BC07250_u64);
assert_eq!(ciphertext1, ciphertext2);
let cipher_cipher_text1 = des1.encrypt_u64(ciphertext1);
let cipher_cipher_text2 = des2.encrypt_u64(ciphertext2);
println!("Cipher-ciphertext1:\t{:#018X}\n", cipher_cipher_text1);
println!("Cipher-ciphertext2:\t{:#018X}\n", cipher_cipher_text2);
assert_eq!(cipher_cipher_text1, 0x1234567890ABCDEF_u64);
assert_eq!(cipher_cipher_text2, 0x1234567890ABCDEF_u64);
assert_eq!(cipher_cipher_text1, plaintext);
assert_eq!(cipher_cipher_text2, plaintext);
println!();
let mut des1 = DES::new();
let mut des2 = DES::new();
des1.set_key_u64(0xF1F1F1F1E0E0E0E0);
des2.set_key_u64(0xF0F0F0F0E1E1E1E1);
let plaintext = 0x1234567890ABCDEF_u64;
let ciphertext1 = des1.encrypt_u64(plaintext);
let ciphertext2 = des2.encrypt_u64(plaintext);
println!("Plaintext:\t\t{:#018X}", plaintext);
println!("Ciphertext1:\t\t{:#018X}", ciphertext1);
println!("Ciphertext2:\t\t{:#018X}", ciphertext2);
assert_eq!(ciphertext1, 0x94CCA0201F033101_u64);
assert_eq!(ciphertext2, 0x94CCA0201F033101_u64);
assert_eq!(ciphertext1, ciphertext2);
let cipher_cipher_text1 = des1.encrypt_u64(ciphertext1);
let cipher_cipher_text2 = des2.encrypt_u64(ciphertext2);
println!("Cipher-ciphertext1:\t{:#018X}\n", cipher_cipher_text1);
println!("Cipher-ciphertext2:\t{:#018X}\n", cipher_cipher_text2);
assert_eq!(cipher_cipher_text1, 0x1234567890ABCDEF_u64);
assert_eq!(cipher_cipher_text2, 0x1234567890ABCDEF_u64);
assert_eq!(cipher_cipher_text1, plaintext);
assert_eq!(cipher_cipher_text2, plaintext);
println!();
let mut des1 = DES::new();
let mut des2 = DES::new();
des1.set_key_u64(0x0E0E0E0E1F1F1F1F);
des2.set_key_u64(0x0F0F0F0F1E1E1E1E);
let plaintext = 0x1234567890ABCDEF_u64;
let ciphertext1 = des1.encrypt_u64(plaintext);
let ciphertext2 = des2.encrypt_u64(plaintext);
println!("Plaintext:\t\t{:#018X}", plaintext);
println!("Ciphertext1:\t\t{:#018X}", ciphertext1);
println!("Ciphertext2:\t\t{:#018X}", ciphertext2);
assert_eq!(ciphertext1, 0x4FB6397B5352DB0C_u64);
assert_eq!(ciphertext2, 0x4FB6397B5352DB0C_u64);
assert_eq!(ciphertext1, ciphertext2);
let cipher_cipher_text1 = des1.encrypt_u64(ciphertext1);
let cipher_cipher_text2 = des2.encrypt_u64(ciphertext2);
println!("Cipher-ciphertext1:\t{:#018X}\n", cipher_cipher_text1);
println!("Cipher-ciphertext2:\t{:#018X}\n", cipher_cipher_text2);
assert_eq!(cipher_cipher_text1, 0x1234567890ABCDEF_u64);
assert_eq!(cipher_cipher_text2, 0x1234567890ABCDEF_u64);
assert_eq!(cipher_cipher_text1, plaintext);
assert_eq!(cipher_cipher_text2, plaintext);
println!();
let mut des1 = DES::new();
let mut des2 = DES::new();
des1.set_key_u64(0x0E010E011F011F01);
des2.set_key_u64(0x010E010E011F011F);
let plaintext = 0x1234567890ABCDEF_u64;
let ciphertext = des1.encrypt_u64(plaintext);
println!("Plaintext:\t\t{:#018X}", plaintext);
println!("Ciphertext:\t\t{:#018X}", ciphertext);
assert_eq!(ciphertext, 0xC2C71D736E97876C_u64);
let cipher_cipher_text = des2.encrypt_u64(ciphertext);
println!("Cipher-ciphertext:\t{:#018X}\n", cipher_cipher_text);
assert_eq!(cipher_cipher_text, 0x1234567890ABCDEF_u64);
assert_eq!(cipher_cipher_text, plaintext);
let ciphertext = des2.encrypt_u64(plaintext);
println!("Plaintext:\t\t{:#018X}", plaintext);
println!("Ciphertext:\t\t{:#018X}", ciphertext);
assert_eq!(ciphertext, 0x063A6E55466423D2_u64);
let cipher_cipher_text = des1.encrypt_u64(ciphertext);
println!("Cipher-ciphertext:\t{:#018X}\n", cipher_cipher_text);
assert_eq!(cipher_cipher_text, 0x1234567890ABCDEF_u64);
assert_eq!(cipher_cipher_text, plaintext);
println!();
let mut des1 = DES::new();
let mut des2 = DES::new();
des1.set_key_u64(0xF101F101E001E001);
des2.set_key_u64(0x01F101F101E001E0);
let plaintext = 0x1234567890ABCDEF_u64;
let ciphertext = des1.encrypt_u64(plaintext);
println!("Plaintext:\t\t{:#018X}", plaintext);
println!("Ciphertext:\t\t{:#018X}", ciphertext);
assert_eq!(ciphertext, 0x85A63690E79AAA15_u64);
let cipher_cipher_text = des2.encrypt_u64(ciphertext);
println!("Cipher-ciphertext:\t{:#018X}\n", cipher_cipher_text);
assert_eq!(cipher_cipher_text, 0x1234567890ABCDEF_u64);
assert_eq!(cipher_cipher_text, plaintext);
let ciphertext = des2.encrypt_u64(plaintext);
println!("Plaintext:\t\t{:#018X}", plaintext);
println!("Ciphertext:\t\t{:#018X}", ciphertext);
assert_eq!(ciphertext, 0x15B721BBB44A12F5_u64);
let cipher_cipher_text = des1.encrypt_u64(ciphertext);
println!("Cipher-ciphertext:\t{:#018X}\n", cipher_cipher_text);
assert_eq!(cipher_cipher_text, 0x1234567890ABCDEF_u64);
assert_eq!(cipher_cipher_text, plaintext);
println!();
let mut des1 = DES::new();
let mut des2 = DES::new();
des1.set_key_u64(0xFE01FE01FE01FE01);
des2.set_key_u64(0x01FE01FE01FE01FE);
let plaintext = 0x1234567890ABCDEF_u64;
let ciphertext = des1.encrypt_u64(plaintext);
println!("Plaintext:\t\t{:#018X}", plaintext);
println!("Ciphertext:\t\t{:#018X}", ciphertext);
assert_eq!(ciphertext, 0xAE38CC9D9FA48581_u64);
let cipher_cipher_text = des2.encrypt_u64(ciphertext);
println!("Cipher-ciphertext:\t{:#018X}\n", cipher_cipher_text);
assert_eq!(cipher_cipher_text, 0x1234567890ABCDEF_u64);
assert_eq!(cipher_cipher_text, plaintext);
let ciphertext = des2.encrypt_u64(plaintext);
println!("Plaintext:\t\t{:#018X}", plaintext);
println!("Ciphertext:\t\t{:#018X}", ciphertext);
assert_eq!(ciphertext, 0x7EE95658A653960D_u64);
let cipher_cipher_text = des1.encrypt_u64(ciphertext);
println!("Cipher-ciphertext:\t{:#018X}\n", cipher_cipher_text);
assert_eq!(cipher_cipher_text, 0x1234567890ABCDEF_u64);
assert_eq!(cipher_cipher_text, plaintext);
println!();
let mut des1 = DES::new();
let mut des2 = DES::new();
des1.set_key_u64(0xF10EF10EE01FE01F);
des2.set_key_u64(0x0EF10EF11FE01FE0);
let plaintext = 0x1234567890ABCDEF_u64;
let ciphertext = des1.encrypt_u64(plaintext);
println!("Plaintext:\t\t{:#018X}", plaintext);
println!("Ciphertext:\t\t{:#018X}", ciphertext);
assert_eq!(ciphertext, 0x81ECC05B173F793E_u64);
let cipher_cipher_text = des2.encrypt_u64(ciphertext);
println!("Cipher-ciphertext:\t{:#018X}\n", cipher_cipher_text);
assert_eq!(cipher_cipher_text, 0x1234567890ABCDEF_u64);
assert_eq!(cipher_cipher_text, plaintext);
let ciphertext = des2.encrypt_u64(plaintext);
println!("Plaintext:\t\t{:#018X}", plaintext);
println!("Ciphertext:\t\t{:#018X}", ciphertext);
assert_eq!(ciphertext, 0x4D0AD4DC147E4BDF_u64);
let cipher_cipher_text = des1.encrypt_u64(ciphertext);
println!("Cipher-ciphertext:\t{:#018X}\n", cipher_cipher_text);
assert_eq!(cipher_cipher_text, 0x1234567890ABCDEF_u64);
assert_eq!(cipher_cipher_text, plaintext);
println!();
let mut des1 = DES::new();
let mut des2 = DES::new();
des1.set_key_u64(0xFE0EFE0EFE1FFE1F);
des2.set_key_u64(0x0EFE0EFE1FFE1FFE);
let plaintext = 0x1234567890ABCDEF_u64;
let ciphertext = des1.encrypt_u64(plaintext);
println!("Plaintext:\t\t{:#018X}", plaintext);
println!("Ciphertext:\t\t{:#018X}", ciphertext);
assert_eq!(ciphertext, 0x59735490F84A0AD0_u64);
let cipher_cipher_text = des2.encrypt_u64(ciphertext);
println!("Cipher-ciphertext:\t{:#018X}\n", cipher_cipher_text);
assert_eq!(cipher_cipher_text, 0x1234567890ABCDEF_u64);
assert_eq!(cipher_cipher_text, plaintext);
let ciphertext = des2.encrypt_u64(plaintext);
println!("Plaintext:\t\t{:#018X}", plaintext);
println!("Ciphertext:\t\t{:#018X}", ciphertext);
assert_eq!(ciphertext, 0x79FD3CBFE57F4B0B_u64);
let cipher_cipher_text = des1.encrypt_u64(ciphertext);
println!("Cipher-ciphertext:\t{:#018X}\n", cipher_cipher_text);
assert_eq!(cipher_cipher_text, 0x1234567890ABCDEF_u64);
assert_eq!(cipher_cipher_text, plaintext);
println!();
let mut des1 = DES::new();
let mut des2 = DES::new();
des1.set_key_u64(0xFEF1FEF1FEE0FEE0);
des2.set_key_u64(0xF1FEF1FEE0FEE0FE);
let plaintext = 0x1234567890ABCDEF_u64;
let ciphertext = des1.encrypt_u64(plaintext);
println!("Plaintext:\t\t{:#018X}", plaintext);
println!("Ciphertext:\t\t{:#018X}", ciphertext);
assert_eq!(ciphertext, 0x27C83AAE29571889_u64);
let cipher_cipher_text = des2.encrypt_u64(ciphertext);
println!("Cipher-ciphertext:\t{:#018X}\n", cipher_cipher_text);
assert_eq!(cipher_cipher_text, 0x1234567890ABCDEF_u64);
assert_eq!(cipher_cipher_text, plaintext);
let ciphertext = des2.encrypt_u64(plaintext);
println!("Plaintext:\t\t{:#018X}", plaintext);
println!("Ciphertext:\t\t{:#018X}", ciphertext);
assert_eq!(ciphertext, 0xDE76DF630C033919_u64);
let cipher_cipher_text = des1.encrypt_u64(ciphertext);
println!("Cipher-ciphertext:\t{:#018X}\n", cipher_cipher_text);
assert_eq!(cipher_cipher_text, 0x1234567890ABCDEF_u64);
assert_eq!(cipher_cipher_text, plaintext);
println!("-------------------------------");
}
fn des_turn_inverse()
{
println!("des_turn_inverse");
use cryptocol::symmetric::{ BigCryptor64, DES, SmallCryptor };
let mut keys: [Box<dyn SmallCryptor<u64, 8>>; 3]
= [ Box::new(DES::new_with_key_u64(0x_1234567890ABCDEF_u64)),
Box::new(DES::new_with_key_u64(0x_FEDCBA0987654321_u64)),
Box::new(DES::new_with_key_u64(0x_1234567890ABCDEF_u64)) ];
keys[1].turn_inverse();
let mut tdes = BigCryptor64::new_with_small_cryptor_array(keys);
let plaintext = 0x_1234567890ABCDEF_u64;
let ciphertext = tdes.encrypt_u64(plaintext);
println!("Plaintext:\t\t{:#018X}", plaintext);
println!("Ciphertext:\t\t{:#018X}", ciphertext);
assert_eq!(ciphertext, 0x_272A2AC7B4E66748_u64);
let cipher_cipher_text = tdes.decrypt_u64(ciphertext);
println!("Cipher-ciphertext:\t{:#018X}", cipher_cipher_text);
assert_eq!(cipher_cipher_text, 0x1234567890ABCDEF_u64);
assert_eq!(cipher_cipher_text, plaintext);
println!();
let des1 = DES::new_with_key_u64(0x_1234567890ABCDEF_u64);
let mut des2 = DES::new_with_key_u64(0x_FEDCBA0987654321_u64);
let des3 = DES::new_with_key_u64(0x_1234567890ABCDEF_u64);
des2.turn_inverse();
let mut tdes = BigCryptor64::new() + des1 + des2 + des3;
let plaintext = 0x_1234567890ABCDEF_u64;
let ciphertext = tdes.encrypt_u64(plaintext);
println!("Plaintext:\t\t{:#018X}", plaintext);
println!("Ciphertext:\t\t{:#018X}", ciphertext);
assert_eq!(ciphertext, 0x_272A2AC7B4E66748_u64);
let cipher_cipher_text = tdes.decrypt_u64(ciphertext);
println!("Cipher-ciphertext:\t{:#018X}", cipher_cipher_text);
assert_eq!(cipher_cipher_text, 0x_1234567890ABCDEF_u64);
assert_eq!(cipher_cipher_text, plaintext);
println!("-------------------------------");
}
fn des_turn_encryptor()
{
println!("des_turn_encryptor");
use cryptocol::symmetric::{ BigCryptor64, DES, SmallCryptor };
let mut keys: [Box<dyn SmallCryptor<u64, 8>>; 3]
= [ Box::new(DES::new_with_key_u64(0x_1234567890ABCDEF_u64)),
Box::new(DES::new_with_key_u64(0x_FEDCBA0987654321_u64)),
Box::new(DES::new_with_key_u64(0x_1234567890ABCDEF_u64)) ];
keys[0].turn_encryptor();
let mut tdes = BigCryptor64::new_with_small_cryptor_array(keys);
let plaintext = 0x_1234567890ABCDEF_u64;
let ciphertext = tdes.encrypt_u64(plaintext);
println!("Plaintext:\t\t{:#018X}", plaintext);
println!("Ciphertext:\t\t{:#018X}", ciphertext);
assert_eq!(ciphertext, 0x_CDAC175F3B7EAA2B_u64);
let cipher_cipher_text = tdes.decrypt_u64(ciphertext);
println!("Cipher-ciphertext:\t{:#018X}", cipher_cipher_text);
assert_eq!(cipher_cipher_text, 0x1234567890ABCDEF_u64);
assert_eq!(cipher_cipher_text, plaintext);
println!();
let mut des1 = DES::new_with_key_u64(0x_1234567890ABCDEF_u64);
let des2 = DES::new_with_key_u64(0x_FEDCBA0987654321_u64);
let des3 = DES::new_with_key_u64(0x_1234567890ABCDEF_u64);
des1.turn_encryptor();
let mut tdes = BigCryptor64::new() + des1 + des2 + des3;
let plaintext = 0x_1234567890ABCDEF_u64;
let ciphertext = tdes.encrypt_u64(plaintext);
println!("Plaintext:\t\t{:#018X}", plaintext);
println!("Ciphertext:\t\t{:#018X}", ciphertext);
assert_eq!(ciphertext, 0x_CDAC175F3B7EAA2B_u64);
let cipher_cipher_text = tdes.decrypt_u64(ciphertext);
println!("Cipher-ciphertext:\t{:#018X}", cipher_cipher_text);
assert_eq!(cipher_cipher_text, 0x_1234567890ABCDEF_u64);
assert_eq!(cipher_cipher_text, plaintext);
println!("-------------------------------");
}
fn des_turn_decryptor()
{
println!("des_turn_decryptor");
use cryptocol::symmetric::{ BigCryptor64, DES, SmallCryptor };
let mut keys: [Box<dyn SmallCryptor<u64, 8>>; 3]
= [ Box::new(DES::new_with_key_u64(0x_1234567890ABCDEF_u64)),
Box::new(DES::new_with_key_u64(0x_FEDCBA0987654321_u64)),
Box::new(DES::new_with_key_u64(0x_1234567890ABCDEF_u64)) ];
keys[1].turn_decryptor();
let mut tdes = BigCryptor64::new_with_small_cryptor_array(keys);
let plaintext = 0x_1234567890ABCDEF_u64;
let ciphertext = tdes.encrypt_u64(plaintext);
println!("Plaintext:\t\t{:#018X}", plaintext);
println!("Ciphertext:\t\t{:#018X}", ciphertext);
assert_eq!(ciphertext, 0x_272A2AC7B4E66748_u64);
let cipher_cipher_text = tdes.decrypt_u64(ciphertext);
println!("Cipher-ciphertext:\t{:#018X}", cipher_cipher_text);
assert_eq!(cipher_cipher_text, 0x1234567890ABCDEF_u64);
assert_eq!(cipher_cipher_text, plaintext);
println!();
let des1 = DES::new_with_key_u64(0x_1234567890ABCDEF_u64);
let mut des2 = DES::new_with_key_u64(0x_FEDCBA0987654321_u64);
let des3 = DES::new_with_key_u64(0x_1234567890ABCDEF_u64);
des2.turn_decryptor();
let mut tdes = BigCryptor64::new() + des1 + des2 + des3;
let plaintext = 0x_1234567890ABCDEF_u64;
let ciphertext = tdes.encrypt_u64(plaintext);
println!("Plaintext:\t\t{:#018X}", plaintext);
println!("Ciphertext:\t\t{:#018X}", ciphertext);
assert_eq!(ciphertext, 0x_272A2AC7B4E66748_u64);
let cipher_cipher_text = tdes.decrypt_u64(ciphertext);
println!("Cipher-ciphertext:\t{:#018X}", cipher_cipher_text);
assert_eq!(cipher_cipher_text, 0x_1234567890ABCDEF_u64);
assert_eq!(cipher_cipher_text, plaintext);
println!("-------------------------------");
}
fn des_encrypt_decrypt_u64_array_u64_main()
{
des_encrypt_u64();
des_decrypt_u64();
des_encrypt_array_u64();
des_decrypt_array_u64();
des_is_successful();
des_is_failed();
des_has_weak_key();
}
fn des_encrypt_u64()
{
println!("des_encrypt_u64");
use cryptocol::symmetric::{ DES, DES_Expanded };
let key = 0x_1234567890ABCDEF_u64;
println!("K =\t{:#018X}", key);
let message = 0x_1234567890ABCDEF_u64;
println!("M_u64 =\t{:#018X}", message);
let mut a_des = DES::new_with_key_u64(key);
let cipher = a_des.encrypt_u64(message);
println!("C_u64 (16 rounds) =\t{:#018X}", cipher);
assert_eq!(cipher, 0x_1BC4896735BBE206_u64);
println!();
let key = 0x_1234567890ABCDEF_u64;
println!("K =\t{:#018X}", key);
let message = 0x_1234567890ABCDEF_u64;
println!("M_u64 =\t{:#018X}", message);
let mut b_des = DES_Expanded::<128, 0x_8103_8103_8103_8103_8103_8103_8103_8103_u128>::new_with_key_u64(key);
let cipher = b_des.encrypt_u64(message);
println!("C_u64 (128 rounds) =\t{:#018X}", cipher);
assert_eq!(cipher, 0x_21F25F81CE4D4AA3_u64);
println!();
let key1 = 0x_1234567890ABCDEF_u64;
let key2 = 0_u64;
let mut c_des = DES_Expanded::<0, 0>::new_with_key_u64(key1);
let mut d_des = DES_Expanded::<0, 0>::new_with_key_u64(key2);
println!("K1 =\t{:#016x}", key1);
let message = 0x_1234567890ABCDEF_u64;
println!("M_u64 =\t{:#018X}", message);
let cipher1 = c_des.encrypt_u64(message);
let cipher2 = d_des.encrypt_u64(message);
println!("C_u64 (0 rounds) =\t{:#018X}", cipher1);
assert_eq!(cipher1, 0x_2138A9B46057CEDF_u64);
println!("D_u64 (0 rounds) =\t{:#018X}", cipher);
assert_eq!(cipher2, 0x_2138A9B46057CEDF_u64);
assert_eq!(cipher1, cipher2);
println!("-------------------------------");
}
fn des_decrypt_u64()
{
println!("des_decrypt_u64");
use cryptocol::symmetric::{ DES, DES_Expanded };
let key = 0x_1234567890ABCDEF_u64;
println!("K =\t{:#018X}", key);
let message = 0x_1234567890ABCDEF_u64;
println!("M_u64 =\t{:#018X}", message);
let mut a_des = DES::new_with_key_u64(key);
let cipher = a_des.encrypt_u64(message);
println!("C_u64 (16 rounds) =\t{:#018X}", cipher);
assert_eq!(cipher, 0x_1BC4896735BBE206_u64);
let recovered = a_des.decrypt_u64(cipher);
println!("B_u64 (16 rounds) =\t{:#018X}", recovered);
assert_eq!(recovered, 0x_1234567890ABCDEF_u64);
assert_eq!(recovered, message);
println!();
let key = 0x_1234567890ABCDEF_u64;
println!("K =\t{:#018X}", key);
let message = 0x_1234567890ABCDEF_u64;
println!("M_u64 =\t{:#018X}", message);
let mut b_des = DES_Expanded::<128, 0x_8103_8103_8103_8103_8103_8103_8103_8103_u128>::new_with_key_u64(key);
let cipher = b_des.encrypt_u64(message);
println!("C_u64 (128 rounds) =\t{:#018X}", cipher);
assert_eq!(cipher, 0x_21F25F81CE4D4AA3_u64);
let recovered = b_des.decrypt_u64(cipher);
println!("B_u64 (16 rounds) =\t{:#018X}", recovered);
assert_eq!(recovered, 0x_1234567890ABCDEF_u64);
assert_eq!(recovered, message);
println!();
let key1 = 0x_1234567890ABCDEF_u64;
let key2 = 0_u64;
let mut c_des = DES_Expanded::<0, 0>::new_with_key_u64(key1);
let mut d_des = DES_Expanded::<0, 0>::new_with_key_u64(key2);
println!("K =\t{:#018X}", key);
let message = 0x_1234567890ABCDEF_u64;
println!("M_u64 =\t{:#018X}", message);
let cipher1 = c_des.encrypt_u64(message);
let cipher2 = d_des.encrypt_u64(message);
println!("C_u64 (0 rounds) =\t{:#018X}", cipher1);
assert_eq!(cipher1, 0x_2138A9B46057CEDF_u64);
println!("D_u64 (0 rounds) =\t{:#018X}", cipher);
assert_eq!(cipher2, 0x_2138A9B46057CEDF_u64);
assert_eq!(cipher1, cipher2);
let recovered1 = c_des.decrypt_u64(cipher1);
let recovered2 = d_des.decrypt_u64(cipher2);
println!("B1_u64 (0 rounds) =\t{:#018X}", recovered1);
println!("B2_u64 (0 rounds) =\t{:#018X}", recovered2);
assert_eq!(recovered1, 0x_1234567890ABCDEF_u64);
assert_eq!(recovered1, message);
assert_eq!(recovered2, 0x_1234567890ABCDEF_u64);
assert_eq!(recovered2, message);
assert_eq!(recovered1, recovered2);
println!("-------------------------------");
}
fn des_encrypt_array_u64()
{
println!("des_encrypt_array_u64");
use cryptocol::symmetric::{ DES, DES_Expanded };
let key = 0x_1234567890ABCDEF_u64;
println!("K =\t{:#018X}", key);
let message = [0x_1234567890ABCDEF_u64, 0xEFCDAB9078563412, 0xFEDCBA0987654321 ];
print!("M =\t");
for m in message
{ print!("{:#018X} ", m); }
println!();
let mut a_des = DES::new_with_key_u64(key);
let mut cipher = [0; 3];
a_des.encrypt_array_u64(&message, &mut cipher);
print!("C (16 rounds) =\t");
for c in cipher
{ print!("{:#018X} ", c); }
println!();
assert_eq!(cipher[0], 0x_1BC4896735BBE206_u64);
assert_eq!(cipher[1], 0x_1D8A61E5E62226A4_u64);
assert_eq!(cipher[2], 0x_2990D69525C17067_u64);
println!();
let key = 0x_1234567890ABCDEF_u64;
println!("K =\t{:#018X}", key);
let message = [0x_1234567890ABCDEF_u64, 0xEFCDAB9078563412, 0xFEDCBA0987654321 ];
print!("M =\t");
for m in message
{ print!("{:#018X} ", m); }
println!();
let mut b_des = DES_Expanded::<128, 0x_8103_8103_8103_8103_8103_8103_8103_8103_u128>::new_with_key_u64(key);
let mut cipher = [0; 3];
b_des.encrypt_array_u64(&message, &mut cipher);
print!("C (128 rounds) =\t");
for c in cipher
{ print!("{:#018X} ", c); }
println!();
assert_eq!(cipher[0], 0x_21F25F81CE4D4AA3_u64);
assert_eq!(cipher[1], 0x_352F391A1482A504_u64);
assert_eq!(cipher[2], 0x_F793546957AFDE50_u64);
println!();
let key1 = 0x_1234567890ABCDEF_u64;
let key2 = 0_u64;
let mut c_des = DES_Expanded::<0, 0>::new_with_key_u64(key1);
let mut d_des = DES_Expanded::<0, 0>::new_with_key_u64(key2);
println!("K =\t{:#018X}", key);
let message = [0x_1234567890ABCDEF_u64, 0xEFCDAB9078563412, 0xFEDCBA0987654321 ];
print!("M =\t");
for m in message
{ print!("{:#018X} ", m); }
println!();
let mut cipher1 = [0; 3];
let mut cipher2 = [0; 3];
c_des.encrypt_array_u64(&message, &mut cipher1);
d_des.encrypt_array_u64(&message, &mut cipher2);
print!("C (0 rounds) =\t");
for c in cipher1
{ print!("{:#018X} ", c); }
println!();
print!("D (0 rounds) =\t");
for c in cipher2
{ print!("{:#018X} ", c); }
println!();
assert_eq!(cipher1[0], 0x_2138A9B46057CEDF_u64);
assert_eq!(cipher1[1], 0x_DFCE5760B4A93821_u64);
assert_eq!(cipher1[2], 0x_FDEC75064B9A8312_u64);
assert_eq!(cipher2[0], 0x_2138A9B46057CEDF_u64);
assert_eq!(cipher2[1], 0x_DFCE5760B4A93821_u64);
assert_eq!(cipher2[2], 0x_FDEC75064B9A8312_u64);
assert_eq!(cipher1[0], cipher2[0]);
assert_eq!(cipher1[1], cipher2[1]);
assert_eq!(cipher1[2], cipher2[2]);
println!("-------------------------------");
}
fn des_decrypt_array_u64()
{
println!("des_decrypt_array_u64");
use cryptocol::symmetric::{ DES, DES_Expanded };
let key = 0x_1234567890ABCDEF_u64;
println!("K =\t{:#018X}", key);
let message = [0x_1234567890ABCDEF_u64, 0xEFCDAB9078563412, 0xFEDCBA0987654321 ];
print!("M =\t");
for m in message
{ print!("{:#018X} ", m); }
println!();
let mut a_des = DES::new_with_key_u64(key);
let mut cipher = [0; 3];
a_des.encrypt_array_u64(&message, &mut cipher);
print!("C (16 rounds) =\t");
for c in cipher
{ print!("{:#018X} ", c); }
println!();
assert_eq!(cipher[0], 0x_1BC4896735BBE206_u64);
assert_eq!(cipher[1], 0x_1D8A61E5E62226A4_u64);
assert_eq!(cipher[2], 0x_2990D69525C17067_u64);
let mut recovered = [0; 3];
a_des.decrypt_array_u64(&cipher, &mut recovered);
print!("B (16 rounds) =\t");
for r in recovered
{ print!("{:#018X} ", r); }
println!();
assert_eq!(recovered[0], 0x_1234567890ABCDEF_u64);
assert_eq!(recovered[1], 0x_EFCDAB9078563412_u64);
assert_eq!(recovered[2], 0x_FEDCBA0987654321_u64);
println!();
let key = 0x_1234567890ABCDEF_u64;
println!("K =\t{:#018X}", key);
let message = [0x_1234567890ABCDEF_u64, 0xEFCDAB9078563412, 0xFEDCBA0987654321 ];
print!("M =\t");
for m in message
{ print!("{:#018X} ", m); }
println!();
let mut b_des = DES_Expanded::<128, 0x_8103_8103_8103_8103_8103_8103_8103_8103_u128>::new_with_key_u64(key);
let mut cipher = [0; 3];
b_des.encrypt_array_u64(&message, &mut cipher);
print!("C (128 rounds) =\t");
for c in cipher
{ print!("{:#018X} ", c); }
println!();
assert_eq!(cipher[0], 0x_21F25F81CE4D4AA3_u64);
assert_eq!(cipher[1], 0x_352F391A1482A504_u64);
assert_eq!(cipher[2], 0x_F793546957AFDE50_u64);
let mut recovered = [0; 3];
b_des.decrypt_array_u64(&cipher, &mut recovered);
print!("B (128 rounds) =\t");
for r in recovered
{ print!("{:#018X} ", r); }
println!();
assert_eq!(recovered[0], 0x_1234567890ABCDEF_u64);
assert_eq!(recovered[1], 0x_EFCDAB9078563412_u64);
assert_eq!(recovered[2], 0x_FEDCBA0987654321_u64);
let key1 = 0x_1234567890ABCDEF_u64;
let key2 = 0_u64;
let mut c_des = DES_Expanded::<0, 0>::new_with_key_u64(key1);
let mut d_des = DES_Expanded::<0, 0>::new_with_key_u64(key2);
println!("K =\t{:#018X}", key);
let message = [0x_1234567890ABCDEF_u64, 0xEFCDAB9078563412, 0xFEDCBA0987654321 ];
print!("M =\t");
for m in message
{ print!("{:#018X} ", m); }
println!();
let mut cipher1 = [0; 3];
let mut cipher2 = [0; 3];
c_des.encrypt_array_u64(&message, &mut cipher1);
d_des.encrypt_array_u64(&message, &mut cipher2);
print!("C (0 rounds) =\t");
for c in cipher1
{ print!("{:#018X} ", c); }
println!();
print!("D (0 rounds) =\t");
for c in cipher2
{ print!("{:#018X} ", c); }
println!();
assert_eq!(cipher1[0], 0x_2138A9B46057CEDF_u64);
assert_eq!(cipher1[1], 0x_DFCE5760B4A93821_u64);
assert_eq!(cipher1[2], 0x_FDEC75064B9A8312_u64);
assert_eq!(cipher2[0], 0x_2138A9B46057CEDF_u64);
assert_eq!(cipher2[1], 0x_DFCE5760B4A93821_u64);
assert_eq!(cipher2[2], 0x_FDEC75064B9A8312_u64);
assert_eq!(cipher1[0], cipher2[0]);
assert_eq!(cipher1[1], cipher2[1]);
assert_eq!(cipher1[2], cipher2[2]);
let mut recovered1 = [0; 3];
let mut recovered2 = [0; 3];
c_des.decrypt_array_u64(&cipher1, &mut recovered1);
d_des.decrypt_array_u64(&cipher2, &mut recovered2);
print!("B1 (0 rounds) =\t");
for r in recovered1
{ print!("{:#018X} ", r); }
println!();
print!("B2 (0 rounds) =\t");
for r in recovered2
{ print!("{:#018X} ", r); }
println!();
assert_eq!(recovered1[0], 0x_1234567890ABCDEF_u64);
assert_eq!(recovered1[1], 0x_EFCDAB9078563412_u64);
assert_eq!(recovered1[2], 0x_FEDCBA0987654321_u64);
assert_eq!(recovered2[0], 0x_1234567890ABCDEF_u64);
assert_eq!(recovered2[1], 0x_EFCDAB9078563412_u64);
assert_eq!(recovered2[2], 0x_FEDCBA0987654321_u64);
assert_eq!(recovered1[0], recovered2[0]);
assert_eq!(recovered1[1], recovered2[1]);
assert_eq!(recovered1[2], recovered2[2]);
println!("-------------------------------");
}
fn des_is_successful()
{
println!("des_is_successful");
use std::io::Write;
use std::fmt::Write as _;
use cryptocol::symmetric::DES;
{
use cryptocol::symmetric::ECB_PKCS7;
let key = 0x_1234567890ABCDEF_u64;
println!("K =\t{:#018X}", key);
let mut a_des = DES::new_with_key_u64(key);
let message = "";
println!("M =\t{}", message);
let mut cipher = [0_u8; 8];
let len = a_des.encrypt_into_array(message.as_ptr(), message.len() as u64, &mut cipher);
println!("The length of ciphertext = {}", len);
assert_eq!(len, 8);
let success = a_des.is_successful();
assert_eq!(success, true);
print!("C =\t");
for c in cipher.clone()
{ print!("{:02X} ", c); }
println!();
let mut txt = String::new();
for c in cipher.clone()
{ write!(txt, "{:02X} ", c); }
assert_eq!(txt, "41 7F 89 79 08 CD A1 4C ");
println!();
let key = 0x_1234567890ABCDEF_u64;
println!("K =\t{:#018X}", key);
let mut a_des = DES::new_with_key_u64(key);
let cipher = [0x41u8, 0x7F, 0x89, 0x79, 0x08, 0xCD, 0xA1, 0x4C];
print!("C =\t");
for c in cipher.clone()
{ print!("{:02X} ", c); }
println!();
let mut recovered = [0u8; 8];
let len = a_des.decrypt_array_into_array(&cipher, &mut recovered);
println!("The length of plaintext = {}", len);
assert_eq!(len, 0);
let success = a_des.is_successful();
assert_eq!(success, true);
print!("Ba =\t");
for b in recovered.clone()
{ print!("{:02X} ", b); }
println!();
let mut txt = String::new();
for c in recovered.clone()
{ write!(txt, "{:02X} ", c); }
assert_eq!(txt, "00 00 00 00 00 00 00 00 ");
let mut converted = String::new();
unsafe { converted.as_mut_vec() }.write(&recovered);
unsafe { converted.as_mut_vec() }.truncate(len as usize);
println!("Bb =\t{}", converted);
assert_eq!(converted, "");
assert_eq!(converted, message);
println!();
}
{
use cryptocol::symmetric::CBC_ISO;
let iv = 0x_FEDCBA0987654321_u64;
println!("IV = {}", iv);
let key = 0x_1234567890ABCDEF_u64;
println!("K =\t{:#018X}", key);
let mut a_des = DES::new_with_key_u64(key);
let message = "";
println!("M =\t{}", message);
let mut cipher = [0_u8; 4];
let len = a_des.encrypt_into_array(iv, message.as_ptr(), message.len() as u64, &mut cipher);
println!("The length of ciphertext = {}", len);
assert_eq!(len, 0);
let success = a_des.is_successful();
assert_eq!(success, false);
print!("C =\t");
for c in cipher.clone()
{ print!("{:02X} ", c); }
println!();
let mut txt = String::new();
for c in cipher.clone()
{ write!(txt, "{:02X} ", c); }
assert_eq!(txt, "00 00 00 00 ");
println!();
let iv = 0x_FEDCBA0987654321_u64;
println!("IV = {}", iv);
let key = 0x_1234567890ABCDEF_u64;
println!("K =\t{:#018X}", key);
let mut a_des = DES::new_with_key_u64(key);
let cipher = [0u8; 4];
print!("C =\t");
for c in cipher.clone()
{ print!("{:02X} ", c); }
println!();
let mut recovered = [0u8; 8];
let len = a_des.decrypt_array_into_array(iv, &cipher, &mut recovered);
println!("The length of plaintext = {}", len);
assert_eq!(len, 0);
let success = a_des.is_successful();
assert_eq!(success, false);
}
println!("-------------------------------");
}
fn des_is_failed()
{
println!("des_is_failed");
use std::io::Write;
use std::fmt::Write as _;
use cryptocol::symmetric::DES;
{
use cryptocol::symmetric::ECB_PKCS7;
let key = 0x_1234567890ABCDEF_u64;
println!("K =\t{:#018X}", key);
let mut a_des = DES::new_with_key_u64(key);
let message = "";
println!("M =\t{}", message);
let mut cipher = [0_u8; 8];
let len = a_des.encrypt_into_array(message.as_ptr(), message.len() as u64, &mut cipher);
println!("The length of ciphertext = {}", len);
assert_eq!(len, 8);
let failure = a_des.is_failed();
assert_eq!(failure, false);
print!("C =\t");
for c in cipher.clone()
{ print!("{:02X} ", c); }
println!();
let mut txt = String::new();
for c in cipher.clone()
{ write!(txt, "{:02X} ", c); }
assert_eq!(txt, "41 7F 89 79 08 CD A1 4C ");
println!();
let key = 0x_1234567890ABCDEF_u64;
println!("K =\t{:#018X}", key);
let mut a_des = DES::new_with_key_u64(key);
let cipher = [0x41u8, 0x7F, 0x89, 0x79, 0x08, 0xCD, 0xA1, 0x4C];
print!("C =\t");
for c in cipher.clone()
{ print!("{:02X} ", c); }
println!();
let mut recovered = [0u8; 8];
let len = a_des.decrypt_array_into_array(&cipher, &mut recovered);
println!("The length of plaintext = {}", len);
assert_eq!(len, 0);
let failure = a_des.is_failed();
assert_eq!(failure, false);
print!("Ba =\t");
for b in recovered.clone()
{ print!("{:02X} ", b); }
println!();
let mut txt = String::new();
for c in recovered.clone()
{ write!(txt, "{:02X} ", c); }
assert_eq!(txt, "00 00 00 00 00 00 00 00 ");
let mut converted = String::new();
unsafe { converted.as_mut_vec() }.write(&recovered);
unsafe { converted.as_mut_vec() }.truncate(len as usize);
println!("Bb =\t{}", converted);
assert_eq!(converted, "");
assert_eq!(converted, message);
println!();
}
{
use cryptocol::symmetric::CBC_ISO;
let iv = 0x_FEDCBA0987654321_u64;
println!("IV = {}", iv);
let key = 0x_1234567890ABCDEF_u64;
println!("K =\t{:#018X}", key);
let mut a_des = DES::new_with_key_u64(key);
let message = "";
println!("M =\t{}", message);
let mut cipher = [0_u8; 4];
let len = a_des.encrypt_into_array(iv, message.as_ptr(), message.len() as u64, &mut cipher);
println!("The length of ciphertext = {}", len);
assert_eq!(len, 0);
let failure = a_des.is_failed();
assert_eq!(failure, true);
print!("C =\t");
for c in cipher.clone()
{ print!("{:02X} ", c); }
println!();
let mut txt = String::new();
for c in cipher.clone()
{ write!(txt, "{:02X} ", c); }
assert_eq!(txt, "00 00 00 00 ");
println!();
let iv = 0x_FEDCBA0987654321_u64;
println!("IV = {}", iv);
let key = 0x_1234567890ABCDEF_u64;
println!("K =\t{:#018X}", key);
let mut a_des = DES::new_with_key_u64(key);
let cipher = [0u8; 4];
print!("C =\t");
for c in cipher.clone()
{ print!("{:02X} ", c); }
println!();
let mut recovered = [0u8; 8];
let len = a_des.decrypt_array_into_array(iv, &cipher, &mut recovered);
println!("The length of plaintext = {}", len);
assert_eq!(len, 0);
let failure = a_des.is_failed();
assert_eq!(failure, true);
}
println!("-------------------------------");
}
fn des_has_weak_key()
{
println!("des_has_weak_key");
use cryptocol::symmetric::DES;
let key = 0x_1234567890ABCDEF_u64;
let mut a_des = DES::new_with_key_u64(key);
let weak_key = a_des.has_weak_key();
println!("{:016X} is {}a weak key.", key.to_be(), if weak_key {""} else {"not "});
assert_eq!(weak_key, false);
let key = 0x_0000000000000000_u64;
a_des.set_key_u64(key);
let weak_key = a_des.has_weak_key();
println!("{:016X} is {}a weak key.", key.to_be(), if weak_key {""} else {"not "});
assert_eq!(weak_key, true);
println!("-------------------------------");
}