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 old version of LUKS.luks2
is the current 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
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/