为了正常的体验网站,请在浏览器设置里面开启Javascript功能!

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

2019-02-26 27页 doc 101KB 45阅读

用户头像

is_320420

暂无简介

举报
rar压缩文件加密过程及破解可行性分析v2Rar压缩文件加密过程及破解可行性分析 1. rar压缩文件简介 Rar是一种目前广泛使用的文件压缩格式,它能够实现对文件的压缩、加密和分块等功能。 Rar格式的压缩文件以.rar后缀结束,其他常见的文件压缩格式还有zip格式。与ZIP格式压缩文件相比,同样是无损数据压缩,RAR文件通常压缩比要高,但是压缩速度较慢。因为RAR文件头也要占据一定空间,在数据压缩余地不大时,压缩过的文件可能比原文件要大。RAR的一个主要优点是可以把文件压缩目标分割到多个文件,并且很容易从这样的分割的压缩文件解压出源文件。另外,RAR也支持紧缩格式...
rar压缩文件加密过程及破解可行性分析v2
Rar压缩文件加密过程及破解可行性分析 1. rar压缩文件简介 Rar是一种目前广泛使用的文件压缩格式,它能够实现对文件的压缩、加密和分块等功能。 Rar格式的压缩文件以.rar后缀结束,其他常见的文件压缩格式还有zip格式。与ZIP格式压缩文件相比,同样是无损数据压缩,RAR文件通常压缩比要高,但是压缩速度较慢。因为RAR文件头也要占据一定空间,在数据压缩余地不大时,压缩过的文件可能比原文件要大。RAR的一个主要优点是可以把文件压缩目标分割到多个文件,并且很容易从这样的分割的压缩文件解压出源文件。另外,RAR也支持紧缩格式,把所有文件压缩到同一个数据区以加大压缩比,代价是解压一个单独的文件时必须解压其前面的所有文件。RAR中也可以加入冗余的修复信息,在文件损坏但是修复信息足够完好时可以对压缩包进行修复。 很多工具软件都可以用来产生Rar格式的压缩文件,但目前最常用的是Winrar,软件截图如下图1所示。 图1 Winrar工具截图 目前Rar压缩格式的最新版本是5.30,并且不同版本产生的压缩文件的格式会有所不同。在上图1“压缩文件格式”选项中选择“RAR”表示产生的压缩文件采用Rar 4.0版本压缩文件格式,而“RAR5”表示采用Rar 5.0版本压缩文件格式。考虑到这两种压缩格式目前都在广泛使用,在后面的介绍中我们会对这两种压缩文件的加密过程分别进行介绍,但重点以Rar5.0压缩格式为主。 2. Rar压缩文件格式 Rar 5.0版本的压缩文件格式如下图2所示。一个压缩文件由许多不同的块(头)组成,浅绿色部分表示可选块,紫色部分是必选块。下面分别对主要块的功能进行简要介绍。 图2 Rar 5.0压缩文件格式 Self-extracting module :可选块,表示压缩文件是否可以自行解压缩。当在使用Winrar对文件进行压缩时,如果选择了“创建自解压格式压缩文件”选项,生成的压缩文件则是一个可执行文件,不需要专门的压缩工具来进行解压缩操作,执行该文件则会对压缩的文件进行解压缩,还原出被压缩的文件。 RAR 5.0 signature:签名块,该块的作用是区分压缩文件的版本。对于RAR 5.0版本,该块共有8个字节,内容为0x52 0x61 0x72 0x21 0x1A 0x07 0x01 0x00。如果是4.0版本,则该块长度是7个字节:0x52 0x61 0x72 0x21 0x1A 0x07 0x00。 Archive encryption header:加密头,该头保存解密压缩文件所需要信息,包括对用户输入密码的验证、对加密数据解密等方面的信息。下面对该头的各个字段进行具体说明。 字段名称 类型 介绍 Header CRC32 uint32 整个加密头的CRC校验值 Header size vint 整个加密头的长度,以字节为单位 Header type vint 用来区分不同的头部类型,该头类型为4 Header flags vint Flags common for all headers: 0x0001 ? Extra area is present in the end of header. 0x0002 ? Data area is present in the end of header. 0x0004 ? Blocks with unknown type and this flag must be skipped when updating an archive. 0x0008 ? Data area is continuing from previous volume. 0x0010 ? Data area is continuing in next volume. 0x0020 ? Block depends on preceding file block. 0x0040 ? Preserve a child block if host block is modified. Encryption version vint 加密算法版本。目前只支持AES-256 Encryption flags vint 0x0001 Password check data is present. KDF count 1字节 PBKDF2函数的迭代次数,和版本有关 Salt 16字节 PBKDF2函数的盐 Check Value 12字节 用来验证密码的有效性。       Main archive header:主头,包含整个压缩文件的一些基本属性信息,各个字段的含义如下表所示。 字段名称 类型 介绍 Header CRC32 uint32 整个加密头的CRC校验值 Header size vint 整个加密头的长度,以字节为单位 Header type vint 用来区分不同的头部类型,该头类型为1 Header flags vint 和加密头该字段含义一样 Extra area size vint Extra area大小。当0x0001 header flag设置时该字段存在。 Archive flags vint 0x0001 ? Volume. Archive is a part of multivolume set.0x0002 ? Volume number field is present. This flag is present in all volumes except first.0x0004 ? Solid archive. 0x0008 ? Recovery record is present. 0x0010 ? Locked archive. Volume number vint Optional field, present only if 0x0002 archive flag is set Extra area … Optional area containing additional header fields, present only if 0x0001 header flag is set.       File header:文件头,用来具体描述被压缩的文件各方面的信息,每个被压缩的文件对应一个文件头,各字段含义如下表所示。 字段名称 类型 介绍 Header CRC32 uint32 整个加密头的CRC校验值 Header size vint 整个加密头的长度,以字节为单位 Header type vint 用来区分不同的头部类型,该头类型为2 Header flags vint 和加密头该字段含义一样 Extra area size vint Extra area大小。当0x0001 header flag设置时该字段存在。 Data size vint 数据区域的大小 File flags vint 0x0001 ? Directory file system object (file header only).0x0002 ? Time field in Unix format is present. 0x0004 ? CRC32 field is present.0x0008 ? Unpacked size is unknown. Unpacked size vint 解压文件大小 Attributes vint 操作系统特定的文件属性 mtime uint32 File modification time in Unix time format. Optional, present if 0x0002 file flag is set. Data CRC32 uint32 可选项,文件的CRC校验值。 Compression information vint 压缩算法、参数等。 Host OS vint 0x0000 ? Windows.0x0001 ? Unix. Name length vint 文件名长度 Name ?字节 文件名 Extra area … 可选,用来文件相关的额外信息 Data area   压缩的文件数据       文件头中的Data area保存的就是压缩的文件数据。如果选择了对文件内容加密,那么Data area中保存的就是经过压缩、加密后的数据,并且文件头中的Extra area区域就会包含一个加密记录块,用来保存该加密文件对应的加密相关元数据信息,加密记录块的结构和前面介绍的加密头结构类似,其结构如下表所示。 字段名称 类型 介绍 Size vint 整个加密记录块的长度,以字节为单位 Type vint 用来区分Extra area中不同类型的记录块,值为0x01 Version vint 加密算法版本。目前只支持AES-256,值为0 Flags vint 0x0001 Password check data is present. 0x0002 Use tweaked checksums instead of plain checksums. 该字段值默认为0x0003 KDF count 1字节 PBKDF2函数的迭代次数,和版本有关 Salt 16字节 PBKDF2函数的盐 IV 16字节 AES-256初始化向量 Check Value 12字节 用来验证密码的有效性。       End of archive marker:结尾标记头,该头是压缩文件的结束标记。解压过程中解压工具不会读取和处理结尾标记头后面的任何信。该块的各个字段如下表所示。 Header CRC32 uint32 结尾标记头的CRC校验值 Header size vint 整个结尾标记头的长度,以字节为单位 Header type vint 用来区分不同的头部类型,该头类型为5 Header flags vint 和加密头该字段含义一样 End of archive flags vint 0x0001 压缩文件是卷但不是所有卷中的最后一个       上面我们仅仅对压缩文件格式中一些主要的块(头)进行了描述和解释,其他的可选块由于和文件的加密过程无关因此这里不做介绍,如果读者感兴趣可以自行参考RAR 5.0 archive format。 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字节长度的Data CRC32校验值。Data CRC32校验值随加密文件一起保存,既能实现对用户密码的验证,也能实现对文件内容的校验。文件内容校验也可以采用其他校验方式,但默认情况下是CRC32校验。 注2:【for (int I=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和Data CRC32值。其中Data CRC32保存在文件头,salt、count、IV、PSWcheck保存在文件头extra data中的文件加密记录中,在解密阶段需要读取这些域对密码进行验证。 解密过程基本上是文件加密过程的逆过程,对加密压缩文件的解密过程如下。 1) 读取加密压缩文件的标记和主头部分,确定RAR版本。 2) 读取文件头。读取第一个文件对应的文件头,获取Salt、Count、PSWcheck、IV和Data CRC32值。 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)中读取的Data CRC32进行比较,相同则说明用户密码正确并且文件没有损坏,转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校验值Data CRC32保存在文件头中。 在解压缩阶段,以同样的方式得到加密密钥Key和初始化向量IV后,对加密的文件内容进行AES-128解密操作,然后对解密的文件内容解压缩,还原出原文件内容。最后对原文件内容进行CRC计算,如果计算得到的校验值和文件头中保存的Data CRC32校验值相同,则表明用户提供的密码正确,否则表明用户密码错误或者文件内容损坏。 从上面的过程可以看出,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. 如果到了压缩文件尾,就中止处理,否则,读7字节数据到HEAD_CRC,HEAD_TYPE,HEAD_FLAGS,HEAD_SIZE。 5. 分析HEAD_TYPE, 如果HEAD_TYPE=0x74,读文件头(前面7B已经读取),读或者跳过HEAD_SIZE-sizeof(FILE_HEAD)字节。 如果(HEAD_FLAGS&0x100),读或者跳过HIGH_PACK_SIZE*0x100000000+PACK_SIZE字节 否则,读或者跳过PACK_SIZE字节 否则,读相应的HEAD_TYPE块:读HEAD_SIZE-7字节 如果 (HEAD_FLAGS & 0x8000),读ADD_SIZE字节。 6. 返回第4步 ================================================================== 块格式 ================================================================== Marker块(MARK_HEAD) HEAD_CRC:    2B,0x6152 HEAD_TYPE:    1B,0x72 HEAD_FLAGS:    2B,0x1a21 HEAD_SIZE:    2B,0x0007 实际上,marker块的内容是确定的:0x52 0x61 0x72 0x21 0x1a 0x07 0x00 压缩文件头(MAIN_HEAD) HEAD_CRC:    2B,HEAD_TYPE到RESERVED2的CRC HEAD_TYPE:    1B,0x73 HEAD_FLAGS:    2B 0x0001 - Volume attribute (archive volume) 0x0002 - 压缩文件注释块存在,RAR3.x使用独立的注释块,不会设置该标志位 0x0004 - Archive lock attribute 0x0008 - solid attribute(solid archive) 0x0010 - New volume naming scheme (‘volname.partN.rar’) 0x0020 - 认证信息存在,RAR3.x不使用该标志位 0x0040 - 恢复记录存在 0x0080 - 块头被加密 0x0100 - 第一卷(只在RAR3.0及以后的版本中出现) 其他位保留 HEAD_SIZE:    2B,压缩文件头大小,包含注释 RESERVED1:    2B,保留 RESERVED2:    4B,保留 文件头(HEAD_FILE,压缩文件中的文件) HEAD_CRC:    2B,HEAD_TYPE到FILEATTR的CRC,包含文件名 HEAD_TYPE:    1B,0x74 HEAD_FLAGS:    2B 0x01 - file continued from previous volume 0x02 - file continued in next volume 0x04 - 文件使用密码加密 0x08 - 文件注释存在,RAR3.x使用独立的注释块,不设置该位 0x10 - information from previous files is used (solid flag)(针对2.0以后版本) Bit 7,6,5(仅适用于2.0及以后的版本) 000 - 字典大小64KB 001 -字典大小128KB 010 -字典大小256KB 011 -字典大小512KB 100 -字典大小1024KB 101 -字典大小2048KB 110 -字典大小4096KB 111 -文件是目录 0x100 - HIGH_PACK_SIZE and HIGH_UNP_SIZE fields are present,仅针对大文件(大于2GB),小文件不存在该位 0x200 - 文件名包含常用和Unicode编码的字符,使用0分隔。在这种情况下,NAME_SIZE等于通常的名字+Unicode编码的名字+1。如果该位设置了,但FILE_NAME不包含0,意味着文件名是用UTF-8编码的。 0x400 - 头部在文件名后面包含额外的8字节,用于增加加密的强度(通常称为盐salt) 0x800- 版本标志位,这是一个旧版本的文件,在文件名后面有’;n’的版本号 0x1000 - 扩充的时间域存在 0x8000 - 该位始终设置,所以完整的块大小是HEAD_SIZE+PACK_SIZE(如果0x100位设置,再加上HIGH_PACK_SIZE) HEAD_SIZE:    2B,文件头大小,包含文件名和注释 PACK_SIZE:    4B,压缩后的文件大小 UNP_SIZE:        4B,解压缩后的文件大小 HOST_OS:        1B,操作系统号 0 - MS DOS 1 - OS/2 2 - WIN32 3 - Unix 4 - Mac OS 5 - BeOS FILE_CRC:        4B,文件CRC FTIME:        4B,日期和时间,以MS-DOS格式 UNP_VER:        1B,提取文件所需的RAR版本,版本号编码格式:10*major version + minor version METHOD:        1B,压缩方法 0x30 - 存储 0x31 - 最快压缩 0x32 - 快速压缩 0x33 - 标准压缩 0x34 - 较好压缩 0x35 - 最好压缩 NAME_SIZE:    2B,文件名大小 ATTR:            4B,文件属性 HIGH_PACK_SIZE:4B,64bit的压缩文件大小高4字节,可选域,仅在0x100位设置时存在。 HIGH_UNP_SIZE:4B,64bit的解压缩文件大小高4字节,可选域,仅在0x100位设置时存在。 FILE_NAME:    NAME_SIZE字节,文件名 SALT:            8B,盐值,present if (HEAD_FLAGS & 0x400) != 0 EXT_TIME:        可变大小,present if (HEAD_FLAGS & 0x1000) != 0 1. To process an SFX archive you need to skip the SFX module searching for the marker block in the archive. There is no marker block sequence (0x52 0x61 0x72 0x21 0x1a 0x07 0x00) in the SFX module itself. 2. The CRC is calculated using the standard polynomial 0xEDB88320. In case the size of the CRC is less than 4 bytes, only the low order bytes are used. RAR5加密文件名--解压缩流程及破解所需信息 IsArchive(True)函数:判断是否是压缩文件。 首先读取marker块,判断RAR的版本号。 读取加密头(第一次ReadHeader()),当前文件指针是8,因为仅读取了marker块。首先读取7B,这是Header块最小的字节数。 分解读取的7B,HeadCRC:4B,BlockSize:可变的,在当前例子中是1B,大小是38,然后根据BlockSize的大小继续读取剩余的数据。 计算Block的CRC HeaderType:可变的,1B,04--加密头。 Flags:可变的,1B 判断计算的CRC和读取的CRC是否一致。 NextBlockPos=8+38=46 CryptVersion:可变的,1B,0 EncFlags:可变的,1B,0x01 UsePswCheck=TRUE Lg2Count:1B,15 Salt:16B PswCheck:8B Csum:4B 将PswCheck进行sha256运算与csum比较是否相等。 Encrypted=True 第一次Readheader()完毕。 紧接着进入第二次Readheader()函数。 已经判断出文件被加密,开始解密。要求用户输入密码。 读取初始化向量HeadersInitV:16B 进行密码破解,破解信息包括:用户输入的密码,盐salt,Lg2Count,密码运算后的结果存放在局部变量PswCheck中,然后将计算出的PswCheck与前面读出的PswCheck进行比较,一致则密码正确。 解密算法: PBKDF2()函数: 输入参数:密码,密码长度,盐,盐长度,1<
/
本文档为【rar压缩文件加密过程及破解可行性分析v2】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑, 图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。 本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。 网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。

历史搜索

    清空历史搜索