两个密码对应同一个加密ZIP包

admin 2023年3月6日20:10:45评论22 views字数 1356阅读4分31秒阅读模式
创建: 2022-08-21 01:36
更新: 2022-08-25 10:41
http://scz.617.cn:8/misc/202208210136.txt

参看

https://twitter.com/_mohemiv/status/1561044393880178689

@_mohemiv分享了一则消息,特定条件下两个解压密码对应同一个加密zip包。云海跟我说的这事,我几乎不上推特,各种原因吧。

Linux环境中测试步骤如下

a) 加密压缩

7z a x.zip /etc/passwd -mem=AES256 -p

提示输入密码时,用这个

Nev1r-G0nna-G2ve-Y8u-Up-N5v1r-G1nna-Let-Y4u-D1wn-N8v4r-G5nna-D0sert-You

b) 解压

7z e x.zip

提示输入密码时,用这个

pkH8a0AqNbHcdw8GrmSp

步骤a、b中的两组密码可以互换,加密时用短的,解密时用长的。

Windows环境中用7-Zip GUI测试时,注意选

压缩格式    zip (默认是7z)
加密算法    AES-256 (默认是ZipCrypto)

看着有点神奇,但这不是魔法,不是前述URL所说的"后门口令"。它有一个合理的解释,参看

https://twitter.com/Unblvr1/status/1561112433812463616

@Unblvr1解释了原理

ZIP uses PBKDF2, which hashes the input if it's too big. That hash (as raw bytes) becomes the actual password. Try to hash the first password with SHA1 and decode the hexdigest to ASCII.

他的意思是

$ echo -ne "Nev1r-G0nna-G2ve-Y8u-Up-N5v1r-G1nna-Let-Y4u-D1wn-N8v4r-G5nna-D0sert-You" | shasum
706b4838613041714e62486364773847726d5370  -

$
 echo -ne "Nev1r-G0nna-G2ve-Y8u-Up-N5v1r-G1nna-Let-Y4u-D1wn-N8v4r-G5nna-D0sert-You" | shasum | cut -f1 -d' ' | xxd -r -p
pkH8a0AqNbHcdw8GrmSp

在限定条件下zip的密码逻辑有点奇怪,明文口令超长时对之求SHA1,用SHA1当密码;明文口令足够短时,直接用作密码。看7-Zip源码可以找出这段逻辑,了解多长算超长,我懒。

仔细看这个逻辑,理论上对步骤b中密码的字节流求"SHA1 Collision",有无穷多个碰撞等着你,只要"碰撞"对应可打印字符串,就可用作步骤a中密码。这种运算量太大,对普通人不现实,我连MD5碰撞都没试过,更别说SHA1碰撞。

换个思路,穷举超长字符串,计算SHA1,只要20个字节全部位于ASCII范围,就制造出了一对zip解压密码。这个运算量比"哈希碰撞 (SHA1 Collision)"小,我接着懒。

原文始发于微信公众号(青衣十三楼飞花堂):两个密码对应同一个加密ZIP包

  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2023年3月6日20:10:45
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   两个密码对应同一个加密ZIP包http://cn-sec.com/archives/1253684.html

发表评论

匿名网友 填写信息