随着国内“数字化医院”建设的蓬勃发展,各医疗部门对电子病历系统的需求也迅速增长。为了建立更成熟的电子病历系统,有效的安全措施是必不可少的。为此提出一种指纹信息的电子病历(EMR),利用指纹的唯一性等特征,设计出一种基于指纹信息的电子病历XML文档加密方法。

一、如何获取指纹信息

近年来,自动指纹识别系统(AFIS)迅速发展,由于其唯一性、永久性和可采集性等显著优点,已被广泛用于银行等行业领域中的个人身份认证。在EMR系统设计时融AAFIS技术,医生在登陆电子病历系统时只需输入自己指纹就可以查看、修改有自己电子签名的电子病历。但是,EMR系统设计者通常缺少对指纹识别算法的深人研究,过于依赖第三方算法平台提供者,会增加医院的维护和使用成本。为避免这些问题,我们在设计EMR系统时,对近几年提出的指纹识别算法进行了充分的研究和分析,提出了一个在EMR系统中综合应用指纹识别技术的解决方案。AFIS有两种模式工作:验证,即1:1模式;辩识,即1:N模式。它由指纹图像采集、图像评估、图像预处理、特征提取等几个功能模块构成。 指纹的细节特征是指纹的端点和分叉点。端点是指一条纹线的终结点,而分叉点是指一条纹线在某点分成两条或多条纹路。如图1所示。  无论是指纹图像还是指纹分类,都需要提取指纹的有效特征值,为了保证图像特征值的可靠性,必须对获取的指纹图像进行预处理,以减少噪声干扰。

1、图像质量评估

在图像预处理之前加入一种新的图像质量评估的方法。指纹图像评估是指纹识别中的一个图像预处理子模块。通常指纹采集器采集的指纹图像质量比较小,易受外界环境干扰。为了保证整个系统的可靠性和稳定性,需要排除不能满足要求的指纹,特别是在指纹登记过程中,一定要保证指纹模板的可靠性。低质量指纹图像,如湿手指、偏手指、干手指等。

2、指纹图像分割

图像分割是将图像中有意义的特征或需要应用的特征提取出来。指纹特征分割的主要目的是把指纹图像中质量差的、在后续处理中很难恢复的图像区域与有效区域分开来,使后续处理能够集中在有效区域。

3、指纹图像增强

图像增强用于图像不清晰的部分,依据某些条件,改善这些区域的质量,以保证后续处理的可靠性。对于指纹图像的增强只要根据脊线垂直方向的灰度变化呈正弦波的假设,设计各种具有方向性的滤波器。 采用基于Gabor滤波器的纹理滤波算法,该类算法利用Gabor滤波器具有频率和方向的选择特性,增强纹线和脊线之间的对比度,以达到同时在时域和频域获得最佳局部化。同时Gabor滤波器具有频率选择性和相位选择性,空域和频域中具有适当的联合分辨率,采用联合参数作为带通滤波器可以保证指纹脊线和谷线结构的真实性。 Gahor滤波器如下式所示:

其中θ表示纹线的方向,f标准纹线频率,σx2、σy2为高斯包络常量。

4、指纹图像二值化

指纹图像的二值化是通过设定的阈值,将一幅图像的灰度值由两种级别表示的黑白图像,黑像素代表指纹的前景区,白像素表示指纹的背景区。采用自适应动态阈值法,该算法首先假定该阈值能够将区域像素划分数量相等的两个集合,然后根据统计规律来选择合适判定阂值,将对应区域的指纹图像划分为大致相等两个区域:前景区和背景区。算法如下:首先将增强后的指纹图像进行分成wxw的小块计算区域内的灰度均值,并把此均值作为区域图像的二值化阈值;

其中Tawg(i,j)在区域(i,j)灰度平均值,I(i,j)为区域在点(i,j)像素点的值; 然后通过(2)式来逐步判定,实现指纹图像的二值化;

