rar压缩文件加密过程及破解可行性分析v2.docx
- 文档编号:17189825
- 上传时间:2023-04-24
- 格式:DOCX
- 页数:23
- 大小:714.51KB
rar压缩文件加密过程及破解可行性分析v2.docx
《rar压缩文件加密过程及破解可行性分析v2.docx》由会员分享,可在线阅读,更多相关《rar压缩文件加密过程及破解可行性分析v2.docx(23页珍藏版)》请在冰豆网上搜索。
rar压缩文件加密过程及破解可行性分析v2
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所示。
一个压缩文件由许多不同的块(头)组成,浅绿色部分表示可选块,紫色部分是必选块。
下面分别对主要块的功能进行简要介绍。
图2Rar5.0压缩文件格式
Self-extractingmodule:
可选块,表示压缩文件是否可以自行解压缩。
当在使用Winrar对文件进行压缩时,如果选择了“创建自解压格式压缩文件”选项,生成的压缩文件则是一个可执行文件,不需要专门的压缩工具来进行解压缩操作,执行该文件则会对压缩的文件进行解压缩,还原出被压缩的文件。
RAR5.0signature:
签名块,该块的作用是区分压缩文件的版本。
对于RAR5.0版本,该块共有8个字节,内容为0x520x610x720x210x1A0x070x010x00。
如果是4.0版本,则该块长度是7个字节:
0x520x610x720x210x1A0x070x00。
Archiveencryptionheader:
加密头,该头保存解密压缩文件所需要信息,包括对用户输入密码的验证、对加密数据解密等方面的信息。
下面对该头的各个字段进行具体说明。
字段名称
类型
介绍
HeaderCRC32
uint32
整个加密头的CRC校验值
Headersize
vint
整个加密头的长度,以字节为单位
Headertype
vint
用来区分不同的头部类型,该头类型为4
Headerflags
vint
Flagscommonforallheaders:
0x0001?
Extraareaispresentintheendofheader.0x0002?
Dataareaispresentintheendofheader.0x0004?
Blockswithunknowntypeandthisflagmustbeskippedwhenupdatinganarchive.0x0008?
Dataareaiscontinuingfrompreviousvolume.0x0010?
Dataareaiscontinuinginnextvolume.0x0020?
Blockdependsonprecedingfileblock.0x0040?
Preserveachildblockifhostblockismodified.
Encryptionversion
vint
加密算法版本。
目前只支持AES-256
Encryptionflags
vint
0x0001Passwordcheckdataispresent.
KDFcount
1字节
PBKDF2函数的迭代次数,和版本有关
Salt
16字节
PBKDF2函数的盐
CheckValue
12字节
用来验证密码的有效性。
Mainarchiveheader:
主头,包含整个压缩文件的一些基本属性信息,各个字段的含义如下表所示。
字段名称
类型
介绍
HeaderCRC32
uint32
整个加密头的CRC校验值
Headersize
vint
整个加密头的长度,以字节为单位
Headertype
vint
用来区分不同的头部类型,该头类型为1
Headerflags
vint
和加密头该字段含义一样
Extraareasize
vint
Extraarea大小。
当0x0001headerflag设置时该字段存在。
Archiveflags
vint
0x0001?
Volume.Archiveisapartofmultivolumeset.0x0002?
Volumenumberfieldispresent.Thisflagispresentinallvolumesexceptfirst.0x0004?
Solidarchive.
0x0008?
Recoveryrecordispresent.
0x0010?
Lockedarchive.
Volumenumber
vint
Optionalfield,presentonlyif0x0002archiveflagisset
Extraarea
…
Optionalareacontainingadditionalheaderfields,presentonlyif0x0001headerflagisset.
Fileheader:
文件头,用来具体描述被压缩的文件各方面的信息,每个被压缩的文件对应一个文件头,各字段含义如下表所示。
字段名称
类型
介绍
HeaderCRC32
uint32
整个加密头的CRC校验值
Headersize
vint
整个加密头的长度,以字节为单位
Headertype
vint
用来区分不同的头部类型,该头类型为2
Headerflags
vint
和加密头该字段含义一样
Extraareasize
vint
Extraarea大小。
当0x0001headerflag设置时该字段存在。
Datasize
vint
数据区域的大小
Fileflags
vint
0x0001?
Directoryfilesystemobject(fileheaderonly).0x0002?
TimefieldinUnixformatispresent.
0x0004?
CRC32fieldispresent.0x0008?
Unpackedsizeisunknown.
Unpackedsize
vint
解压文件大小
Attributes
vint
操作系统特定的文件属性
mtime
uint32
FilemodificationtimeinUnixtimeformat.Optional,presentif0x0002fileflagisset.
DataCRC32
uint32
可选项,文件的CRC校验值。
Compressioninformation
vint
压缩算法、参数等。
HostOS
vint
0x0000?
Windows.0x0001?
Unix.
Namelength
vint
文件名长度
Name
?
字节
文件名
Extraarea
…
可选,用来记录文件相关的额外信息
Dataarea
压缩的文件数据
文件头中的Dataarea保存的就是压缩的文件数据。
如果选择了对文件内容加密,那么Dataarea中保存的就是经过压缩、加密后的数据,并且文件头中的Extraarea区域就会包含一个加密记录块,用来保存该加密文件对应的加密相关元数据信息,加密记录块的结构和前面介绍的加密头结构类似,其结构如下表所示。
字段名称
类型
介绍
Size
vint
整个加密记录块的长度,以字节为单位
Type
vint
用来区分Extraarea中不同类型的记录块,值为0x01
Version
vint
加密算法版本。
目前只支持AES-256,值为0
Flags
vint
0x0001Passwordcheckdataispresent.
0x0002Usetweakedchecksumsinsteadofplainchecksums.
该字段值默认为0x0003
KDFcount
1字节
PBKDF2函数的迭代次数,和版本有关
Salt
16字节
PBKDF2函数的盐
IV
16字节
AES-256初始化向量
CheckValue
12字节
用来验证密码的有效性。
Endofarchivemarker:
结尾标记头,该头是压缩文件的结束标记。
解压过程中解压工具不会读取和处理结尾标记头后面的任何信。
该块的各个字段如下表所示。
HeaderCRC32
uint32
结尾标记头的CRC校验值
Headersize
vint
整个结尾标记头的长度,以字节为单位
Headertype
vint
用来区分不同的头部类型,该头类型为5
Headerflags
vint
和加密头该字段含义一样
Endofarchiveflags
vint
0x0001压缩文件是卷但不是所有卷中的最后一个
上面我们仅仅对压缩文件格式中一些主要的块(头)进行了描述和解释,其他的可选块由于和文件的加密过程无关因此这里不做介绍,如果读者感兴趣可以自行参考RAR5.0archiveformat。
3.Rar压缩文件加密过程
在采用Winrar对文件进行压缩和加密时,根据选择使用RAR“压缩文件格式”的不同以及是否选中“加密文件名”选项(如图3所示),文件的加密过程会有所不同,加密后生成的文件格式也会存在差别。
在不考虑ZIP压缩格式和其他与加密过程无关的选项的情况下,使用Winrar对文件进行压缩时一共有4种不同选择:
RAR压缩格式,不加密文件名;RAR5压缩格式,不加密文件名;RAR压缩格式,加密文件名;RAR5压缩格式,加密文件名。
这里主要以选择“RAR5压缩格式,不加密文件名”情况为例,详细介绍其加密和解密过程,然后对其他不同选择下的加解密过程进行说明。
图3与winrar加密相关的选项
3.1 RAR5压缩格式,不加密文件名
选择“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算法相关介绍。
图4Rar5压缩格式下文件内容的加密过程
3)产生HashKey。
在步骤2)中的PBKDF2算法计算结果的基础上,额外增加16次迭代计算,产生32字节长度的HashKey,该密钥用于在后期产生文件内容的校验值。
4)产生PSWcheck。
在步骤3)HashKey的基础上,额外增加16次迭代计算,产生32字节长度的PswCheckValue,对PswCheckValue进行类似异或操作1后赋值给8字节长度的PSWcheck,该值随加密文件一起保存,作用是在解密时实现对用户密码的验证。
注1:
【PSWcheck[i]=PswCheckValue[i]^PswCheckValue[i+8]^……】
5)计算文件校验值。
对文件进行CRC计算,得到4字节长度的CRC校验值value。
将value作为HMAC-SHA256函数的“消息”参数,HashKey作为HMAC-SHA256函数的“密钥”参数,产生32字节长度的消息摘要digest,即digest=HMAC-SHA256(HashKey,value)。
然后对digest进行类似异或操作2,得到4字节长度的DataCRC32校验值。
DataCRC32校验值随加密文件一起保存,既能实现对用户密码的验证,也能实现对文件内容的校验。
文件内容校验也可以采用其他校验方式,但默认情况下是CRC32校验。
注2:
【for(intI=0;I<32;I++)CRC32^=digest[I]<<((I&3)*8)】
6)对文件内容进行压缩。
7)压缩后内容加密。
以IV为AES-256初始化向量、Key为加密密钥,对步骤6)中压缩后的文件内容进行AES-256加密,得到加密后的内容。
8)按照1)—7)相同的步骤对所有文件进行压缩和加密,并按照图2所示文件格式进行保存从而得到压缩后的文件。
在经过压缩和加密过程后生成的压缩文件中,需要保存salt、count、IV、PSWcheck和DataCRC32值。
其中DataCRC32保存在文件头,salt、count、IV、PSWcheck保存在文件头extradata中的文件加密记录中,在解密阶段需要读取这些域对密码进行验证。
解密过程基本上是文件加密过程的逆过程,对加密压缩文件的解密过程如下。
1)读取加密压缩文件的标记和主头部分,确定RAR版本。
2)读取文件头。
读取第一个文件对应的文件头,获取Salt、Count、PSWcheck、IV和DataCRC32值。
3)进行PBKDF2计算。
以Salt、Count、用户密码password和KeyLength为参数进行PBKDF2计算,得到文件解密密钥Key、PSWcheck和HashKey。
该步骤和加密过程中2)、3)、4)步骤相同,详见加密过程。
4)用户密码验证。
将步骤3)中产生的PSWcheck值和步骤1)中从文件读取的PSWcheck值进行比较,如果相同,则说明验证通过,继续5);不同则表明用户输入密码错误,用户重新输入密码转3),否则结束。
5)文件解密。
根据初始化向量IV和3)中产生的解密密钥Key,对文件1加密后的内容进行解密,得到压缩后的文件内容。
6)文件解压。
对5)中得到的文件内容进行解压缩,得到文件1原始内容,即原文件。
7)对原文件进行CRC计算,将计算得到的校验值作为HMAC-SHA256的输入消息,HashKey作为密钥,产生消息摘要。
然后对消息摘要进行类似异或运算,得到文件的校验值CRC32。
详见加密过程步骤5)。
8)将7)中计算得到的CRC32值和步骤2)中读取的DataCRC32进行比较,相同则说明用户密码正确并且文件没有损坏,转9);否则说明文件损坏,退出。
9)依次对所有文件重复进行2)—8),直到所有文件均被解压。
以上步骤中对压缩文件中各个域的读取参考第2节中对文件格式的介绍。
3.2 RAR5压缩格式,加密文件名
图5压缩文件在不加密文件名下的解压缩操作
在压缩过程中,如果不选择“加密文件名”选项,这样产生的压缩文件用户即使不知道压缩文件的密码,也可以查看压缩文件中的包含的文件名称、文件大小、修改时间等信息,如图5所示。
显然,有时候我们对文件的保密要求比较高,并不想让非授权用户获得这些信息,因此就需要对这些文件元数据进行加密。
由于这些信息保存在压缩文件的主头、文件头等元数据块中,因此要加密文件名等相关信息,就需要对这些部分元数据信息进行加密。
事实上,对这些信息的加密是通过在压缩文件格式中实现一个加密头,然后再利用加密头加密这部分元数据信息达到的。
前面介绍过加密头是可选的,加密头的作用正在于此,用来实现对文件名等信息的加密。
因此,对于“加密文件名”情况下,对文件的加密过程分为两个阶段,第一阶段是利用文件头中的加密记录实现对文件内容的加密,然后利用加密头实现对主头、文件头等元数据块的加密,下图6简要显示了这两阶段加密过程。
图6文件的两阶段加密过程
对于利用文件头中的加密记录去加密数据部分,该过程和前面的介绍不加密文件名选择下的过程是一样的,这里不再赘述,这里主要对加密头加密元数据块的过程进行介绍。
图7显示了加密头对主头、文件头等元数据块的加密过程。
图7Rar5压缩格式下元数据块加密过程
从上图7可以看出,利用加密头对主头、文件头等部分的加密和前面介绍的对数据部分的加密过程类似,但又有相应的简化。
首先通过PBKDF2运算得到加密密钥,利用该加密密钥去加密主头、文件头等元数据块,然后将Salt、Count、PSWcheck、IV保存在加密头中用于解压缩时对用户密码进行验证。
事实上,IV并不是保存在加密头中,而是保存在元数据块之前,每一个元数据块对应一个IV。
这里需要特别指出的是,对元数据块和数据部分加密都用到了PBKDF2算法,需要用户提供用户密码,但它们实际上采用的是同一个密码,因此在采用压缩工具对文件进行压缩过程中,只需要提供一个用户密码即可。
并且,默认情况下加密头和加密记录中保存的Salt、Count值都一样。
因此在解压缩时,只在解密元数据块时进行PBKDF2计算对用户密码进行验证,在解密文件数据部分时不需要再进行PBKDF2计算来验证密码,并且直接使用解密元数据块过程中PBKDF2算法产生的密钥来解密文件的文件内容,但要注意的是初始化向量IV发生了改变。
3.3 RAR压缩格式,不加密文件名
在采用RAR压缩格式,不加密文件名的选择下,文件的压缩加密过程如下图8所示。
图8“RAR压缩格式+不加密文件名”模式下文件的压缩加密过程
在对文件进行压缩加密的过程中,首先将Salt和用户密码拼接,然后对拼接后的结果进行262144次循环的SHA-1计算(实际上在262144次年循环中,每次循环包含两个SHA-1计算),产生加密密钥Key和初始化向量IV。
最后对压缩后的文件内容进行AES-128加密,得到加密后内容。
同时,为了便于解压缩阶段能够对用户密码进行验证,还需要对原文件内容进行CRC计算,并将CRC校验值DataCRC32保存在文件头中。
在解压缩阶段,以同样的方式得到加密密钥Key和初始化向量IV后,对加密的文件内容进行AES-128解密操作,然后对解密的文件内容解压缩,还原出原文件内容。
最后对原文件内容进行CRC计算,如果计算得到的校验值和文件头中保存的DataCRC32校验值相同,则表明用户提供的密码正确,否则表明用户密码错误或者文件内容损坏。
从上面的过程可以看出,RAR压缩格式下加密过程与RAR5压缩格式下加密过程存在较大的差别。
1.前者采用262144次SHA-1计算作为密钥导出函数,而后者采用PBKDF2函数(count=32768)作为密钥导出函数。
2.前者采用AES-128加密算法对文件内容加密,后者采用AES-256加密算法对文件内容加密。
3.前者只有对文件内容进行解密后通过CRC校验值比对才能判断用户密码是否正确或者文件内容损坏,但不能够对二者进行区分,后者能够在早期通过PBKDF2计算产生的PSWcheck值进行比较来判断,在不相同的情况下能够区分出到底是用户密码错误还是文件内容损坏。
3.4 RAR压缩格式,加密文件名
在压缩过程中选择RAR压缩格式,加密文件名,相比于不加密文件名,只需要在后者的基础上增加对文件头等元数据块的加密操作。
对文件头的加密过程和对前面介绍的文件内容的加密过程一样,如图9所示,这里不做过多的介绍。
在解压缩阶段,需要首先解密出文件头等元数据块信息,需要进行262144次SHA-1计算产生解密文件头等需要用到的解密密钥Key和初始化向量IV,然后对元数据块的信息进行AES-128解密操作。
如果用户密码正确,则可以通过文件头提供的信息进一步对文件内容进行解密,否则无法正确解析文件头等元数据块,并且文件头部的CRC校验无法通过,解压缩失败。
图9“RAR压缩格式+加密文件名”模式下文件的压缩加密过程
4.结论
本文首先针对winrar压缩软件使用过程中4中不同的压缩选择,即“RAR5压缩格式,不加密文件名”、“RAR5压缩格式,加密文件名”、“RAR压缩格式,不加密文件名”、“RAR压缩格式,加密文件名”,介绍了RAR压缩加密文件的加解密过程。
随后分析了不同选择下密码验证过程的复杂性,发现对于普通计算机采用字典方式去破解RAR压缩文件是不可行的,而是否能够利用FPGA去实施字典破解还需要进一步的研究和分析。
Rar3文件格式
压缩文件包含多个可变长度的块,块的顺序可以改变,但第一个块和第二个块分别是marker块和压缩文件头块。
每个块都以如下域开始:
HEAD_CRC:
2B,块的CRC校验码
HEAD_TYPE:
1B,块类型
HEAD_FLAGS:
2B,块标志位
HEAD_SIZE:
2B,块大小
ADD_SIZE:
4B,可选域,额外的块大小,仅在(HEAD_FLAGS&0x8000)!
=0时才存在。
如果ADD_SIZE不存在,块大小就是HEAD_SIZE,否则,块大小时HEAD_SIZE+ADD_SIZE。
每个块的HEAD_FLAGS的如下位含义都一样:
0x4000:
如果设置,则旧版本RAR会忽略该块,并且当压缩文件更新时删除该块。
如果不设置,当压缩文件更新时,该块被复制到新的压缩文件。
0x8000:
如果设置,ADD_SIZE域存在。
块类型包含如下:
HEAD_TYPE=0x72 marker块
HEAD_TYPE=0x73 压缩文件头块
HEAD_TYPE=0x74 文件头块
HEAD_TYPE=0x75 旧版本注释头块
HEAD_TYPE=0x76 旧版本认证信息块
HEAD_TYPE=0x77 旧版本子块
HEAD_TYPE=0x78 旧版本恢复记录块
HEAD_TYPE=0x79 旧版本认证信息块
HEAD_TYPE=0x7a 子块
注释块不会单独存在,而是在其他块中使用。
按照如下流程处理压缩文件:
1.读并校验marker块;
2.读压缩文件头
3.读或者跳过HEAD_SIZE-sizeof(MAIN_HEAD)字节
4.如果
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- rar 压缩文件 加密 过程 破解 可行性 分析 v2