Generate Encryption Keys in RustWithin encryption we often need to generate a random key. This is typically a 128-bit or a 256-bit key size. This relates to 16 bytes and 32 bytes, respectively. In this case we will use Rust to generate a 128-bit and a 256-bit random key. |
The outline code is:
use rand::thread_rng; use rand::Rng; use hex::{self}; use std::str; use std::env; use aes::Aes128; use block_modes::{BlockMode, Cbc}; use block_modes::block_padding::Pkcs7; type Aes128Cbc = Cbc; fn get_random_key16() -> [u8; 16]{ let mut arr = [0u8; 16]; thread_rng().try_fill(&mut arr[..]).expect("Ooops!"); return arr; } fn get_random_key32() -> [u8; 32]{ let mut arr = [0u8; 32]; thread_rng().try_fill(&mut arr[..]).expect("Ooops!"); return arr; } fn main() { let randkey128=get_random_key16(); let randkey256=get_random_key32(); let iv=get_random_key16(); let mut msg = String::from("Hello world!"); let args: Vec = env::args().collect(); if args.len() >1 { msg = args[1].clone(); } println!("\nRandom 128 bit (16 byte) key: {}\n",hex::encode(randkey128)); println!("\nRandom 256 bit (32 byte)key: {}\n",hex::encode(randkey256)); let plaintext=msg.as_bytes(); let cipher = Aes128Cbc::new_from_slices(&randkey128, &iv).unwrap(); let pos = plaintext.len(); let mut buffer = [0u8; 128]; buffer[..pos].copy_from_slice(plaintext); let ciphertext = cipher.encrypt(&mut buffer, pos).unwrap(); println!("\nMessage: {}",String::from(msg)); println!("\nCiphertext: {}",hex::encode(ciphertext)); let cipher = Aes128Cbc::new_from_slices(&randkey128, &iv).unwrap(); let mut buf = ciphertext.to_vec(); let decrypted_ciphertext = cipher.decrypt(&mut buf).unwrap(); println!("\nPlaintext: {}",str::from_utf8(decrypted_ciphertext).unwrap()); }
and Cargo.toml:
[package] name = "randkey" version = "0.1.0" edition = "2021" # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html [dependencies] hex="0.4.2" rand="0.8.3" aes="0.7.5" block-modes="0.8.1"
A test run is:
Random 128 bit (16 byte) key: f7271be9d20ba9b367b542e54d0a05b8 Random 256 bit (32 byte)key: b6e1659040e6f9217bcebe365b9c35d4895d67b0ca989ce84bb64e96253181b3 Message: Hello You Ciphertext: 08ab5e37560abb148152d55418be7957 Plaintext: Hello You