发明名称 面向类Linux系统的内核级虚拟聚合并行加密方法
摘要 本发明公开了一种面向类Linux系统的内核级虚拟聚合并行加密方法,要解决的技术问题是在Linux内核驱动加密卡实现文件的并行加密。技术方案是改进eCryptfs加密文件系统原有的密钥管理模块、数据加解密模块,并设计实现虚拟聚合模块。虚拟聚合模块中,密钥端口映射表负责存放所有加密卡的密钥端口状态,任务调度模块分配加密卡及密钥端口,密钥加载模块完成向密钥端口中导入密钥。改进后的密钥管理模块及数据加解密模块利用虚拟聚合模块分配的加密卡及密钥端口,调用加密卡的编程接口,完成并行文件加解密。采用本发明可以在任何支持eCryptfs的类Linux计算机上,使用多块加密卡进行文件并行加解密,减轻系统CPU的运算压力,提高加密速度和安全性。
申请公布号 CN103294958A 申请公布日期 2013.09.11
申请号 CN201310188826.0 申请日期 2013.05.21
申请人 中国人民解放军国防科学技术大学 发明人 汪黎;吴庆波;戴华东;孔金珠;文云川;彭勇;肖先霞
分类号 G06F21/60(2013.01)I 主分类号 G06F21/60(2013.01)I
代理机构 国防科技大学专利服务中心 43202 代理人 郭敏
主权项 一种面向类Linux系统的内核级虚拟聚合并行加密方法,其特征在于包括以下步骤:第一步:改进eCryptfs加密文件系统,方法是:1.1改进密钥状态结构体,在密钥状态结构体中增加last_port字段,用以存放最近一次使用的密钥端口映射表表项的编号;1.2设计虚拟聚合模块,该模块由密钥端口映射表、任务调度模块以及密钥加载模块组成,密钥端口映射表用于存放所有加密卡的密钥端口状态;任务调度模块通过查询密钥端口映射表,为密钥管理模块及数据加解密模块的调用请求均匀地分配加密卡及密钥端口;密钥加载模块通过加密卡驱动程序提供的编程接口向加密卡的密钥存储单元中导入文件加密密钥FEK:1.2.1设计密钥端口映射表ports_map,建立所有加密卡密钥端口与密钥端口映射表之间的映射关系;系统中所有加密卡的总数表示为Dcount,单个加密卡包含的密钥端口数量为N,N为正整数,ports_map包含的表项数为Dcount*N,表示为Pcount,每个表项包括下列域:序号id、加密卡的编号card、加密卡密钥端口号index、端口空闲标识avail以及用于存放FEK的fek区;序号id的范围为0到Pcount‑1,card的范围为0到Dcount‑1,index的范围为1到N,avail可有EMPTY和BUSY两种取值,EMPTY表示空闲,BUSY表示已占用,fek通常是一段字符数据,存放FEK;1.2.2设计虚拟聚合模块中的任务调度模块,任务调度模块与密钥管理模块、数据加解密模块以及密钥端口映射表相连,在密钥管理模块及数据加解密模块请求使用加密卡时,任务调度模块通过查询密钥端口映射表,根据加密卡及密钥端口的状态执行任务调度,为操作请求分配加密卡及密钥端口;1.2.3设计虚拟聚合模块中的密钥加载模块,密钥加载模块与密钥管理模块、数据加解密模块、任务调度模块、密钥端口映射表及加密卡驱动相连,在密钥管理模块及数据加解密模块请求进行数据加解密操作前,查询密钥端口映射表,与加密卡驱动程序交互,调用加密卡LoadFileKey接口,向任务调度模块分配的加密卡及密钥端口中导入密钥,并更新密钥端口映射表ports_map;1.3修改eCryptfs的密钥管理模块,密钥管理模块与虚拟聚合模块以及加密卡驱动程序相连,由虚拟聚合模块分配可用的加密卡及密钥端口,并与加密卡驱动程序交互,使用加密卡相应的接口,完成FEK的产生及FEK的加解密;1.4修改数据加解密模块,将原来调用内核密码接口进行数据加解密的方式改为调用 加密卡接口进行数据加解密;数据加解密模块与虚拟聚合模块以及加密卡驱动程序相连,由虚拟聚合模块分配可用的加密卡及密钥端口,与加密卡的驱动程序交互,调用加密卡提供的数据加解密接口SymEncrypt/SymDecrypt进行数据加解密;第二步:使用改进后的eCryptfs加密文件系统进行文件数据加解密,方法是:2.1初始化密钥端口映射表,建立密钥端口映射表与加密卡密钥端口之间的映射关系;2.2eCryptfs的文件服务层接收应用程序操作请求,并判断操作请求的类型,根据操作请求的类型,如果是打开文件,转2.2.1,如果是写文件,转2.2.2,如果是读文件,转2.2.3;2.2.1如果文件不存在,执行2.2.11,如果文件已存在,执行2.2.1.2。2.2.1.1文件不存在时,执行如下步骤:2.2.1.1.1eCryptfs的文件服务层执行创建文件函数创建新文件;2.2.1.1.2密钥管理模块采用加密卡驱动程序提供的GetFileKey函数产生FEK;2.2.1.1.3任务调度模块从保留密钥端口映射表reserved_ports_map中获取可用的保留加密卡及密钥端口;2.2.1.1.4密钥管理模块调用加密卡加密FEK,得到EFEK即加密后的FEK;2.2.1.1.5密钥管理模块将EFEK存放到新创建文件的头部;2.2.1.1.6密钥管理模块将FEK存入到新创建文件的密钥状态结构体中,转2.3步;2.2.1.2文件已存在,执行如下步骤:2.2.1.2.1密钥管理模块从已存在文件头部读取EFEK;2.2.1.2.2任务调度模块采用步骤2.2.1.1.3的方法从保留密钥端口映射表中获取可用的保留加密卡及密钥端口;2.2.1.2.3密钥管理模块调用加密卡接口解密EFEK,得到FEK;2.2.1.2.4将FEK缓存至打开文件的密钥状态结构体中,转2.3步;2.2.2写操作请求执行步骤如下:2.2.2.1任务调度模块分配加密卡及密钥端口,方法是:2.2.2.1.1初始化last,存放待加密文件的密钥状态结构体stat的last_port字段的值;2.2.2.1.2判断ports_map表第last项即last_entry的avail字段是否为EMPTY,如果不是,转2.2.2.1.4,否则转2.2.2.1.3;2.2.2.1.3判断ports_map第last_entry项的fek字段的值是否与stat存放的fek字段的 值相等,如果不相等,转2.2.2.1.4,如果相等,转2.2.2.1.8;2.2.2.1.4令循环变量i=0;2.2.2.1.5判断ports_map表第(last+i)%Pcount项的id字段是否小于Dcount,如果小于,转2.2.2.1.7;否则,执行2.2.2.1.6;第(last+i)%Pcount项称为new_entry,“%”为运算符“取模”;2.2.2.1.6判断ports_map表第new_entry项的avail字段是否为EMPTY,如果不是,转2.2.2.1.7,如果是,转2.2.2.1.9;2.2.2.1.7令i=i+1,若i<Pcount,则转2.2.2.1.5,否则,调用Linux内核API函数schedule等待一个调度周期,并转2.2.2.1.4;2.2.2.1.8令entry=last_entry,转2.2.2.2;2.2.2.1.9令entry=new_entry;2.2.2.2密钥加载模块向分配的加密卡密钥端口加载密钥,方法是:2.2.2.2.1将entry的avail字段设置为BUSY;2.2.2.2.2判断entry的id字段是否与待加密文件的密钥状态结构体stat的last_port字段相等,若相等,转2.2.2.2.5,若不相等,执行2.2.2.2.3;2.2.2.2.3将stat的last_port字段置为ports_map表第entry项的id域。2.2.2.2.4将stat存放的fek复制到ports_map表第entry项的fek域;2.2.2.2.5采用加密卡接口LoadFileKey函数,根据ports_map表第entry项的card及index域向对应的加密卡密钥端口导入stat存放的fek;2.2.2.3数据加解密模块调用加密卡接口对明文数据进行加密;2.2.2.4加密完成后,保存密文文件,转2.3步;2.2.3读操作请求执行步骤如下:2.2.3.1文件服务模块根据操作类型读取密文;2.2.3.2任务调度模块采用步骤2.2.2.1的方法分配加密卡及密钥端口;2.2.3.3密钥加载模块采用步骤2.2.2.2的方法向分配的加密卡密钥端口加载密钥;2.2.3.4数据加解密模块调用加密卡接口进行数据解密;2.2.2.5解密完成后,向应用程序提交明文;2.3结束。
地址 410073 湖南省长沙市开福区德雅路109号