rar压缩文件加密过程及破解可行性分析v2.docx

上传人:b****2 文档编号:2043751 上传时间:2023-05-02 格式:DOCX 页数:23 大小:714.51KB
下载 相关 举报
rar压缩文件加密过程及破解可行性分析v2.docx_第1页
第1页 / 共23页
rar压缩文件加密过程及破解可行性分析v2.docx_第2页
第2页 / 共23页
rar压缩文件加密过程及破解可行性分析v2.docx_第3页
第3页 / 共23页
rar压缩文件加密过程及破解可行性分析v2.docx_第4页
第4页 / 共23页
rar压缩文件加密过程及破解可行性分析v2.docx_第5页
第5页 / 共23页
rar压缩文件加密过程及破解可行性分析v2.docx_第6页
第6页 / 共23页
rar压缩文件加密过程及破解可行性分析v2.docx_第7页
第7页 / 共23页
rar压缩文件加密过程及破解可行性分析v2.docx_第8页
第8页 / 共23页
rar压缩文件加密过程及破解可行性分析v2.docx_第9页
第9页 / 共23页
rar压缩文件加密过程及破解可行性分析v2.docx_第10页
第10页 / 共23页
rar压缩文件加密过程及破解可行性分析v2.docx_第11页
第11页 / 共23页
rar压缩文件加密过程及破解可行性分析v2.docx_第12页
第12页 / 共23页
rar压缩文件加密过程及破解可行性分析v2.docx_第13页
第13页 / 共23页
rar压缩文件加密过程及破解可行性分析v2.docx_第14页
第14页 / 共23页
rar压缩文件加密过程及破解可行性分析v2.docx_第15页
第15页 / 共23页
rar压缩文件加密过程及破解可行性分析v2.docx_第16页
第16页 / 共23页
rar压缩文件加密过程及破解可行性分析v2.docx_第17页
第17页 / 共23页
rar压缩文件加密过程及破解可行性分析v2.docx_第18页
第18页 / 共23页
rar压缩文件加密过程及破解可行性分析v2.docx_第19页
第19页 / 共23页
rar压缩文件加密过程及破解可行性分析v2.docx_第20页
第20页 / 共23页
亲,该文档总共23页,到这儿已超出免费预览范围,如果喜欢就下载吧!
下载资源
资源描述

rar压缩文件加密过程及破解可行性分析v2.docx

《rar压缩文件加密过程及破解可行性分析v2.docx》由会员分享,可在线阅读,更多相关《rar压缩文件加密过程及破解可行性分析v2.docx(23页珍藏版)》请在冰点文库上搜索。

rar压缩文件加密过程及破解可行性分析v2.docx

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.如果

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 法律文书 > 调解书

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2