トップ 言語 Java ライブラリ/Framework zip4j

zip4jとは―ZIPパスワード解析&解読&解除など

zip4jを使用すれば簡単にパスワード付きのZIPが扱えます。 これを使ってZIPパスワード解析&解読&解除ツールを作成してみました。

▲記事トップへ

目次

この記事の目次です。

1. zip4jとは
2. zip4jの入手先
3. ZIPパスワードの解読の例

更新履歴

1. zip4jとは

zip4jは、zipファイルまたはストリーム用の包括的なJavaライブラリです。

開発者ホームページ)http://www.lingala.net/zip4j.html

2. zip4jの入手先

zip4jは「https://github.com/srikanth-lingala/zip4j」からダウンロードできます。

3. ZIPパスワードの解読の例

試しにZIPのパスワード解析、解読、解除ツールを作って、解凍してみました。 作成したJavaのプログラムのコードを紹介いたします。

サンプルはSwingを使用してGUI操作でZIPファイルのパスと解凍先のディレクトリのパスを指定して解凍できるようにしています。 もしパスワードがある場合は、パスワードの候補文字列を作成して秒間1000回ほどのパターンを試して、ZIPのパスワードを解析して、解読できた場合は解除して解凍先に出力します。

設定

zipファイルパスのところにパスワード付きのZIPファイルのパスを入力します。 出力ディレクトリパスのところに出力するディレクトリのパスを指定して、取得ボタンを押すだけの簡単なものです。

実行

zipファイルパスのところにパスワード付きのZIPファイルのパスを入力します。 出力ディレクトリパスのところに出力するディレクトリのパスを指定して、取得ボタンを押すだけの簡単なものです。

解凍したファイルは解凍先ですが、ZIPパスワード解析ツールの下のところに、ループ回数と処理時間、解析したパスワードを表示します。 123のように3文字だと6秒で解読して、解除できました。

Javaのサンプルコード

作成したコードは以下です。 コードがわかりやすくなるようになるべく日本語の名前の関数と変数を使ってみました。

package sample;

import java.awt.BorderLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextField;

import net.lingala.zip4j.core.ZipFile;
import net.lingala.zip4j.exception.ZipException;

public class サンプル extends JFrame implements ActionListener{
    private JTextField zipパスエリア;
    private JTextField 出力DIRパスエリア;
    private JLabel メッセージ表示用ラベル;

    public static void main(String args[]){
        サンプル フレーム = new サンプル();
        フレーム.初期処理("ZIPパスワード解析");
        フレーム.setVisible(true);
    }

    @Override
    public void actionPerformed(ActionEvent e) {
        String zipファイルパス = zipパスエリア.getText();
        String 出力ディレクトリ = 出力DIRパスエリア.getText();
        メッセージ表示用ラベル.setText(zip解凍(zipファイルパス, 出力ディレクトリ));
    }

    private void 初期処理(String タイトル){
        setTitle(タイトル);
        setBounds(100, 100, 500, 200);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        JPanel パネル = new JPanel();
        zipパスエリア = new JTextField("zipファイルパス", 40);
        出力DIRパスエリア = new JTextField("出力ディレクトリパス", 40);
        JButton button = new JButton("取得");
        button.addActionListener(this);
        メッセージ表示用ラベル = new JLabel();
        パネル.add(zipパスエリア);
        パネル.add(出力DIRパスエリア);
        パネル.add(button);
        this.add(パネル, BorderLayout.CENTER);
        this.add(メッセージ表示用ラベル, BorderLayout.SOUTH);
    }

    private String zip解凍(String zipファイルパス, String 出力ディレクトリ) {
        String パスワード = "";
        long 開始時刻 = System.currentTimeMillis();
        long ループ回数 = 0;

        for (ループ回数 = 0; ループ回数 < 2147483647; ループ回数++) {
            パスワード = 基数変換(ループ回数);

            try {
                ZipFile zipファイル = new ZipFile(zipファイルパス);
                if (zipファイル.isEncrypted()) {
                    zipファイル.setPassword(パスワード);
                }
                zipファイル.extractAll(出力ディレクトリ);
               break;
            } catch (ZipException e) {}
        }
        long 終了時刻 = System.currentTimeMillis();
        return "ループ回数:" + ループ回数 +
                ", 処理時間:" + (終了時刻 - 開始時刻)/1000  + "秒" +
                ", パスワード:" + パスワード;
    }

    private static char[] 文字列 = {
    '1','2','3','4','5','6','7','8','9','0',
        'a','b','c','d','e','f','g','h','i',
        'j','k','l','m','n','o','p','q','r',
        's','t','u','v','w','x','y','z',
        'A','B','C','D','E','F','G','H','I',
        'J','K','L','M','N','O','P','Q','R',
        'S','T','U','V','W','X','Y','Z',
        '-','_','.','@'};

    private String 基数変換(long 変換前の数) {
        String 変換後の文字 = "";

        while (true) {
            int 要素番号 = (int)変換前の数 % 文字列.length;
            変換後の文字 = 文字列[要素番号] + 変換後の文字;
            変換前の数 = (変換前の数 / 文字列.length) -1;

            if (変換前の数 < 0) {
                break;
            }
        }
        return 変換後の文字;
    }
}

もっと知識を広げるための参考

更新履歴

更新履歴になります。

戻る

スポンサーリンク

サイト内のページ

言語
C・C++ /HTML /Java /JavaScript /PHP /シェルスクリプト

開発環境
Ant /Burp /Eclipse /Fiddler /gcc /gdb /Git /g++ /JDK /JMeter /JUnit /Teraterm /ZAP

技術・仕様
Ajax /CORBA /Jakarta EE(旧称J2EE、Java EE) /JNI

ライブラリ/Framework/CMS
bootstrap /jQuery /FuelPHP /Lucene /MyBatis /Seasar2 /Spring /Struts /WordPress

Web API
Google Maps

ITインフラOSとミドルウェア
Linux /Windows /シェル
ActiveMQ /Tomcat /MariaDB /MySQL /Nagios /Redis /Solr

ITインフラサーバー
公開Webサーバー

ITインフラネットワーク
プログラミング /構築

ITインフラセキュリティ
公開サーバーのセキュリティ

PC製品
ZOTAC

SI
ホームページの作り方

その他
IT用語 /ITスキル体系

スポンサーリンク

関連サイト内検索ツール

zealseedsおよび関連サイト内のページが検索できます。

IPアドレス確認ツール

あなたのグローバルIPアドレスは以下です。

54.89.70.161

HTMLの表示色確認ツール

パスワード生成ツール

文字数のプルダウンを選択して、取得ボタンを押すと「a~z、A~Z、0~9」の文字を ランダムに組み合わせた文字列が表示されます。

ここに生成されます。

スポンサーリンク