其中,I(i,j)为二值化后的指纹图像的像素值。

5、指纹图像细化

指纹图像的快速细化算法的基本原理是通过一种逐次去除边界点进行多次迭代的算法。快速细化算法具体描述:设己知目标点标记为1,背景点标记为0,边界点定义为本身标记为1,其中8个邻域至少有一个点标记为0。如图2所示:

其中任意像素点P,P的8邻点是以P为中心3x3的矩阵中8个邻域的点即P1-P8,P的8邻点是为P1,P3,P5,P7。通过搜索整个指纹用像,以确定指纹阁像纹线的边界点,对边界点定义丽个特征量S1和S2,同时满足:S1=2且S1≠1,且S1<6则可以删除该点,通过S1和S2条件判断此边界点是否满足删除条件:对下一个边界点继续扫描,直到没有发现可以删除的点为止。

6、特征点提取

在细化图像上脊线由单像素宽线条表示,寻找细节点是逐行扫描脊线上的像素点,对每个像素点的8邻点计算,设Cn(P)为交叉数。Sn(P)为8邻域像素:

当Cn(P)=1,Sn(P)=1,称为端点,Cn(P)=3,Sn(P)=3,称为叉点。图3所示为指纹特征提取的过程图。

根据不同手指以及手指的按压位置的不同,提取后的指纹模板信息量在800bit一1300bit。

二、指纹信息对电子病历加密算法研究

1、Rijndael算法结构描述

一个word为32比特数据,所以128比特的数据信息分为4word,128比特密钥也为4word,定义Nb为数据信息列数,Nk为密钥word数,Nr为循环加密次数。 表1为不同密钥的Nb、Nk、Nr的关系。

Rijndael算法把数据块的128bit输入分组用以字节为单位的矩阵方阵描述,该数组被复制到State数组中。加密过程分为四个阶段:密钥扩展、轮密钥加、Nr-1轮变换及最后一轮变换。相关过程如下:

(1)Static:指明文分组及每次变换的中间结果,是一个4xNb的矩阵.Nb为数据块长度除以32;

(2)字符代换:用一个简单的查表操作代替了基于矩阵乘法的复杂仿射变换。S盒是一个16 x16字节矩阵,包含8bit值所能表达的256种可能的变换;把State中每个字节的高4位作为行值,低4位作为列值,取出S盒中对应行列的元素作为新的字节输出;

(3)行变换:State的第一行保持小变,第2、3、4行分别循环左移1、2、3个字节;

(4)列变换:将状态看作伽罗华域GF(2^8)上的4位向量并被伽罗华域GF(2^8)上的一个固定逆方阵A乘,即对各个字节进行伽罗华域的乘法异或操作;Rijndael算法程序流程图如图4所示。  2、基于指纹信息的电子病历加密算法

XML是一种元语言,它采用层次化结构的、面向对象的方法描述数据对象的结构,通过XML的标记来定义电子病历的数据对象,非常适合描述含有复杂内容的病历文档,而XML具有平台无关性,适合在不同平台下进行病历数据的交换,在不同环境下进行系统开发。在临床医疗中,需要方便地实现数据交换,数据处理以及多种数据视图,XML具有数据和表现样式相分离的特点,XML文件本身可以只包含数据信息,而与数据相对应的样式文件表现其显示格式,通过两者的结合,生成包含数据和样式的文件,不同的样式文件可以得到不同的数据视图。 本文中利用XML技术首先将电子病历生成XML文档形式,Rijindael算法是对称加密算法,其加密和解密使用同一密钥,加密时先将读入的明文依次分组,用加密密钥将明文加密后写入文件中,解密时用解密密钥将文件中的密文解密后将明文写入结果文件中。其加密算法如下所示:

(1)获取电子病历的XML文档并数据化,如图5;

(2)对XML文档以128bit块进行分组,对不够块的内容予以扩展以达到块分组的要求;

