Как определить, какие шифры и режимы шифрования я могу использовать в dm-crypt/LUKS?
Я использую систему на основе Ubuntu, и мне трудно определить, какие шифры и режимы шифрования доступны для меня.
Страница руководства cryptsetup гласит:
"См. / Proc/crypto список доступных опций. Вам может понадобиться загрузить дополнительные крипто-модули ядра, чтобы получить больше опций".
В моем / proc/crypto очень мало. Как мне узнать, какие дополнительные криптомодули ядра доступны для загрузки?
2 ответа
Есть много, много документов и справочных страниц для чтения, но один документ, который может вас особенно заинтересовать, - это спецификация формата LUKS на диске (PDF).
Приложение B (которое, естественно, ближе к концу) гласит:
Реестр спецификаций шифров и хэшей
Даже если строки cipher-name и cipher-mode не интерпретируются какой-либо операцией LUKS, они должны иметь одинаковое значение для всех реализаций, чтобы достичь совместимости между различными реализациями на основе LUKS. LUKS должен гарантировать, что нижележащая система шифрования может использовать строки имени шифра и режима шифрования, и, поскольку эти строки не всегда могут быть встроенными в систему шифрования, LUKS может потребоваться отобразить их в нечто подходящее.
Допустимые имена шифров перечислены в таблице 1.
Действительные режимы шифрования перечислены в Таблице 2. По контракту режимы шифрования, использующие IV и настройки, должны начинаться с нуля IV / настройки. Это относится ко всем вызовам примитивов шифрования / дешифрования, особенно при обработке материала ключа. Кроме того, эти режимы шифрования IVs / твиков обычно разделяют поток шифров на независимые блоки путем повторного заполнения твиков / IV на границах секторов. Требование полного нуля IV / настройки для первого зашифрованного / дешифрованного блока эквивалентно требованию, чтобы первый блок был определен как находящийся в секторе 0.
В таблице 3 перечислены действительные хеш-спецификации для поля хеш-спецификаций. Совместимая реализация не должна поддерживать все спецификации шифров, режимов шифрования или хэшей.
Таблица 1: Действительные имена шифров
- aes - Расширенный стандарт шифрования - FIPS PUB 197
- twofish - Twofish: 128-битный блочный шифр - http://www.schneier.com/paper-twofish-paper.html (см. ниже)
- змей - http://www.cl.cam.ac.uk/~rja14/serpent.html
- cast5 - RFC 2144
- cast6 - RFC 2612
Таблица 2: Действительные режимы шифрования
- ecb - вывод шифра используется напрямую
- cbc-plain - Шифр работает в режиме CBC. Цепочка CBC обрезается в каждом секторе и повторно инициализируется с номером сектора в качестве начального вектора (преобразуется в 32-разрядный и в младший порядок). Этот режим указан в [Fru05b], глава 4.
- cbc-essiv: hash - шифр работает в режиме ESSIV, используя хэш для генерации ключа IV для исходного ключа. Например, при использовании sha256 в качестве хэша спецификацией режима шифрования является "cbcessiv:sha256". ESSIV указан в [Fru05b], глава 4.
- xts-plain64 - http://grouper.ieee.org/groups/1619/email/pdf00086.pdf, plain64 - 64-битная версия простого начального вектора
Таблица 3: Действительные спецификации хеша
- sha1 - RFC 3174 - американский алгоритм безопасного хэширования 1 (SHA1)
- sha256 - вариант SHA по FIPS 180-2
- sha512 - вариант SHA согласно FIPS 180-2
- palemd160 - http://www.esat.kuleuven.ac.be/~bosselae/ripemd160.html (см. ниже)
Примечание редактора: вышесказанное скопировано из спецификации. После его написания URL этих документов изменились:
- Twofish: 128-битный блочный шифр (новый URL)
- Хеш-функция RIPEMD-160 (новый URL)
Ядро 5.1, действующее в то время, когда я пишу это, имеет два разных формата: строку шифра, "старый" и "новый". Пока что все в этом вопросе и, видимо, все документы также имеют дело со "старым" форматом, поэтому я опишу его здесь. Это только для шифрования. Если используется целостность с dm-crypt, то нужно учитывать шифры AEAD, и это становится еще сложнее.
Анализируемый ядром формат - "шифр[:
keycount]-
Режим-
ivmode[:
ivopts] ". Примеры: aes-xts-plain64
, blowfish-cbc-essiv:sha256
, aes:64-cbc-lmk
,
Шифр Шифр использовать, примеры
aes
,anubis
,twofish
,arc4
и т. д. Драйвер ядра dm-crypt не имеет списка шифров. Это передается в Linux Crypto API, поэтому можно использовать любой подходящий шифр, поддерживаемый ядром.keycount Опциональная мощность двух чисел ключей для использования с шифром. По умолчанию 1 для всех, кроме
lmk
ivmode, где по умолчанию установлено значение 64. Это действительно относится только к LMK, и значения, отличные от 1, не будут работать должным образом с другими режимами.mode Режим цепочки блоков для использования с шифром. Примеры
ecb
,cbc
,xts
, Кроме того, зная, чтоecb
не использует IV, драйвер md-crypt передает это через Linux Crypto API и может использовать любой режим цепочки, поддерживаемый ядром.ivmode Алгоритм, используемый для генерации вектора инициализации (IV) для каждого сектора. В типичном шифровании с симметричным ключом, в отличие от dm-crypt, IV - это еще один бит данных, передаваемый в шифр вместе с ключом при шифровании или дешифровании. На всю операцию передан только один IV. Поскольку dm-crypt должен уметь читать и записывать каждый сектор отдельно, он не шифрует весь диск как одну операцию. Вместо этого есть IV для каждого сектора. Вместо того, чтобы передавать IV в качестве данных, здесь описан алгоритм создания IV. Это не является частью Linux Crypto API, поскольку шифрование IV не производится, а допустимые значения ivmode определяются драйвером dm-crypt. Они есть:
plain
,plain64
,plain64be
,benbi
Они просто используют номер сектора в различных форматах как IV. Предназначен для блочных режимов, таких как XTS, которые предназначены для противодействия атакам, например водяным знакам, при использовании простого и предсказуемого IV.plain64
кажется наиболее рекомендуемым.null
IV всегда ноль. Для тестирования и обратной совместимости вы не должны использовать это.lmk
Совместим со схемой шифрования Loop-AES.tcw
Совместим с TrueCrypt.essiv
Использует номер сектора, зашифрованный с помощью хэша ключа. Предназначен для таких режимов, как CBC, которые не устойчивы к различным атакам при использовании простого IV-подобногоplain64
,
ivopts Хеш для использования с
essiv
ivmode, игнорируется для всех остальных режимов.
Как частный случай "шифр-plain
или просто "шифр" интерпретируются как "шифр"-cbc-plain
". Другой частный случай заключается в том, что ecb
Режим не имеет ivmode для указания.
Как это относится к /proc/crypto
Что касается /proc/crypto
Только шифр и режим актуальны. dm-crypt с созданием спецификации Crypto API вида "mode"(
шифровать)
"и запросить это у ядра. Это то, что нужно искать в /proc/crypto
как name
для skcipher
, Пример:
name : xts(aes)
driver : xts-aes-aesni
module : kernel
priority : 401
refcnt : 1
selftest : passed
internal : no
type : skcipher
async : yes
blocksize : 16
min keysize : 32
max keysize : 64
ivsize : 16
chunksize : 16
walksize : 16
type
из skcipher
указывает на симметричный шифр ключа, который использует dm-crypt, и имя xts(aes)
будет написано aes-xts
когда указано с помощью dm-crypt. keysize
поля также сообщают нам, какие размеры ключей могут использоваться с этим шифром.
Если это из модуля, имя модуля может отображаться в module
линия. Тем не менее, многие шифры (обычно те, которые в программном обеспечении не имеют аппаратного кода) реализованы как универсальный шифр, который комбинируется с универсальным кодом цепочки блоков для создания окончательного skcipher. Например:
name : xts(anubis)
driver : xts(ecb(anubis-generic))
module : kernel
type : skcipher
name : anubis
driver : anubis-generic
module : anubis
type : cipher
В этом случае анубисный шифр объединяется с кодом режима цепочки блоков ядра XTS для получения окончательного шифра xts(anbuis)
, которому был присвоен модуль kernel
, Но для того, чтобы это было доступно, нам нужен общий шифр анубиса, который anubis
модуль. Большинство шифров имеют псевдоним модуля "crypto-
шифр", который может быть использован для их загрузки, например, modprobe crypto-anubis
будет загружать модуль, который обеспечивает шифр Anubis.
При использовании cryptsetup benchmark
Команда, только шифр и режим имеют значение, так как это все, что тестируется. Если режим не указан, по умолчанию используется CBC. Ivmode полностью игнорируется. Таким образом, для бенчмаркинга, aes
, aes-cbc
, а также aes-cbc-foobar
все эквивалентны.
Вы можете перечислить шифры, поддерживаемые вашими ядрами, с помощью следующей команды:
[root@arif]# ls /lib/modules/[your kernel version]/kernel/crypto/
algif_rng.ko.xz blowfish_common.ko.xz cmac.ko.xz cts.ko.xz gf128mul.ko.xz michael_mic.ko.xz rsa_generic.ko.xz tgr192.ko.xz xts.ko.xz
ansi_cprng.ko.xz blowfish_generic.ko.xz crc32_generic.ko.xz deflate.ko.xz ghash-generic.ko.xz pcbc.ko.xz salsa20_generic.ko.xz twofish_common.ko.xz zlib.ko.xz
anubis.ko.xz camellia_generic.ko.xz crct10dif_common.ko.xz des_generic.ko.xz jitterentropy_rng.ko.xz pcrypt.ko.xz seed.ko.xz twofish_generic.ko.xz
arc4.ko.xz cast5_generic.ko.xz crct10dif_generic.ko.xz dh_generic.ko.xz khazad.ko.xz rmd128.ko.xz serpent_generic.ko.xz vmac.ko.xz
async_tx cast6_generic.ko.xz cryptd.ko.xz drbg.ko.xz lrw.ko.xz rmd160.ko.xz sha512_generic.ko.xz wp512.ko.xz
authencesn.ko.xz cast_common.ko.xz crypto_null.ko.xz fcrypt.ko.xz mcryptd.ko.xz rmd256.ko.xz tcrypt.ko.xz xcbc.ko.xz
authenc.ko.xz ccm.ko.xz crypto_user.ko.xz gcm.ko.xz md4.ko.xz rmd320.ko.xz tea.ko.xz xor.ko.xz
Вы можете перечислить шифры и хэши, которые вы можете использовать, и их сравнение ввода / вывода для luks
по следующей команде,
[root@arif arif]# cryptsetup benchmark
# Tests are approximate using memory only (no storage IO).
PBKDF2-sha1 289342 iterations per second for 256-bit key
PBKDF2-sha256 353293 iterations per second for 256-bit key
PBKDF2-sha512 227555 iterations per second for 256-bit key
PBKDF2-ripemd160 233224 iterations per second for 256-bit key
PBKDF2-whirlpool 236165 iterations per second for 256-bit key
argon2i 4 iterations, 917485 memory, 4 parallel threads (CPUs) for 256-bit key (requested 2000 ms time)
argon2id 4 iterations, 951672 memory, 4 parallel threads (CPUs) for 256-bit key (requested 2000 ms time)
# Algorithm | Key | Encryption | Decryption
aes-cbc 128b 642.2 MiB/s 2495.8 MiB/s
serpent-cbc 128b 89.3 MiB/s 542.6 MiB/s
twofish-cbc 128b 100.4 MiB/s 343.1 MiB/s
aes-cbc 256b 477.2 MiB/s 1979.2 MiB/s
serpent-cbc 256b 89.3 MiB/s 538.9 MiB/s
twofish-cbc 256b 173.3 MiB/s 343.1 MiB/s
aes-xts 256b 1668.0 MiB/s 1664.1 MiB/s
serpent-xts 256b 535.7 MiB/s 523.4 MiB/s
twofish-xts 256b 332.6 MiB/s 339.8 MiB/s
aes-xts 512b 1384.5 MiB/s 1380.7 MiB/s
serpent-xts 512b 539.3 MiB/s 524.4 MiB/s
twofish-xts 512b 335.0 MiB/s 340.1 MiB/s
Вы можете сравнить конкретные шифры с помощью следующей команды:
[root@arif]# ciphers="aes-xts serpent-xts anubis-xts"
[root@arif]# echo "# Algorithm | Key | Encryption | Decryption";for i in $ciphers ; do cryptsetup benchmark --cipher $i|tail -n 1; done
# Algorithm | Key | Encryption | Decryption
aes-xts 256b 1613.9 MiB/s 1642.8 MiB/s
serpent-xts 256b 538.9 MiB/s 521.9 MiB/s
anubis-xts 256b 182.0 MiB/s 182.1 MiB/s