近些年来,随着信息化和宽带网络在我们日常生活中的迅速发展,图像数据开始在因特网上日益流行。由于某些图像数据具有非常特殊的安全保密性。即发送方与接收方都不希望在网络上传输的图像数据被未经授权者所浏览或处理,因此图像数据的安全性显得极为重要。
目前,基于位运算的图像加密技术的加密算法主要有流密码加密和分组密码加密两种。我们将对这两种加密体制进行分析与比较,并将其应用于加密BMP格式的彩色图像,最后的出结论只有正确选择密码的多样性和长度,才能取得良好的图像加密效果。
一、利用位运算加密图像文件的基本思想
位运算加密图像文件的思想就是利用某种方法得到一系列的随机或伪随机的以字节为单位的数据,然后把他们和一幅图像的数据逐字节进行特定的位运算,以改变原有图像的数据信息。这样处理后的图像显示出来的效果将是“面目全非”,掩盖了原来的图像信息,达到图像文件加密的目地。此外,加密的图像文件应该在一定的条件下可以恢复出原来的图像,所以设计的加密算法中用于加密的随机或伪随机的以字节为单位的数据应具有可再生性,加密的位运算应具有可逆性。这时,若发送端与接收端采用同样的随机序列发生器,那么序列的取值只取决于种子,因此发送端只需传递种子,在接收端用同样的种子产生的序列对加密周像进行与发送端加密同样的异或运算,就能得到解密后的图像。
二、利用位运算加密图像文件的方法
基于位运算的加密算法主要有2种方法,一种是采用流密码加密,即生成与图像数据相同大小的伪随机序列进行加密;这种方法由于伪随机序列的随机性大并且无规律,因而加密效果均
匀、理想。但由于参与运算的数据量大,因此加密速度受到限制,实时性差;另一种是采用分组密码加密,下面将分别介绍这两种加密方法。
密码学以研究秘密通信为目的,以防止第三者对信息的截取。在密码学中,需要变换的原消息称为明文消息,明文经过变换成为另一种隐蔽的形式,称为密文消息,完成交换的过程称作加密,其逆过程(即由密文恢复出明文的过程)称作解密。对明文进行加密时所采用的一组规则称作加密算法。对密文进行解密时所采用的一组规则称作解密算法。加密和解密操作通常在密钥的控制下进行,并有加密密钥和解密密钥之分。因为数据以密文的形式存储在计算机文件中,或在数据通信网络中传输,因此即使数据被末授权者非法窃取,或因系统故障和操作人员误操作而造成数据泄露,未授权者也不能理解它的真正含义,从而达到数据保密的目的。同样,未授权者也不能伪造合理的密文,因而不能篡改数据,从而达到确保数据真实性的目的。
基于密钥的加密算法通常有两类:对称加密算法和公开密钥加密算法。
对称加密算法有时又叫传统加密算法,就是加密密钥能够从解密密钥中推算出来,反过来也成立。在大多数对称加密算法中,加密和解密密钥是相同的。这些加密算法也叫秘密密钥算法或单密钥算法,它要求发送者和接收者在安全通信之前,商定一个密钥。对称加密算法的安全性依赖于密钥,泄漏密钥就意味着任何人都能对消息进行加密和解密。只要通信需要保密,密钥就必须保密。
然而,对称加密算法又可分为两类。一类加密算法只对明文中的单个比特(有时对字节)运算的算法称为序列算法或序列密码(流密码)。另一类加密算法算法是对明文的一组比特亚行运算,这些比特组称为分组,相应的算法称为分组算法或分组密码。现代计算机密码算法的典型分组长度为64比特,这个长度大到足以防止分析破译,但又小到足以方便使用(在计算机出现前,算法普遍地每次只对明文的一个字符运算,可认为是序列密码对字符序列的运算)。
(1)流密码
流密码是密码学中最重要的加密方式之一。流密码的优点是错误扩展小,速度快,利于同步,安全程度高。流密码的保密性完全取决于密钥的随机性。如果密钥是真正的随机数,则这种体制在理论上就是不可破译的。但这种方式所需的密钥量大得惊人,在实际中是不可行的。因此,目前一般采用伪随机序列来代替随机序列作为密钥序列,也就是序列存在着一定的循环周期。这样序列周期的长短就成为保密性的关键。如果周期足够长,就会有比较好的保密性。现在周期小于1010的序列很少被采用,周期长达1050的序列也并不少见。
(2)分组密码
分组密码即对固定长度的一组明文进行加密的算法。它将明文按一定的位长分组。明文组和密钥组的全部经过加密运算得到密文组。解密时密文组和密钥组经过解密运算(加密运算的逆运算),还原成明文组。
分组密码的特点是:密钥可以在一定时间内固定,不必每次变换,因此给密钥配发带来了方便。但是,由于分组密码存在着密文传输错误在明文中扩散的问题,因此在信道质量较差的情况下无法使用。
分组密码其中最著名的两个分组密码即DES(Data EneryptionStandanl)数据加密标准和IDEA(lntemational Data Encryption Algorithm)国际数据加密算法。
设计分组密码算法的核心技术是:在相信复杂函数可以通过简单函数迭代若干圈得到的原则下,利用简单圈函数及对合等运算,充分利用非线性运算。DES加密算法采用美国国家安全局精心设计的8个S-Box和P-置换,经过16圈迭代,最终产生64比特密文,每圈迭代使用的48比特子密钥是南原始的56比特产生的。
DES加密算法输入的是64比特的明文,在64比特密钥的控制下产生64比特的密文;反之输入64比特的密文,输出64比特的明文。64比特的密钥中含有8个比特的奇偶校验位,所以实际
有效密钥长度为56比特。
DES加密算法加密时把明文以64bit为单位分成块,而后用密钥把每一块明文转化成同样64bit的密文块。DES提供72,000,000,000.000,000个密钥。用每微秒可进行一次DES加密的机器来破译密码需两千年。
(3)流密码与分组密码的区别
流密码:将明文M分割成字符串和比特串:M=m0,m1,…,mj,…,并逐字符或逐位进行加密:Ek(M)=EkO(m0),Ek1(m1),....,Ekj(mj),...,其中:密钥流是K=k0,k1,...,kj,…。
分组密码:将明文消息编码表示后的数字(通常是0与1)序列x1,x2,…划分成长为m的组x=(x1,x2,…,xm)。各组(长为m的向量)分别在密钥k=(k1,k2,...,kt)的控制下变换成等长的输出数字序列y=(y1,y2,…,yn)(长为n的向量)。
分组密码是现代密码学中的一个重要研究分支,其诞生和发展有着广泛的实用背景和重要的理论价值。分组密码有其自身的优点。首先,分组密码容易被标准化,因为在今天的数据网络通倍中,信息通常是被成块地处理和传输的。其次,使用分组密码容易实现同步,因为一个密文组的传输错误不会影响其他组,丢失一个明密文组不会对其随后的组的解密的正确性产生影响。分组密码的主要缺陷表现在两个方面,一是分组加密不能隐蔽数据模式,即相同的密文组蕴含着相同的明文组;二是分组加密不能抵抗组的重放、嵌入和删除等攻击。但分组密码的上述缺陷可以通过在加密处理中引入少量的记忆来克服。例如可以通过密码分组链接(CBC)模型来克服这些缺陷。
a、有时分组密码和序列密码的界限并不是十分清楚,例如:一次对一个字符进行明文交换的密码系统,即可以视作对字符流进行操作的流密码,也可以视为一次对8位长的位组进行明文交换的分组密码。通常.我们将短周期的流密码视为分组密码,而把长周期的流密码仍然视为流密码。
b、从另外一种观点来看,他们之间又有明显的区别。流密码确定一个内部记忆装置,即用一个依赖于种子密钥I以及流密码在时刻j的内部状态Oj的函数f生成密钥流,即f(I,Oj)=Kj,然后将明文序列的第i个字符mj转换为密文序列的第i个字符Cj:Cj=Ekj(mj)与此相反,分组密码确定一个无记忆装置,他在密钥K的参与下,将成组明文信息M=(m0,…,mL-1)转换为成组密文信息C=(C0,…,CN-1)。
c、记忆性。由于流密码中密钥流元素的产生由其内部状态和密钥决定,流密码中明文的重复部分是用密钥流的不同部分加密的,而分组密码中相同的明文组对应相同的密文组,流密码似乎比分组密码更安全。
三、基于位运算的图像加密算法在BMP图像中的运用
位图文件(Bitmap-File.BMP)格式是Windows采用的图像文件存储格式,在Wiridow8环境下运行的所有图像处理软件都支持这种格式。Windows 3.0以前的BMP位图文件格式与显示设备有关,因此把它称为设备相关位图(deVice-dependent bitmap,DDB)文件格式。Windows 3.0以后的BMP位图文件格式与显示设备无关,因此把这种BMP位图文件格式称为设备无关位图(device-indepen-dent bitmap,DIB)格式,目的是为了让Windows能够在任何类型的显示设备上显示BMP位图文件。BMP位图文件默认的文件扩展名是BMP或bmp。
位图文件可看成由4个部分组成:位图文件头(bitmap-fileheader)、位图信息头(bitmap-information header)、彩色表(colortable)和定义位图的字节阵列,它们的名称和符号如表1所示。
基于位运算的加密算法思想在数字网像文件中存储的主要是图像的颜色和灰度信息。常用的BMP格式图像文件由表头、调色板和图像数据3部分组成。表头长度固定为54个字节,其中保
留了有关图像的参数信息,如:使用的颜色、图像尺寸、文件大小、压缩标志等。调色板代表BMP图像的颜色信息,他将图像象素的数值映射为相应的颜色。图像数据区存储着所有象素的数值,但BMP格式中每个象素的字节数是不同的。比如8位、24位的BMP图像分别代表每个象素包含1个字节或3个字节。
并且,分组密码长度和密码多样性的选取不同,对加密BMF彩色图像的影响程度也不同,在分组密码长度与BMP图像的长宽尺寸成倍数关系的情况下,BMF图像文件加密效果会呈现极其不理想的规律和现象。
小知识之位运算
程序中的所有数在计算机内存中都是以二进制的形式储存的。位运算说穿了,就是直接对整数在内存中的二进制位进行操作。比如,and运算本来是一个逻辑运算符,但整数与整数之间也可以进行and运算。举个例子,6的二进制是110,11的二进制是1011,那么6 and 11的结果就是2,它是二进制对应位进行逻辑运算的结果(0表示False,1表示True,空位都当0处理)。