Шифрование отдельных файлов с помощью cryptsetup/LUKS
> м[link1]ожно вспомнить про ... cryptsetup/LUKS, которыми тоже в принципе можно шифровать файлы, причём с помощью LUKS в plain mode ... с нужными параметрами и правильно сгенерённым паролем вроде как это будет надёжно бессигнатурно.
Разобрался, как шифровать отдельные файлы с помощью openssl:
(Если есть ошибки, прошу указать.)
Просьба подсказать, как подобное осущеcтвить с помощью cryptsetup или LUKS. Интересует не столько бессигнатурность, сколько простота действий. Конкретно, хотелось бы шифровать по паролю без использования асимметрики. Многократное чтение man cryptsetup и гугление, в том числе на pgpru.com, не помогли.
Ссылки
[link1] https://www.pgpru.com/comment75657
[link2] https://www.pgpru.com/comment39520
[link3] https://www.pgpru.com/comment78729
[link4] https://www.pgpru.com/comment91420
[link5] https://www.pgpru.com/comment39331
[link6] https://www.pgpru.com/comment39340
[link7] https://www.pgpru.com/comment29068
[link8] https://www.pgpru.com/comment80362
[link9] https://www.pgpru.com/comment91478
[link10] https://www.pgpru.com/comment65565
[link11] https://www.pgpru.com/comment65583
[link12] https://www.pgpru.com/comment29051
[link13] https://www.pgpru.com/biblioteka/rukovodstva/zaschitadiska/tailsotricaemoehraneniedannyh
[link14] https://www.pgpru.com/comment92645
[link15] https://www.pgpru.com/comment91667
[link16] https://www.pgpru.com/comment91673
[link17] https://www.pgpru.com/comment91686
cryptsetup не для файлового, а полнодискового шифрования, поэтому вряд ли это хорошая идея. Но в принципе можно если с файлом связать блочное устройство
Появляется шированное устройство /dev/mapper/name, на которое можно записывать например поблочно командой dd. Наверное проще создать на нём файловую систему, примонтировать её и записать файл стандартным способом
По завершении работы все действия произвести в обратном порядке
Команды не проверял, но скорей всего должно работать, т.к. ранее воспроизводил это неоднократно.
Когда-то делал такое. В поднятый на losetup файл можно через cat загнать файл-архив. Из-за некорректной обрезки последнего блока будут ошибки, но его можно оттуда извлечь обратно: в конце несжатого tar-архива большой блок, который устойчив к этому. Но это трюкачество. Раньше ещё был aes-pipe, совместимый с loop-aes, вот там такое можно было делать штатно. Но сейчас loop-aes устарел и не используется.
Думаю что на VPS такой способ может оказаться полезным. Т.к. виртуальный диск на разделы не разбить, можно создать шифрованную ФС в файле, примонтировать и разместить на ней некоторые данные. Например исполняемые файлы, конфигурационные, базы данных. При физическом доступе можно наверное расшифровать, сняв дамп памяти. Но если об этом заранее не позаботиться, то после изьятия сервера форензиков будет ждать сюрприз.
Процедура изъятия VPS — это нечто интересное само по себе.
Спасибо за корректную простановку ссылки, это облегчило поиск. Как вы, наверное, знаете, там в комменте идёт отсылка к этому примеру[link2]. Обратите внимание, что для бессигнатурности там используются трюки. Кроме того, там есть кое-какие предостережения в плане IV (неохота вспоминать) и KDF для шифрования (KDF вроде как нет вообще). Если честно, шифровать файлы openssl'ем — это коряво ввиду озвученных косяков. Если бы лично мне позарез понадобилось бессигнатурно зашифровать файл, я бы воспользовался plain mode cryptsetup (как ФС на файле или непосредственно), а если просто зашифровать, то GnuPG.
Это не является штатной опцией cryptsetup, но из имеющихся опций неявно следует, что так можно сделать. Гугление могло бы помочь, только если какой-то гуру выложил бы рецепт. В общем, это пример как раз достойного вопроса для уровня pgpru.
Можно сделать и пофайлово, но это только для извращенцев и через скриптомесево.
Не нужно. Файл может передаваться как аргумент напрямую cryptsetup'у, он сам из него сделает блочное устройство.
+1. Это будет работать быстро, штатно и везде, в отличие от пофайлового шифрования. К тому же, так можно легко добавлять туда и несколько файлов (хотя если процедура заточена под один конкретный, то всегда можно предварительно создать архив).
Это не трюкачество, а дебилизм с фатальным непониманием матчасти. Блочные устройства, в отличие от файлов, не даунскейлятся с секторов на байты. Если из файла сделать LUKS-устройство, то его отмапленная часть будет обрезана до целого числа секторов. Как туда запихать файл? Либо в конце будет свободное место, либо файл обрежется, и как его потом оттуда извлекать? Получается костыльно, но придётся писать и файл и его размер и ещё учесть округление до секторов. Показываю мастер-класс. Оно работает, причём правильно (сравнивал по хэшам шифруемого и расшифрованного файлов). Я проверял.
Скриптомесево №3
Скрипт шифрования luks_encrypt.sh:
Как это работает
Зашифровать файл:
Равно, как и на той же системе после очередного обновления.
Не, ну вручную всё это можно будет разгрести, в любом случае. Просто лишняя работа будет. Если глубоко рыть, то при обновлении cryptsetup'а и что-то полностью штатное потенциально может слететь.
У меня в памяти отложился инцидент с mcrypt. Я ради бессигнатурности раньше им шифровал соль (опция -b). Потом я поставил другую ОС, где была другая версия mcrypt, и всё. Старые файлы расшифровываться перестали. Хорошо, у меня был доступ к предыдущей ОС'и, поэтому я смог перешифровать те файлы, но вообще пример показательный.
Хотелось поберечь нервы разметка-куну[link3]. Это Вам спасибо, что заметили, и за очередную порцию "информации к размышлению".
Благодарю всех за ответы. И вдруг, и неожиданно вопрос оказался, как всегда, совсем-совсем непростым. :-)
Дело не в способе простановки ссылки, а в самом факте её простановки. Кстати, по смыслу в данном треде эта цитата (OP) «внешняя», поэтому там должен быть не знак больше, а <[текст]>.
Можно было бы в стиле unknown-SATtva указать на общие факты, которых достаточно для написания готового скрипта, если знать матчасть, но, конечно, готовый инструмент — это готовый инструмент, а не заметки на коленке. Мне вот матчасть пришлось доизучить на ходу, потому что изначально не было очевидно, что любое блочное устройство состоит из
секторовблоков (слегка тавтологично, но, тем не менее), и их нецелое число там не сделать никак. Кстати, размер сектора/блока на разных системах может быть разным, но я отличного от 512 не видел (может быть, где-то ещё 128 или 256 было?).Ещё одна тонкость — извраты с dd. Здесь они не так сильно вылазят, потому что идёт запись в блочное устройство, размер которого не может быть изменён, но вот если бы запись делалась в файл, всё было бы тоньше. Наверно, тем, кто с этим работал, это покажется тривиальным, но вообще логика там не такая очевидная. Например, при dd в файл с seek=X будет автоматически создано X блоков нулей, а потом в конец добавлен контент. Если запись таким образом идёт в середину файла, всё до середины будет оставлено, как есть, после середины добавлен контент, а оставшаяся часть будет (сюрприз!) обрезана. Т.е. как по уму записывать фиксированный набор байтов в фикисрованное место файла, ничего не обрезая, — для меня осталось вопросом (который в некоторых частных случаях решается теми или иными хаками, но, наверно, можно и проще).
Ещё одна тонкость была — как записать и считать размер файла. Можно было бы сделать сложнее и оптимальней: не тратить на это лишний сектор, а вычислять необходимое минимаьное число секторов для записи и файла и его «заголовка», где потом распознавать, где файл, а где заголовок, по определённым меткам. Впрочем, раз 4096 секторов и так уже расходуется чисто под заголовок LUKS, будет там на один сектор больше или меньше — уже не важно (для бессигнатурки, не отягощаемой LUKS-заголовком, это имело бы больше смысла).
При считывании размера файла через dd формально пишется на вывод терминала всё хорошо, но с точки зрения внутренностей шелл не считает это цифрами, потому что там нули. И, кстати, очень хорошо, что там нулевые байты — это не ноль в смысле цифры в десятичной системе, а то было бы совсем весело. :-) В общем, хак со strings как-то решает эту проблему, вырезая нужное, но я не уверен, что именно так делается считывание ASCII-символов из файлов в скриптах. Хотелось бы почитать что-то грамотное на тему, как писать в файлы и читать из них, а не переизобретать велосипеды на коленке.
Хотелось бы, чтоб кто-нибудь подсказал. Такое впечатление, что dd читает и пишет блоками, причём количество считанного и записанного должно быть кратно размеру блока. Более того, оффсеты в читаемом и записываемом тоже задаются кратными размеру блоков, тут же надо сделать отступ 512, который не кратен размеру файла. Просто записать произвольный размер — это bs=размер count=1 (не знаю, как это будет работать на больших файлах). Я пытался сделать с seek_bytes=1 и skip_bytes=1, но на вторую опцию dd начал почему-то жаловаться. Понятно, что можно из одного dd сделать несколько и решить эти проблемы, но хотелось бы это записывать покороче и без усложнения логики. В текущем скрипте при расшифровании запись всего 200KB/s. Это очень медленно, но для небольших текстовых файлов сойдёт.
Наконец, замечание общего характера: на мой взгляд, не нужно. Во-первых, это требует скрипт, который надо где-то хранить (хотя его смысл прост, можно и руками извлекать, если это бывает нужным очень редко). Во-вторых, единственное применение, где это могло бы быть осмысленным — удалённые бэкапы, но бэкапится обычно не один файл, а много. Раз их много, проще оценить минимальный размер необходимой ФС и сделать всё штатно через ФС на файле[link4]. Впрочем, одно из применений всё же имеется, но там нужен именно бессигнатурный вариант — это пересылка файлов через файлообменники и другие недоверенные сервисы, где не хочется светить информацию о том, чем были зашифрованы файлы, и вообще, мусор это или шифрованные данные.
Для CD/DVD вроде как 4096.
dd bs=1c — размер блока в один байт.
Есть ещё опасение насчёт криптостойкости. Если делать tar -c -f- /[path]/* | gpg -c > file.tar.gpg, то у нас всё точно корректно зашифруется: будет правильная обработка пароля, уникальный (случайный, каждый раз разный) вектор инициализации для всего файла, даже если шифровать несколько раз одно и тоже одинаковым паролем и давать копии этого противнику и т.д. А при нестандартном использовании cryptsetup можно напортачить и незаметить этого.
Там так и стоит:
Вы имеете в виду, что режим поблочного шифрования не такой же хороший, как в GnuPG? Было предостережение на предмет того, чтобы не давать противнику видеть шифртекст контейнера с разным его содержимым (в разное время) [атака уборщицы]. Тут, правда, контейнер одноразовый, поэтому в лоб такого не будет происходить, но мало ли...
Хуже, если шифрование будет бессигнатурным. Там пароль один и несменяемый.
© man cryptsetup ← лично мне непонятна вот эта магия. Откуда в норме берётся IV в plain mode? А в LUKS? Нужно ли под IV выделять отдельный сектор? И т.д.
В GnuPG — достаточно хороший режим и протокол для файлового шифрования, в dmcrypt — достаточно хороший для шифрования ФС. Использовать режимы GnuPG для ФС — грозит однозначным фэйлом в ряде ситуаций. А можно ли использовать режимы dmcrypt для файлов? Можно долго разбирать теорию, но проще решить, что лучше так не делать.
Статическая псевдорэндомизация, синтетический IV: IV = Hash(номер сектора ║ ключ ║ содержимое предыдущего сектора ║ что-то ещё, могут быть варианты). Это примерно так в ESSIV. Любителям придираться: формула от балды, пироги с сапогами и всё-такое. Использовать только для иллюстрации принципа. В XTS всё ещё сложнее.
Если ФС на файле, и эта ФС не меняется без полного пересоздания всего и вся, то чем плохо? Я не вижу причин.
Думаю, можно. Шифрование ФС влечёт за собой более жёсткие требования, чем шифрование файлов, потому что, как вы говорили, ФС целиком не перешифровывается при изменении содержимого некоторых секторов. Но в случае вышеприведённого скрипта всё это и не нужно: генерируется ключ, записывается в LUKS-слоты, этим ключом шифруется содержимое блочного устройства (куда записан файл); содержимое блочного устройства после этого никогда не меняется. Если в этой схеме есть уязвимость, то она, тем более, есть и при шифровании ФС. Я не вижу, чем этот случай отличается от случая «отдал противнику свой диск, шифрованный LUKS'ом».
Я не про то, как это внутренне устроено, а про примитивное юзерское. Если по простому: в каких случах нужно указывать --skip, и какой в этом будет смысл? Могли бы вы привести наглядные примеры? Во всех случаях (бессигнатурка, бессигнатурка с оффсетом (шифруем неразмеченное дисковое пространство начиная с какого-то сектора)] я пока что нигде эту опцию не использовал. Это правильно? Где она может быть нужна?
А, Вы об этом. :-) Этим я пытаюсь проявить элементарную вежливость в общении. Увидел, что другие так делают, и тоже так поступаю. Без таких ссылок читатель/отвечающий будет тратить лишнее время.
Бессигнатурно шифровать openssl можно без трюков
IV создаётся на основе пароля, но можно указать опцией -iv, тогда при расшифровке его необходимо помнить. Удобно также шифровать mcrypt
Плюс в том, что IV генерится из рандома и записывается перед шифртекстом, поэтому помнить не нужно. Тоже убирается опцией noiv, тогда будет создаваться из пароля, как в openssl. Другой плюс это 256-битный блок Rijndael, в отличие от 128-битного в openssl, а также больше выбор алгоритмов, включая Twofish и Serpent.
Если файл примонтирован как устройство, то при записи в середину он не может обрезаться. Кстати, забыл написать в comment91420[link4], что перед связыванием файла с блочным устройством, его нужно чем-нибудь заполнить до нужного размера, если он пустой. Например для 10 мегабайт
IV-соль в plain не используется, т.к. пароль не шифруется, а преобразуется в ключ хешированием или испольуется напрямую (aes-plain). При использовании LUKS IV для шифрования ключа паролем берётся из /dev/urandom по умолчанию (можно изменить опцией --use-random) и сохраняется в заголовке. Для шифрования блоков диска IV со стороны вообще не используется, а генерится из ключа по алгоритму ESSIV (как unknown показал).
А там по ссылке трюки как раз для того и используются, что и соль есть, и помнить ничего не надо. Более того, ваш пример, судя по комментарию unknown'а[link5] крайне не рекомендуется к использованию (также см. /comment39340[link6]). Там же объяснено, почему вот так:
делать не надо. И, кстати, вот ещё[link7] комментарий в тему этого обсуждения.
openssl вообще не умеет AES-256? Тут[link2] aes-256-cbc указано опцией.
Вот именно поэтому там сказана оговорка:
Я поначалу ошибочно подумал, что шифрованный файл надо собирать из кусков. В этом случае эта проблема бы вылезла.
Всё хуже. Поидее надо заполнять не нулями, а рандомом (уж во всяком случае в вашем примере — точно). В моём примере, может быть, это будет избыточным, но это надо анализировать. Если шифрование поблочное/посекторное, а размер устройства в точности совпадает с заполняемым, то неизменяемых блоков/секторов не будет. Правда, если размер файла равен целому числу блоков, то в приведённом скрипте в последний сектор ничего так и не будет записано, а это уже какая-никакая дополнительная информация о размере файла. В общем, похоже, если всё так, то надо либо для гарантии тоже забивать всё рандомом[link8], либо фиксить последний сектор.
Тогда зачем (см. эту цитату выше) в man cryptsetup это написано?
Плюсы и минусы mcrypt
Помимо замечания в /comment91478[link9] у меня сложилось впечатление, что с mcrypt всё не очень хорошо, не очень надёжно, а его использование не очень рекомендуется. Возможно, всё эти представления ошибочны, когда идёт речь именно о бессигнатурном шифровании, но всё же. Сейчас прогуглил все его упоминания за время существования форума, и вот такая картина получается:
Т.е. вопрос в том, что лучше для бессигнатурности: создать контейнер в plain mode или использовать mcrypt? Мне первый вариант интуитивно кажется более доверяемым, т.к. это всё-таки стандартный и всюду используемый cryptsetup, написанный со знанием дела.
AES != Rijndael. У первого размер блока (не ключа) строго равен 128 битам, у второго есть вариант со 128- и 256-битовым блоком.
В AES-256 размер блока 128 бит, как тут уже ответили.
Наверно для именения нумерации блоков, используемой ESSIV при генерации IV. В plain mode (без заголовка) пароль не шифруется, поэтому соль не нужна.
На мой взгляд для шифрования одного файла лучше mcrypt, чем велосипеды с cryptsetup. Лично для меня проще стандартное действие – скачать и скомпилировать программу, чем возиться со скриптами. Если шифруется бэкап c ФС, тогда удобнее cryptsetup. По большому счёту особой разницы нет.
Так зачем пользователям cryptsetup лезть в эти тонкости криптографии? Где и зачем это может быть нужно? Может быть, Unknown опцию --skip прокомментирует? В man'е я вижу только это:
Когда реализуется случай «did not use it in IV sector calculations»?
Так подробно же про skip написано:
В моей версии cryptsetup'а это пояснение уже убрали.
Для начала, я не знаю, что такое вектор инициализации, и чему равен его размер. Для меня, как для простого юзера, это просто внутренний параметр для шифра, который всегда как-то вычисляется автоматически и правильно. Почему вдруг в какой-то момент я должен выяснять, как он вычисляется — уже само по себе большой вопрос.
Почему negative-то? Если речь о сдвиге сектора, который будет использоваться для вычисления IV, то сдвиг как раз positive. И как из содержимого сектора вычисляется IV?
Нетривиально. Ключ вычисляется из пассфразы. Offset — это просто начиная с какого сектор блочного устройства его отмаппить в шифрованное. Как отсюда следует, что IV оказывается равным нулю?
Вроде IV=0 — это плохо. И как тогда надо делать, когда шифрование происходит не с начала устройства? Надо каждый раз писать --offset n --skip n? А когда эти параметры стоит делать разными? Или лучше делать --offset $((n+1)) --skip n? Я ничего не понял.
Это параметр режима шифрования, а не шифра.
До тех пор пока вы не хотите странного. Если хотите — то можете простреливать себе ногу. Вам дана такая возможность. В случае с крипто и отрицаемостью — такое самопростреливание ещё и незаметно до поры до времени, внешне всё работать будет.
Смотря для чего.
Если вы — простой юзер и не понимаете в векторах и режимах, то не пытайтесь сделать нечто нештатное. Пока не изобрели стандартизированный и внедрённый в доверяемые утилиты протокол бессигнатурного шифрования из коробки, то не пытайтесь нагородить его самопальными костылями.
Бессигнатурное шифрование достигается добавлением пары опций, ничего сильно нестандартного тут нет. То, что вы лично и для себя считаете это ненужным — это ваши личные проблемы.
Для cryptsetup, где устройство шифруется не с первого сектора. Здесь[link13] в четвёртом и седьмом пунктах оффсет указан, а скип нет. Это правильно или надо фиксить?
Всецело с этим согласен.
Так это надо подумать над тем, что я считаю ненужным. И много чего написать, где это может вылезти. Попытка эмулировать скрытые разделы со смещение — первое, что приходит в голову. Я ограничиваюсь только недоказанным предупреждением, что здесь может возникнуть проблема.
Будьте добры, что означает "эмулировать стрытый раздел со смещением"? Понятен смысл выражения "создать", но не понятен "эмулировать".
Попытка эмулировать фичи скрытых разделов, которые были в truecrypt, путём манипулирования оффсетами cryptsetup при неаккуратном обращении с векторами инициализации могут (?) привести к фэйлам. Утверждение бездоказательное, подробно не разбирал.
Спасибо
Возможно ещё применение когда устройство разбито на разделы, а шифруется не первый раздел. Тогда опция skip позволяет в дальнейшем присоединить к шифрованному пространству предыдущие разделы и расширить файловую систему без перешифровки расширяемого раздела.
Насчёт скриптов. Исхожу из возможной ситуации когда система со скриптами и настройками утрачена, остались только шифрованные диски с бэкапами и пароль в голове. Нужно получить к ним доступ для восстановления системы с наменьшими затратами. Нешифрованных устройств с информацией о настройках нет в принципе, т.к. обнаружение скриптов свидетельствует об использовании шифрования, его опциях и во многом обесценивает затраты на бессигнатурность. В таком случае любое усложнение может приводить к серьёзным затратам, впоть до утери всей информации. Сразу становится понятным преимущества стандартных средств. Не нужно помнить логику скриптов, достаточно
1. Уметь установить программу (mcrypt или cryptsetup)
2. Помнить режим шифрования (для бессигнатурного варианта).
3. Помнить пароль
После расшифровки и доступа к скриптам можно уже получить доступ к устройствам, зашифрованным экзотическими способами (со сдвигом блоков и т.п.)
Насчёт mcrypt не скажу, а для cryptsetup скачиваете любой инсталляционный образ любого Linux'a, в котором можно что-то запускать с флэшки в rescue-режиме, криптсетапите и монтируете, что нужно. Cryptsetup и GnupG — штуки штатные, на них столько всего завязано, что они уже никуда не денутся.
На данный момент оптимальнее так:
Кстати, не такой уж и большой оверхед при двойном шифровании с разными паролями: слой без LUKS, а внутри слой с LUKS.
Как-то стрёмно использовать cryptsetup c офсетами после таких пояснений. Я не удивлюсь, если там внутри критично напортачили, а в случае обнаружения баги скажут, что это опции неприоритетные, за них никто не ручался.
Разве эта опция — не такая простая вещь для владеющих темой?
А в обычном plain mode без смещения (-c aes-xts-plain64 -s 512 -h sha512) не может возникнуть? Чем это отличается от:
- С помощью dmsetup отмаппливаем сектора с n'ого до последнего.
- К отмаппленному устройству применяем обычный cryptsetup (plain mode) без всяких смещений, т.е. без --skip и без --offset
Ы? По-моему, это совершенно эквивалентно. Если всё так плохо и непросто, как вы описываете, то поидее проблема должна в любом plain mode вылезать.Наверно, не предыдущие, а последующие.
Вы проверяли? Это работает? Я вам уже написал, что здесь /dev/mapper лишнее.
(проблема выеденого яйца не стоит)
(вообще непонятно, что они там хотели этим сказать)
Простите, на какую из этих двух ваших реплик теперь ориентироваться?
offset эквивалентен dmsetup linear. Это можно проверить экспериментально:
--skip, как я понял, нужен при создании «частичных» крипторазделов. Допустим, нужно адресовать часть криптораздела, отступив от его начала на 8 секторов. Пусть сам криптораздел расположен по оффсету S. Если сделаем --offset S+8, у нас будет неправильный IV, поэтому надо делать --offset S+8 --skip 8. Т.е.
Таким образом, в plain mode не указывать --skip равносильно указанию --skip 0. Можно указывать, если есть сомнения. Задание опции --offset никак не влияет на IV.
UPD: Когда мы skip не задаём (P=0), IV равен «исходному» для сектора S. Смысл указания skip в том, что мы читаем те же самые сектора, что и без skip (это самое нетривиальное!), но с другим IV. Следовательно, нужно сначала сместиться на P секторов «назад» относительно оффсета, образовать криптомаппинг с «исходным» IV, а затем сместиться вперед на те же P секторов. Отсюда сначала S-P, затем P. В итоге получается, что при указании --offset S --skip P криптомаппинг охватывает сектора начиная с S (!), однако, IV устроен так, как будто мы «пропустили» с начала P секторов (отсюда и название «skip»).
Спасибо за исследование.
Пожалуйста. Если соотнести эти факты с тем, что unknown писал на предыдущих двух страницах, вырисовывается примерно такая картина:
Всё это выглядит так, что IV, в любом случае, вычисляется автоматически по заданным правилам, а опция skip лишь корректирует параметры. Судя по man cryptsetup, сам юзер непосредственно вмешаться в выбор IV (к примеру, задать руками) не может вообще (опция skip — это как выбор значения счётчика для заранее предпопределённого правила вычисления IV).
UPD: Когда --skip не указывается, он по умолчанию равен нулю для plain mode. Да, при этом IV получается, как если бы не было никакого оффсета (это легко проверяется экспериментом с dmsetup linear). Вообще, есть некий базовый режим cryptsetup plain, а offset и skip на него накладываются линейными сдвигами до и после. Опция --skip не меняет адресацию секторов, а исключительно расчет IV. Поэтому в LUKS его вообще нет, о чем ман и говорит нам:
Вместо тысячи слов, которые всё равно будет едва ли возможно понять, весь смысл одной картинкой:
LUKS — это просто чёрный ящик, на входе которого пассфраза, а на выходе — мастер-ключ. Ничего более в нём нет. Метод, как шифровать блочное устройство, определяется задаваемым шифром и режимом, а откуда взялся мастер-ключ — вывели с LUKS'а, задали вручную или получили в plain mode — не играет никакой роли. По крайней мере, на самом шифртексте это не скажется никак. Показываю PoC — подключение LUKS-тома в plain mode:
Создание LUKS-тома
Подключение LUKS-тома в plain mode
Мораль: