LUKS
LUKS encryption
Getting Started
See Archwiki: dm-crypt/Device encryption.
Install cryptsetup
sudo apt install cryptsetup
Encrypting a device
# Examples
DEVICE=/dev/sda
NAME=arr1
# Setup encryption
cryptsetup -v --type luks2 --cipher aes-xts-plain64 --key-size 512 --hash sha512 \
--iter-time 5000 --use-urandom --verify-passphrase luksFormat "${DEVICE}"
# Open encrypted drive to /dev/mapper/$NAME
cryptsetup open "${DEVICE}" "${NAME}"
# Create a partition
mkfs.btrfs /dev/mapper/${NAME}
mount -t btrfs /dev/mapper/${NAME} /media/${NAME}
# Fill the drive to overwrite any existing raw data (optional)
dd if=/dev/zero of=/media/$NAME/file status=progress
Mounting
# Open the encrypted drive
cryptsetup open "${DEVICE}" "${NAME}"
# Mount your partition
mount -t btrfs /dev/mapper/${NAME} "${MOUNT_LOCATION}"
Unmounting
# Unmount your partition
umount "${MOUNT_LOCATION}"
# Close the decrypted drive
cryptsetup close ${NAME}
Encrpytion Options
- You can see defaults using
cryptsetup --help
. --type
optionsluks
defaults toluks1
on cryptsetup < 2.1.0,luks2
on cryptsetup >= 2.1.0luks1
is the standard version of LUKS.luks2
is a new version released in Dec 2017. Older versions of Grub (before 2.06 or June 2020) do not support booting from LUKS2.plain
is dm-crypt plain mode. Avoid this unless you know what you're doing.loopaes
Avoid this as well.tcrypt
Use this for mounting older truecrypt volumes.
--iter-time
dynamically determines the number of iterations used to hash your password. The number of iterations is determined when creating the luks key. E.g.5000
means hash for 5 seconds worth of iterations on your particular CPU. You can see the number of iterations for each key withcryptsetup luksDump <device>
.
defaults
defaults on Ubuntu 18.04
Default compiled-in device cipher parameters: loop-AES: aes, Key 256 bits plain: aes-cbc-essiv:sha256, Key: 256 bits, Password hashing: ripemd160 LUKS1: aes-xts-plain64, Key: 256 bits, LUKS header hashing: sha256, RNG: /dev/urandom
Benchmark
cryptsetup benchmark
Example Output (i7-12700K)
# Tests are approximate using memory only (no storage IO). PBKDF2-sha1 3057072 iterations per second for 256-bit key PBKDF2-sha256 6452775 iterations per second for 256-bit key PBKDF2-sha512 2432890 iterations per second for 256-bit key PBKDF2-ripemd160 1289761 iterations per second for 256-bit key PBKDF2-whirlpool 1148495 iterations per second for 256-bit key argon2i 13 iterations, 1048576 memory, 4 parallel threads (CPUs) for 256-bit key (requested 2000 ms time) argon2id 13 iterations, 1048576 memory, 4 parallel threads (CPUs) for 256-bit key (requested 2000 ms time) # Algorithm | Key | Encryption | Decryption aes-cbc 128b 1976.6 MiB/s 7781.1 MiB/s serpent-cbc 128b 136.8 MiB/s 993.0 MiB/s twofish-cbc 128b 291.3 MiB/s 646.8 MiB/s aes-cbc 256b 1507.6 MiB/s 6406.3 MiB/s serpent-cbc 256b 138.2 MiB/s 984.0 MiB/s twofish-cbc 256b 295.3 MiB/s 647.1 MiB/s aes-xts 256b 6021.9 MiB/s 5909.9 MiB/s serpent-xts 256b 855.7 MiB/s 887.4 MiB/s twofish-xts 256b 597.8 MiB/s 608.0 MiB/s aes-xts 512b 5521.2 MiB/s 5505.7 MiB/s serpent-xts 512b 870.2 MiB/s 897.9 MiB/s twofish-xts 512b 602.9 MiB/s 607.1 MiB/s
Adiantum
If you're running a device which does not support hardware accelerated AES instructions (e.g. Raspberry Pi), you may be interested in Adiantum[1].
Adiantum is an encryption mode by Google which uses ChaCha12 for block encryption.
It is included in Linux kernel v5.0.
- Creation
cryptsetup -v --type luks2 --cipher xchacha12,aes-adiantum --sector-size 4096 \ --key-size 256 --hash sha512 --iter-time 5000 --use-urandom \ --verify-passphrase luksFormat <device>
- Benchmark[2]
cryptsetup benchmark -c xchacha12,aes-adiantum -s 256
Scripts
mount_drives.sh
#!/bin/bash
function mount_luks {
local fstype=$1
local device=$2
local name=$3
local mountpoint=$4
if [ ! -b /dev/mapper/"$name" ]
then
sudo cryptsetup open "$device" "$name"
fi
sudo mkdir -p "$mountpoint"
sudo mount -t $fstype /dev/mapper/"$name" "$mountpoint"
}
mount_luks btrfs /dev/disk/by-id/<drive> lukscrypt1 /media/lukscrypt1
unmount_drives.sh
#!/bin/bash
function unmount_luks {
local name=$1
local mountlocation=$2
sudo umount "$mountlocation" && \
sudo rm -r "$mountlocation"
sudo cryptsetup close "$name"
}
unmount_luks lukscrypt1 /media/lukscrypt1
Resources
References
- ↑ Google Blog: Introducing Adiantum: Encryption for the Next Billion Users https://security.googleblog.com/2019/02/introducing-adiantum-encryption-for.html
- ↑ https://www.reddit.com/r/crypto/comments/b3we04/aesadiantum_new_mode_in_linux_kernel_5/