(3)获取指纹模板信息并数据化,通过安全散列SHA256提取指纹信息的256bit作为初始密钥,并进行移位和查找S盒操作计算下一个密钥以此类推,总共需要14个圈密钥;

(4)用初始密钥对XML文档进行对称加密,并保存为其它或自定义格式保存。 生成的XML文档的可读性强,且XML具有平台无关性,适合在不同平台下进行数据交换。电子病历的XML文档:

<?xml version-"'1.0"?>

<Patient xmlns:xsi="http://www.w3.org/2001/XML

Schema-instance"

xmlns:xsd="http://www.w3.org/2001/X M LSchemat'>

<Name>李斯</Name>

<Sex>男 </Sex>

<A ge>26</Age>

<Nation>汉族</Nation>

<Marry>否<,Marry>

<HospitiaITiine>2012年1 2月1日</Hospitial-Time>

<ContactMethod>江苏镇江市学府路301号

</Contact Meth"d>

<Height>178</Height>

<Weighc>75</Weight>

<Pulse>120<f Pulse>

<Blrx)dPressure>2000</Blood Pressure>

<Temperature>39.3</Temperatu re>

<Symptome>腹泻、呕吐,呼吸困难,脸色苍白,四肢无力</Symptome>

<MedicaIHistory>曾患过荨麻疹,青霉索过敏

</MedicaJ History>

</Patient>

三、电子病历的指纹信息加密设计

1、电子病历加密设计

在本文中加密的密钥即为指纹信息,在指纹模板提取过程中,即使是同一手指,因为手指按压的位置、潮湿程度等都会使提取的指纹模板不一样,因此,其特征信息也不一样,本文在.net平台下实现了加密设汁并使用SQL Server 2008作为数据库,用于存储指纹模板信息。 由于对称加密使用同一密钥,因此密钥需使用同一的指纹数据,首先将指纹的模板信息数据化并存储在数据库中,并且该模板信息保存有医生的姓名和手指类型等相关信息,用指纹信息对文档进行加密。如图6所示电子病历的指纹信息加密设计流程图。

对电子病历XML文档加密,设计时需要一定的缓冲空间,并且指纹模板信息需要经过散列SHA256得到256hit初始的密钥,然后循环得到剩下的密钥。

byte[]IV=GenerateByte.s(16);

byte[]salt=GenerateBytes(16);

SymmetricAlgorithm aes=CreateRijndael (strKey,salt);

aes.IV=IV; HashAlgorithm h&sher=SHA256.CrPate();

CryptoStream cout=new CryptoStream (fout, aes.CreateEncryptor(),CryptoStreiunMode.Write), chash=new CryptoStream(Stream.Null, hasher, CryptoStreamMode.Write);

2、电子病历加密

加密前首先获取电子病历和医生的相关信息,包括姓名、手指类型及指纹信息等,同样在数据库中也应当有相应的字段对这些基本信息进行存储,然后对XML文档进行加密,如图7所示。

加密后的XML文档内容为乱码,辨识不清,如图8所示。

3、电子病历验证

若医生查看自己填写的电子病历及做出相应修改等操作则必须进行验证,验证的方式输入个人信息以及指纹为依据,只有当提取的指纹特征与数据库中的指纹模板匹配成功时才能使加密后的XML文档的解密,此时查看电子病历内容。

小知识之电子病例

电子病历(EMR,Electronic Medical Record)也叫计算机化的病案系统或称基于计算机的病人记录(CPR,Computer-Based Patient Record)。它是用电子设备(计算机、健康卡等)保存、管理、传输和重现的数字化的病人的医疗记录,取代手写纸张病历。它的内容包括纸张病历的所有信息。美国国立医学研究所将定义为:EMR是基于一个特定系统的电子化病人记录, 该系统提供用户访问完整准确的数据、警示、提示和临床决策支持系统的能力。