首页
社区
课程
招聘
[讨论]RAR加密,亮了呢
发表于: 2010-12-14 17:44 20179

[讨论]RAR加密,亮了呢

2010-12-14 17:44
20179
无意中生成一个txt文件,内容只有一个字节,f,然后对其加密,当时加的口令是“aaaaaab”,但加完之后,我用“baf”也可以解密,附件是那个rar文件,当初加密的rar版本是3.8

即:该文件用 aaaaaab 和 baf 这两个密码都可以解压。

附件在下面,本人很菜,发来给大家研究。

此贴首发T00LS,原作者 xlk111

[课程]Android-CTF解题方法汇总!

上传的附件:
收藏
免费 0
支持
分享
最新回复 (26)
雪    币: 150
活跃值: (16)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
以下说明下为啥我觉得撞大运了。

好奇是菜鸟的天性,Google查了下rar的加密过程:

一、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校验码比较,相同则密码正确,不相同则密码错误。
2010-12-14 17:45
0
雪    币: 107
活跃值: (326)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
没看懂...........................
2010-12-14 17:45
0
雪    币: 150
活跃值: (16)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
就是一个RAR文件,两个密码都可以解压。
2010-12-14 17:50
0
雪    币: 214
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
那比如别人加密一个rar怎么,可以解密,还是不清楚
2010-12-14 18:43
0
雪    币: 179
活跃值: (26)
能力值: ( LV7,RANK:100 )
在线值:
发帖
回帖
粉丝
6
是不是HASH算法的碰撞呢,不同的密码通过HASH算法生成的用于AES加密的Key是一样的,所以相当于同一个密码了。
本人密码学小白,以上纯属瞎猜
2010-12-14 20:49
0
雪    币: 225
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
认真学习下
感谢分享
2010-12-14 23:59
0
雪    币: 448
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
感谢分享 ~~~~学学啦
2010-12-16 08:55
0
雪    币: 92
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
看了半天还是没弄明白,收藏先
2010-12-18 14:07
0
雪    币: 209
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
碰撞成功?~~
2010-12-28 17:25
0
雪    币: 207
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
你怎么会发现这个的?
2010-12-28 18:47
0
雪    币: 204
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
怎么应用啊 我想知道怎么应用
2011-1-18 13:50
0
雪    币: 324
活跃值: (56)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
13
看来RAR可以多个密码解压,但别人加密的难搞定呀!不知道有没有好的方法可以解密。
2011-1-25 12:55
0
雪    币: 328
活跃值: (34)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
14
正常,碰撞成功,并且非原始口令生成的密钥正好可以解你这一个字节。
其实对于你这个RAR文档,还有很多别的口令可以解开
但你的明文每增加一个字节,碰撞成功的难度都会增大很多。
2011-1-28 16:59
0
雪    币: 243
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
15
你新建一个空白的文档,压缩后,用随意密码都能打开!!!呵呵,碰撞的问题啦
2011-2-5 15:58
0
雪    币: 31
活跃值: (43)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
16
不懂,干脆穷举下得了
2011-2-5 16:33
0
雪    币: 64
活跃值: (134)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
17
成功的AES碰撞……
牛X
是无意中找到的吗?
2011-2-5 22:30
0
雪    币: 67
活跃值: (30)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
18
wchar PswW[MAXPASSWORD];
    CharToWide(Password,PswW,MAXPASSWORD-1);
    PswW[MAXPASSWORD-1]=0;
    byte RawPsw[2*MAXPASSWORD+SALT_SIZE];
    WideToRaw(PswW,RawPsw);
    int RawLength=2*strlenw(PswW);
    if (Salt!=NULL)
    {
      memcpy(RawPsw+RawLength,Salt,SALT_SIZE);
      RawLength+=SALT_SIZE;
    }
    hash_context c;
    hash_initial(&c);

    const int HashRounds=0x40000;
    for (int I=0;I<HashRounds;I++)
    {
      hash_process( &c, RawPsw, RawLength, HandsOffHash);
      byte PswNum[3];
      PswNum[0]=(byte)I;
      PswNum[1]=(byte)(I>>8);
      PswNum[2]=(byte)(I>>16);
      hash_process( &c, PswNum, 3, HandsOffHash);
      if (I%(HashRounds/16)==0)
      {
        hash_context tempc=c;
        uint32 digest[5];
        hash_final( &tempc, digest, HandsOffHash);
        AESInit[I/(HashRounds/16)]=(byte)digest[4];
      }
    }
    uint32 digest[5];
    hash_final( &c, digest, HandsOffHash);
    for (int I=0;I<4;I++)
      for (int J=0;J<4;J++)
        AESKey[I*4+J]=(byte)(digest[I]>>(J*8));

ftp://ftp.rarlabs.com/rar/unrarsrc-3.7.8.tar.gz 下载回来的代码,可见,salt和password,不是单纯的sha1一次就可以了。因为sha1的结果是20个字节的,而aes密钥是16个字节,初始向量也是16个字节,只有20<16+16,所以才会有了上述的扩展方法。因此,仅从这个角度来看,根本不需要对sha1或者aes进行攻击,就可以很容易找到多组口令都可以解密一个rar文件,而这跟明文的长度没关系。
不过可恶的是,rar竟然和qq保存在本地的口令一样,都是进行了多轮的哈希操作,增加的暴力尝试的复杂度。然而,这对于破解rar的口令是否有帮助,还是个未知数。天知道按照这样的扩展算法得到的密钥是否具有某些统计特性之类的,也许会存在什么后门之类的。
const int HashRounds=0x40000;
2011-7-5 18:03
0
雪    币: 232
活跃值: (13)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
19
是刚好巧合吧。存在这种概率!
2011-8-10 10:42
0
雪    币: 468
活跃值: (52)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
20
真的亮了,有没有第3个密码啊。
2011-8-10 19:16
0
雪    币: 468
活跃值: (52)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
21
你的这个情况,我估计是6楼说的,hash碰撞成功,既你的“aaaaaab”和“baf”经过rar进行hash以后得到的值是一样的,然后用这个相同的值再解密aes加密的密文,自然都可以成功解密还原明文。
但是,
会不会出现这种情况,假设另外的密码“kkk”,经过hash以后和"aaaaaab"hash以后的值不同,但是经过aes解密以后,crc32校验竟然成功,所以rar也提示密码正确,但是这个时候,明文已经不是原来的明文了,仅仅是因为2个明文的crc32都是一模一样,也就是发生了crc32的碰撞。
2011-8-27 08:12
0
雪    币: 23
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
22
RAR密码现在只能爆破 好像没其他什么办法
2011-8-27 19:17
0
雪    币: 1308
活跃值: (722)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
23
第2个密码:baf

第3个密码:bkw
第4个密码:dfq
第5个密码:hsc
第6个密码:izm
第7个密码:jak
第8个密码:jqs
第9个密码:kwv
第10个密码:lgk
第11个密码:ltp
第12个密码:pvd
第13个密码:qwv
第14个密码:sbi
第15个密码:xpp
第16个密码:yxb

也就是说:在长度为3的小写字母,共有15个密码可解开1字节内容。

结论:1字节内容的碰撞密码太多了!!!
2011-10-4 17:25
0
雪    币: 54
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
24
楼上的太有才了,这个规律都给蒸出来了。有没有技巧破解呢?
2011-10-12 17:30
0
雪    币: 52
活跃值: (20)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
tor
25
AES不是对称密码吗?不同的密钥解密出来的肯定是不一样的啊
2011-10-13 00:47
0
游客
登录 | 注册 方可回帖
返回
//