Module rc5

Source
Expand description

§RC5 block-cipher

Library implementation of the basic RC5 block cipher in Rust. RC5 is different from the classical ciphers (like AES) in the sense that allows to parametrize the algorithm and optimize both security and efficiency on different hardware.

These parameters are:

  • w: word length in bytes
  • r: number of rounds
  • b: key length in bytes

The selection of each of them should be preferably done by choosing standards from other use cases. For example the word length w could be any number of bytes but the recommendation for performance and security is that should be a power of 2, or even better, a power of 8. In that way one can use the hardware registers more efficiently, e.g. 32-bits or 64-bits registers, with vectorization possibilities (AVX on Intel or SVE on ARM).

This RC5 implementation is designed only for the standard values of w (powers of 8) making use of the standard Rust types: u8, u16, u32, u64, u128.

§Example: encryption

use rc5_cipher::encrypt;

let rounds = 12;
let key = vec![
    0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D,
    0x0E, 0x0F,
];
let pt = [0x33221100u32, 0x77665544];

let ct = encrypt(pt, &key, rounds);

assert_eq!(ct, [0x9B14DC2Du32, 0x9E8B08CF]);

§Example: decryption

use rc5_cipher::decrypt;

let rounds = 12;
let key = vec![
    0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D,
    0x0E, 0x0F,
];
let ct = [0x9B14DC2Du32, 0x9E8B08CF];

let pt = decrypt(ct, &key, rounds);

assert_eq!(pt, [0x33221100u32, 0x77665544]);

§Bibliography

  • Rivest original paper: https://www.grc.com/r&d/rc5.pdf
  • C implementation and tests: https://tools.ietf.org/id/draft-krovetz-rc6-rc5-vectors-00.html#rfc.section.4
  • Haskell implementation: https://hackage.haskell.org/package/cipher-rc5-0.1.2.2/docs/src/Crypto-Cipher-RC5.html

Functions§

decrypt
Decrypts a ciphertext ct and returns a plaintext pt. The ct is an array of two words W (u8, u16, u32, u64, u128)
encrypt
Encrypts a plaintext pt and returns a ciphertext ct. The pt is an array of two words W (u8, u16, u32, u64, u128)
expand_key
Expands key into and array of length T of type W
rotl
rotr