Шифрование и дешифрование с использованием AES в ядре Linux - PullRequest
3 голосов
/ 20 февраля 2012

Я хочу зашифровать файлы во время их создания и расшифровать файлы во время операции чтения с использованием алгоритма AES. Я также написал код в vfs_write() и vfs_read() для шифрования и дешифрования соответственно, и он также работает хорошо, но единственная проблема сейчас в том, что k всякий раз, когда я передаю файл в vfs_write(), длина которого не кратна 16 ( РАЗМЕР БЛОКА AES) den AES выполняет дополнение к нему, чтобы сделать его кратным 16, и bcz этого размера файла увеличивается, но функция write() не знает об этом и поэтому отклоняет

например: - предположим, что я ввожу данные как "123", здесь length равно 4 (длина данных 3 + 1 символ '\ 0'), и поэтому AES дополняет его 12 байтами, чтобы сделать его 16 байтами (как AES). работает с 16-байтовыми блоками), но write() принимает только исходную длину, равную 4, поэтому я хочу знать, как изменить размер файла до 16 (в данном случае), а также где это сделать в коде ядра.

Я попробовал это

inode->i_size=new_length;
inode->i_op->truncate(inode);

также я попробовал

if(file->f_flags & O_APPEND)
    *pos=i_size_read(inode);

но это не работает, зависает ядро ​​bcz, а также я не понимаю, где делать такие вещи, то есть, в какой функции и как.

также я попытался изменить переменную count с новой длиной в vfs_write(), но затем выдает ошибку «ошибка записи cat: на устройстве не осталось места».

работает нормально, когда я передаю файл, кратный 16.

Ответы [ 2 ]

1 голос
/ 20 февраля 2012

почему вы сознательно не делаете это 16 байтов, зашифровываете его, а затем после расшифровки отбрасываете заполнение.Я имею в виду, вместо того, чтобы полагаться только на себя, сделай это сам.При этом вы будете уверены, что данные, которые вы получаете, верны

1 голос
/ 20 февраля 2012

Ваш текущий режим требует заполнения; и в некоторых случаях может быть трудно сделать отступы (например, то, что вы встречаете). Обычно шифрование диска / файловой системы выполняется в другом режиме, который не требует заполнения (и легко выполняет произвольное чтение / запись).

Обзор режимов блочного шифрования: http://en.wikipedia.org/wiki/Block_cipher_modes_of_operation

Режимы: ECB, CBC, PCBC, CFB, OFB требуют заполнения

и режим CTR (Счетчик) не требует заполнения.

Этот режим прост и еще проще реализовать его неправильно (небезопасно, легко взломать).

Обзор шифрования диска http://en.wikipedia.org/wiki/Disk_encryption_theory с еще более продвинутыми режимами (XEX, XTS). Некоторые из них все еще требуют заполнения.

Даже при использовании универсального шифровального режима вы столкнетесь с множеством проблем. Некоторые из них описаны в «Cryptfs: наращиваемая файловая система шифрования уровня Vnode»

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...