2012-02-20 842 views
3

我想在創建文件時加密文件,並在使用AES算法進行讀取操作時解密文件。我也分別在vfs_write()vfs_read()中分別編寫了代碼,用於加密和解密,並且它運行得很好,但現在唯一的問題是k每當我傳遞一個文件到vfs_write()時,其長度不是16的倍數(AES BLOCK SIZE)填充它使它成爲16的倍數,而bcz這個文件的大小增加,但write()函數不知道這個,所以它拒絕在Linux內核中使用AES進行加密和解密

例如: - 假設我輸入數據爲「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內核掛起,也我不理解在哪裏做這樣的事情,即,在功能和如何。

此外,我試圖改變計數變量與vfs_write()新的長度,但隨後它給錯誤爲「貓寫錯誤:沒有空間留在設備上」。

它工作正常時,我通過文件這是16.

+3

他們爲你用黑體字寫的每個單詞付出幾美分嗎? :S(順便提一句,有趣的問題) – 2012-02-20 15:19:38

回答

1

您當前的模式的倍數需要填充;在某些情況下可能很難做填充(比如你遇到的東西)。通常,磁盤/文件系統加密是在其他模式下完成的,不需要填充(並且易於進行隨機讀取/寫入)。

概述的塊密碼的模式: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: A Stackable Vnode Level Encryption File System"

1

你爲什麼不刻意讓16個字節,它加密和解密,然後丟棄後填充。我的意思是,不要單憑依賴,而要自己去做。通過這個你將確保你得到的數據是正確的