web-dev-qa-db-ja.com

約16桁のZipファイルのパスワードを回復することは可能ですか?

私の友人は彼女のZipファイルのパスワードを失いました。彼女はパスワードが数字のみ(つまり、0、1、2、3、4、5、6、7、8、および9のみ)を含み、長さが16文字程度であることを覚えています。パスワードの数字は、ランダムにキーを押すことによってランダムに選択されました。彼女は自分のパスワードをTXTファイルに保存しましたが、ファイルはなくなっています。

パスワードを回復するための実行可能な方法はありますか?もしそうなら、どうすればそれを行うことができますか?

このような長いパスワードは復元できないことをインターネットで読みましたが、パスワードは数字のみであることを知っているため、このケースは特別だと思います。私たちは数学の素人であり、私たちのケースでパスワードを解読するのに必要な時間を見積もることはできません。私の友人は単にそれを手放す必要がありますか、それともパスワードを回復するために時間と労力を費やす価値がありますか?

2
Mitsuko

パスワードは、ランダムにキーを押すことにより、ランダムに選択されました

TL; DR実現可能 アーカイブがZipCryptoで保護されている場合にクラックするには、実行不可能アーカイブが "WinZip" AES暗号化で保護されている場合


ランダムな数字の16 = 10 ^ 16 =10000 000 000 000 000組み合わせ=53ビット

たとえば、100 000ハッシュ/秒のパスワード検証速度を達成できる場合、次の量がかかりますパスワードがブルートフォースになるまでの時間:

  1. 100000000000秒
  2. 1666666667分
  3. 27777778時間
  4. 1157407日
  5. 3171年

考慮すべきその他の事項(ありがとう、コメントセクション!):

  1. 1000 000ハッシュ/秒=>317年総当たり
  2. 10000 000ハッシュ/秒=>32年総当たり( GPUを使用する特定のWinZip/7-Zip/PKZIPアルゴリズムによって異なります(Nvidia RTX 2080のベンチマークを参照) )。
  3. 30 GH /秒=>4日hashcat同じベンチマーク )でのPKZIPに関する測定
  4. 22.7 ZettaHash/sec=>1秒のブルートフォース。 元のPKZIP暗号化アルゴリズムで実現可能であるようです。これは、いくつかの固有の攻撃を使用してブルートフォースで実行できます "22.7 ZettaHash /秒、単一のRTX 2080Ti"で16個の数値をクラックできます。 まだWinZipで使用されているAES + PBKDF2ではありません。

Zipアーカイブを保護するために、少なくとも2つの異なるアルゴリズムが広く使用されています。

  1. ZipCrypto(PKZIP暗号化)
    • 元のPKZIP暗号化は完全に weak (CRC32ベースのキー導出を使用):10 MH /秒から -100 GH /秒 で最大 22.7 1GPUのZettaHash/s 。特定の攻撃、ハードウェア、最適化セットに応じて、secondsから1〜2日間の16の数値をクラックできます。運が悪いとしたら、それでも何年も続くでしょう。
  2. AES暗号化WnZip暗号化
    • WinZipは、AESベースの暗号化とPBKDF2-HMAC-SHA1 1000反復のキー導出を使用します 1GPUで5メガハッシュ/秒 。そして、これは32年です。
4

16文字はかなり長いです。数字だけでも時間がかかります。力ずくで攻撃するのがどれほどもっともらしいことかはわかりません。おそらく、代わりにファイル回復プログラムを使用して、パスワードのtxtファイルを回復することを検討してください。ブルートフォースでZipアーカイブを強制的に実行したい場合は、そのためのphpスクリプトを以下に示します。

脚本:

<?php
#This script will try all numeric passwords which are 16 characters long (excluding those which start with zeros), and reveal the password on completion.
#Install PHP 7, and p7Zip (eg: "Sudo apt-get install php p7Zip-full"). '/dev/null' must exist! Save this script as "script.php" in $PWD. Copy Zip archive to $PWD, and name it "file.Zip". Execute this script in terminal (eg: "php script.php").
$i = 999999999999999;
while ($i <= 9999999999999999){
    echo "Trying {$i}\n";
    $output = Shell_exec("7z t file.Zip -p{$i} 2>&1 > /dev/null && echo $?");
    $output = trim($output);
    if ($output === '0'){
        echo "Password is {$i}\n";
        $i = 9999999999999999;
    }
    $i++;
}
?>

出力例(サイズに合わせてトリミング):

user1@vm1:~/Music$ php script.php
Trying 9999999999999995
Trying 9999999999999996
Trying 9999999999999997
Trying 9999999999999998
Trying 9999999999999999
Password is 9999999999999999
user1@vm1:~/Music$ 
1
unregistered