繁体   English   中英

Linux内核中使用AES的加密和解密

[英]Encryption and Decryption using AES in Linux Kernel

我希望在创建文件时加密文件,并在读取操作期间使用AES算法解密文件。 我还分别在vfs_write()vfs_read()编写了用于加密和解密的代码,并且它运行良好,但现在唯一的问题是k每当我将文件传递给长度不是16的倍数的vfs_write() ( AES BLOCK SIZE)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内核挂起,我也不知道在哪里做这样的事情,即在哪个功能和如何。

我也尝试在vfs_write()使用新长度更改count变量,但随后它会出现错误,因为“cat write error:设备上没有剩余空间”。

当我传递16的倍数的文件时,它工作正常。

您当前的模式需要填充; 在某些情况下(例如你遇到的情况),很难做填充。 通常,磁盘/文件系统加密是在其他模式下完成的,它不需要填充(并且易于进行随机读/写)。

分组密码模式概述: 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级加密文件系统”中

为什么你不刻意使它16字节,加密它然后在解密后丢弃填充。 我的意思是不是单靠依靠aes,而是自己动手。 通过这种方式,您可以确保获得的数据是正确的

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM