转自:http://t00ls.net/thread-13702-1-1.html,原作者:xlk111。
无意中生成一个txt文件,内容只有一个字节“f”,然后对其加密,当时加的口令是“aaaaaab”,但加完之后,我用“baf”也可以解密,附件是那个rar文件,当初加密的rar版本是3.8。
说得简单点就是:就是一个RAR文件,两个密码都可以解压。这个Winrar压缩后加密了的文件用“aaaaaab”和“baf”这两个密码都可以解压。
附件在这里,本人很菜,发来给大家研究。附件下载
以下说明下为啥我觉得撞大运了。好奇是菜鸟的天性,Google查了下Winrar的加密过程:
一、Rar文件生成的流程。
Winrar加密文件时,总的分两个步骤:
1:先把源文件压缩,压成一段数据段。
2:再将压缩完的数据段加密。
对于同一个源文件来说,不进行加密,压缩完,其rar文件中的数据段是一模一样的。但是如果对同一个源文件来说,即使使用同一个密码,加密完rar文件中的数据段是不一样的,加密密钥依赖于Salt(8个字节的密钥,用来加密时使用,存放在rar文件头中里,应该是随机生成的。
二、加密“压缩完的数据段”的流程:
1、获取密钥:
将明文的口令与Salt一起,通过HASH算法,生成两个16字节的密钥。(一个是KEY(AES算法的参数),一个是initVector)
2、以Key和initVector来加密压缩数据:
这里,是一个循环加密的结构,每16字节作为一个块,进行加密(这可能正是为什么加密完的文件长度总为16倍数的原因)。加密采用AES算法(RAR采用的是AES的rijndael的标准应用)。这里注意:AES加密前,有一个异或运算,是先将每16字节块与上一个16字节块加密结果进行异或,然后再进行AES算法的。
;=============================================== packblock[0]=packblock^initVector encryptBlock[0]=AES(packblock[0]) ;(KEY为AES的密钥) for i=1 to 块数量-1 packblock=packblock^encryptBlock[i-1] encryptBlock=AES(packblock) ;(KEY为AES的密钥) next ;packblock表示压缩完的每16字节数据 ;encryptBlock表示加密完的每16字节数据 ;=============================================== |
三、解密的过程:
由于AES算法是对称的,所以解密的过程,是加密过程的逆运算。但解密时AES算法过程与加密所用的不一样(是因为解密过程中由KEY生成的子密钥表不一样)。仍然需要我们将密码输入,与salt一起生成两个16字节密钥,KEY和initVector。
;=============================================== packblock[0]=AES1(encryptBlock[0]) ;(KEY为AES的密钥) packblock[0]=packblock^initVector for i=1 to 块数量-1 packblock=AES1(encryptBlock) ;(KEY为AES的密钥) packblock=packblock^encryptBlock[i-1] next ;=============================================== |
那判断密码是否正确的在什么地方呢?
解密的过程是解密后的数据块进行解压缩,然后解成源文件,对该文件进行CRC校验,与保存在RAR文件中的源文件CRC校验码比较,相同则密码正确,不相同则密码错误。