Rar压缩文件加密过程及破解可行性分析1.rar压缩文件简介Rar是一种目前广泛使用的文件压缩格式,它能够实现对文件的压缩、加密和分块等功能。Rar格式的压缩文件以.rar后缀结束,其他常见的文件压缩格式还有zip格式。与ZIP格式压缩文件相比,同样是无损数据压缩,RAR文件通常压缩比要高,但是压缩速度较慢。因为RAR文件头也要占据一定空间,在数据压缩余地不大时,压缩过的文件可能比原文件要大。RAR的一个主要优点是可以把文件压缩目标分割到多个文件,并且很容易从这样的分割的压缩文件解压出源文件。另外,RAR也支持紧缩格式,把所有文件压缩到同一个数据区以加大压缩比,代价是解压一个单独的文件时必须解压其前面的所有文件。RAR中也可以加入冗余的修复信息,在文件损坏但是修复信息足够完好时可以对压缩包进行修复。很多工具软件都可以用来产生Rar格式的压缩文件,但目前最常用的是Winrar,软件截图如下图1所示。图1Winrar工具截图目前Rar压缩格式的最新版本是5.30,并且不同版本产生的压缩文件的格式会有所不同。在上图1“压缩文件格式”选项中选择“RAR”表示产生的压缩文件采用Rar4.0版本压缩文件格式,而“RAR5”表示采用Rar5.0版本压缩文件格式。考虑到这两种压缩格式目前都在广泛使用,在后面的介绍中我们会对这两种压缩文件的加密过程分别进行介绍,但重点以Rar5.0压缩格式为主。2.Rar压缩文件格式Rar5.0版本的压缩文件格式如下图2所示。一个压缩文件由许多不同的块(头)组成,浅绿色部分表示可选块,紫色部分是必选块。下面分别对主要块的功能进行简要介绍。Self-extractingmodule(optional)RAR5.0signatureArchiveencryptionheader(optional)MainarchiveheaderArchivecommentserviceheader(optional)Fileheader1Serviceheaders(NTFSACL,streams,etc.)forprecedingfile(optional)……FileheaderNServiceheaders(NTFSACL,streams,etc.)forprecedingfile(optional)Recoveryrecord(optional)Endofarchiveheader图2Rar5.0压缩文件格式Self-extractingmodule:可选块,表示压缩文件是否可以自行解压缩。当在使用Winrar对文件进行压缩时,如果选择了“创建自解压格式压缩文件”选项,生成的压缩文件则是一个可执行文件,不需要专门的压缩工具来进行解压缩操作,执行该文件则会对压缩的文件进行解压缩,还原出被压缩的文件。RAR5.0signature:签名块,该块的作用是区分压缩文件的版本。对于RAR5.0版本,该块共有8个字节,内容为0x520x610x720x210x1A0x070x010x00。如果是4.0版本,则该块长度是7个字节:0x520x610x720x210x1A0x070x00。Archiveencryptionheader:加密头,该头保存解密压缩文件所需要信息,包括对用户输入密码的验证、对加密数据解密等方面的信息。下面对该头的各个字段进行具体说明。字段名称类型介绍HeaderCRC32uint32整个加密头的CRC校验值Headersizevint整个加密头的长度,以字节为单位Headertypevint用来区分不同的头部类型,该头类型为4HeaderflagsvintFlagscommonforallheaders:0x0001Extraareaispresentintheendofheader.0x0002Dataareaispresentintheendofheader.0x0004Blockswithunknowntypeandthisflagmustbeskippedwhenupdatinganarchive.0x0008Dataareaiscontinuingfrompreviousvolume.0x0010Dataareaiscontinuinginnextvolume.0x0020Blockdependsonprecedingfileblock.0x0040Preserveachildblockifhostblockismodified.Encryptionversionvint加密算法版本。目前只支持AES-256Encryptionflagsvint0x0001Passwordcheckdataispresent.KDFcount1字节PBKDF2函数的迭代次数,和版本有关Salt16字节PBKDF2函数的盐CheckValue12字节用来验证密码的有效性。Mainarchiveheader:主头,包含整个压缩文件的一些基本属性信息,各个字段的含义如下表所示。字段名称类型介绍HeaderCRC32uint32整个加密头的CRC校验值Headersizevint整个加密头的长度,以字节为单位Headertypevint用来区分不同的头部类型,该头类型为1Headerflagsvint和加密头该字段含义一样ExtraareasizevintExtraarea大小。当0x0001headerflag设置时该字段存在。Archiveflagsvint0x0001Volume.Archiveisapartofmultivolumeset.0x0002Volumenumberfieldispresent.Thisflagispresentinallvolumesexceptfirst.0x0004Solidarchive.0x0008Recoveryrecordispresent.0x0010Lockedarchive.VolumenumbervintOptionalfield,presentonlyif0x0002archiveflagissetExtraarea…Optionalareacontainingadditionalheaderfields,presentonlyif0x0001headerflagisset.Fileheader:文件头,用来具体描述被压缩的文件各方面的信息,每个被压缩的文件对应一个文件头,各字段含义如下表所示。字段名称类型介绍HeaderCRC32uint32整个加密头的CRC校验值Headersizevint整个加密头的长度,以字节为单位Headertypevint用来区分不同的头部类型,该头类型为2Headerflagsvint和加密头该字段含义一样ExtraareasizevintExtraarea大小。当0x0001headerflag设置时该字段存在。Datasizevint数据区域的大小Fileflagsvint0x0001Directoryfilesystemobject(fileheaderonly).0x0002TimefieldinUnixformatispresent.0x0004CRC32fieldispresent.0x0008Unpackedsizeisunknown.Unpackedsizevint解压文件大小Attributesvint操作系统特定的文件属性mtimeuint32FilemodificationtimeinUnixtimeformat.Optional,presentif0x0002fileflagisset.DataCRC32uint32可选项,文件的CRC校验值。Compressioninformationvint压缩算法、参数等。HostOSvint0x0000Windows.0x0001Unix.Namelengthvint文件名长度Name?字节文件名Extraarea…可选,用来记录文件相关的额外信息Dataarea压缩的文件数据文件头中的Dataarea保存的就是压缩的文件数据。如果选择了对文件内容加密,那么Dataarea中保存的就是经过压缩、加密后的数据,并且文件头中的Extraarea区域就会包含一个加密记录块,用来保存该加密文件对应的加密相关元数据信息,加密记录块的结构和前面介绍的加密头结构类似,其结构如下表所示。字段名称类型介绍Sizevint整个加密记录块的长度,以字节为单位Typevint用来区分Extraarea中不同类型的记录块,值为0x01Versionvint加密算法版本。目前只支持AES-256,值为0Flagsvint0x0001Passwordcheckdataispresent.0x0002Usetweakedchecksumsinsteadofplainchecksums.该字段值默认为0x0003KDFcount1字节PBKDF2函数的迭代次数,和版本有关Salt16字节PBKDF2函数的盐IV16字节AES-256初始化向量CheckValue12字节用来验证密码的有效性。Endofarchivemarker:结尾标记头,该头是压缩文件的结束标记。解压过程中解压工具不会读取和处理结尾标记头后面的任何信。该块的各个字段如下表所示。HeaderCRC32uint32结尾标记头的CRC校验值Headersizevint整个结尾标记头的长度,以字节为单位Headertypevint用来区分不同的头部类型,该头类型为5Headerflagsvint和加密头该字段含义一样Endofarchiveflagsvint0x0001压缩文件是卷但不是所有卷中的最后一个上面我们仅仅对压缩文件格式中一些主要的块(头)进行了描述和解释,其他的可选块由于和文件的加密过程无关因此这里不做介绍,如果读者感兴趣可以自行参考RAR5.0archiveformat。3.Rar压缩文件加密过程在采用Winrar对文件进行压缩和加密时,根据选择使用RAR“压缩文件格式”的不同以及是否选中“加密文件名”选项(如图3所示),文件的加密过程会有所不同,加密后生成的文件格式也会存在差别。在不考虑ZIP压缩格式和其他与加密过程无关的选项的情况下,使用Winrar对文件进行压缩时一共有4种不同选择:RAR压缩格式,不加密文件名;RAR5压缩格式,不加密文件名;RAR压缩格式,加密文件名;RAR5压缩格式,加密文件名。这里主要以选择“RAR5压缩格式,不加密文件名”情况为例,详细介绍其加密和解密过程,然后对其他不同选择下的加解密过程进行说明。图3与winrar加密相关的选项3.1RAR5压缩格式,不加密文件名选择“RAR5压缩格式,不加密文件名”情况下文件的加密过程如下图4所示。如果将Winrar软件看成一个功能黑盒,它接受的输入是用户提供的密码和需要加密的原文件,然后输出加密后的压缩文件。在Winrar软件内部,具体的加密过程按如下步骤进行。1)初始化操作。随机产生16字节长度的盐salt、16字节长度的初始化向量IV,设置count=32768,KeyLength=256。2)进行PBKDF2运算。以用户输入密码password和步骤1)中的salt、count、KeyLength作为PBKDF2函数的输入参数进行运算,产生32字节的AES加密密钥Key。即Key=PBKDF2(salt,password,count,KeyLength)。请自行查阅PBKDF2算法相关介绍。RAR文件加密过程文件加密记录PBKDF2计算用户密码passwordSalt(16字节)Count(32768)IV(16字节)PSWcheck(8字节)KeyLength(256)AES-256加密Key(32字节)+32轮XorHashKey(32字节)+16轮CRC计算HMAC-SHA256摘要(32字节)Xor标记主头文件头1文件内容文件头2文件内容ExtraareaDataCRC32原文件压缩DataCRC32(4字节)图4Rar5压缩