Итак, хочу отказаться от файловой системы, для работы, сферической в вакууме, с одним файлом, допустим, даже фиксированной длинны.
Вообще иначе всё тривиально, накатай фс, да монтируй, это понятно, не хочу так.
Тем не менее. Теория.
cryptsetup при детачед хэдере и при --align-payload=0 даёт возможность иметь контейнер произвольной длинны, хоть 100кб, что удобно для теста.
cd /tmp
stat -c %s text
772416
dd if=/dev/zero of=/tmp/ctext bs=1 count=772416
скопировано 772416 байт (772 kB), 7,10004 c, 109 kB/c
dd if=/dev/zero of=/tmp/head bs=1M count=2 && sync
dd if=/dev/zero of=/tmp/key bs=1M count=2 && sync
mknod -m0660 /dev/loop101 b 7 101
losetup /dev/loop101 /tmp/ctext
cryptsetup --verbose --cipher aes-cbc-essiv:sha256 --key-size=256 --hash=sha256 --iter-time=1000 --verify-passphrase luksFormat /dev/loop101 --header /tmp/head --align-payload=0
cryptsetup luksAddKey /tmp/head /tmp/key
cryptsetup luksOpen /dev/loop101 --header /tmp/head --key-file /tmp/key ct
При записи файла выходит ошибка
dd if=/tmp/text of=/dev/mapper/ct
dd: запись «/dev/mapper/ct»: На устройстве кончилось место
1508+1 записей считано
1508+0 записей написано
скопировано 772096 байт (772 kB), 0,0478374 c, 16,1 MB/c
Конец контейнера:
0x000bc7c0: bf 56 41 7b 7b 84 a3 cd c3 9d 7e a5 51 63 0c 59 26 6e 15 47 30 51 e8 30 6a e5 1e e0 ea 8d 48 4e .VA{{.....~.Qc.Y&n.G0Q.0j.....HN
0x000bc7e0: 5a 4b e1 ea 18 89 57 4f d9 99 2e a4 b6 cf a3 ce f6 cf 73 1a 19 17 30 d6 7b 1a 9b fc e8 1b 9e b1 ZK....WO..........s...0.{.......
0x000bc800: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................................
0x000bc820: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................................
0x000bc840: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................................
0x000bc860: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................................
0x000bc880: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................................
0x000bc8a0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................................
0x000bc8c0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................................
0x000bc8e0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................................
0x000bc900: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................................
забавно, есть какой-то механизм, запрещающий запись до конца, при том там нет никакой метадаты.
Тем не менее
cat /dev/mapper/ct > /tmp/check
Дифф показал, что не записались ~10 строк с конца текстового файла, не поместились.
Играя размером исходного файла удается его читать/изменять/записывать даже через leafpad, но от рута.
ln -sf /dev/mapper/ct /tmp/mapper
leafpad /tmp/mapper
cat /dev/mapper/ct > /tmp/check_2
Естественно в конце файла присутствуют несколько «оборванных символов».
Попытки дать не-руту возможность записи не проконали
chown user /dev/mapper/ct
chown user /dev/dm-6
ln -sf /dev/dm-6 /tmp/dm-6
Дальше особо не копал.
Вопрос, есть ли средства для обеспечения прозрачного шифрования одного файла, но без использования ФС?
Теоретически же ничего сложного, крути симметричный алгоритм на лету и всё, но как-то оно под это не заточенно.
cast Gotf
// upd, допёр чего скопировано 772096 байт из 772416.
772096/256=3016 блоков по 256байт ключа, остальное не влезло.