大体でIT

-ちょっと使えるネタを紹介-

大体でIT

エクエルのパスワードを忘れてしまい開けなくなってしまったファイルを開く方法をご紹介します。結果としてパスワードが長いと難しいです。

はじめに

この記事ではエクセルの読み取りの解除方法についてご紹介します。

エクセルの読み取りパスワードを忘れてファイルが開けなくなってしまった方に参考になるかと思います。

この記事で紹介すること

  • エクセルの読み取りパスワードを総当たりで解除するVBAコードを紹介します

目次から見たい項目へ移動すると便利ですよ。

目次

パスワードを忘れて開けなくなったファイルを開く方法

そもそもエクセルが開かないのは読み取りパスワードが設定されているからです。

エクセルのパスワードには用途に応じていくつか種類があります。

エクセルのパスワードについて

エクセルのパスワードにはシート、ブック、書き込み、読み取りのパスワードがあります。

エクセルのファイルが開かないのはこの中の読み取りパスワードが設定されているからです。

他のパスワードでシート、ブック、書き込みのパスワードについてはパスワードを忘れてしまっても簡単に解除することができます。

その点についてはこちらでまとめています。

.zipの中を変更する方法は無理

シート、ブック、書き込みのパスワードについてはエクセルを.zipファイルに変換して中身を変更してパスワードを解除することができますが、読み取りパスワードだけはできません。

この記事では総当たり方式で読み取りパスワードを解除する方法をご紹介します。

総当たり方式

総当たり方式はその名の通りすべてのパスワードパターンを一つずつ実行していきパスワードを解除するという方法になります。

やることは単純なので、Excel VBAコードも比較的シンプルに作成することができます。

パスワードに使える文字(Shift-JIS)

Excel VBAで総当たり方式を作成するに際にそもそもパスワードに使える文字がなにかを知る必要があります。

パスワードに使える文字はChr関数を使ってShift-JISの形式で取り出すことができます。

Chr関数にいれることができる1~255の引数を入力した結果を見てみます。

Shift-JIS

このShift-JISの中からパスワードとして使うことができるのは塗りつぶした範囲の33番目~126番目になります。

この文字を使って総当たりでパスワードを解除していくことになります。

Excel VBAコードを紹介

エクセルのパスワードを開く総当たり方式のVBAコードをご紹介します。

パスワードで使える文字ですべての組み合わせのパスワードを作ってエクセルを開くというのを繰り返します。

Public ChrData 'Shift-Jisコードを保存
Public Hozon 'パスワードを一時保存
Public Lo '桁数
Public Lo_Count '探索する文字数
Public St_Lo 'ループする回数
Public FilePath 'パスワード付きファイルのフルパス
Public flag_End '探索をとめるフラグ

'パスワードを解析する
Sub Analyze_Password()
    
    Lo = 2 '桁数
    Lo_Count = 126 - 33 + 1 '文字の種類
    
    FilePath = ThisWorkbook.Path & "\パス保護.xlsx" 'パスワードを解除するエクセルファイルのパス
    ReDim Hozon(0 To Lo - 1) As Variant
    St_Lo = Lo 'ループの回数(固定)
    flag_End = 0 'ループを止めるフラグ
    
    Call GetChr '文字列を取得
    Call OpenFile(Lo) 'パスワードを作成してエクセルファイルを開く
    
End Sub
'Shift-JISを取得
Sub GetChr()

    ReDim ChrData(1 To 126 - 33 + 1) As Variant
    
    m = 0
    For i = 33 To 126
        m = m + 1
        ChrData(m) = Chr(i)
    Next
    
End Sub
'ファイルを開く
Sub OpenFile(ByVal Lo As Variant)
    
    Lo = Lo - 1
    
    If Lo >= 0 Then
        For i = 1 To Lo_Count
            
            'パスワード作成
            Hozon(Lo) = ChrData(i)
            Pass = ""
            For j = 0 To St_Lo - 1
                Pass = Hozon(j) & Pass
            Next
            
            If flag_End = 1 Then Exit Sub
            
            'ファイルを開く
            On Error Resume Next
            Workbooks.Open Filename:=FilePath, Password:=Pass
            If Err.Number = 0 Then 'エラーの場合1004 エラーなし0
                flag_End = 1 'パスワード解析をストップ
                MsgBox "開けました。パスワードは " & Pass & " です"
                Exit Sub
            End If
            
            '再帰する
            Call OpenFile(Lo)
        Next
    End If

End Sub

Chr()でShift-JISを取得

最初にChr関数でShift-JISの文字を取得しています。

パスワードで使える33番目~126番目の文字を取得しています。

m = 0
For i = 33 To 126
    m = m + 1
    ChrData(m) = Chr(i)
Next

パスワードの文字候補は94文字になります。結構な数です。

パスワードを作成

次にパスワードの候補を作成していきます。

Sub Analyze_Password()
    
    Lo = 2 '桁数
    Lo_Count = 126 - 33 + 1 '文字数
    
    FilePath = ThisWorkbook.Path & "\パス保護.xlsx" '解除するエクセルファイルのパス
    ReDim Hozon(0 To Lo - 1) As Variant
    St_Lo = Lo 'ループの回数(固定)
    
    Call OpenFile(Lo) '再帰するコード
    
End Sub

最初にパスワードの桁数を設定しておきます。

Sub OpenFile(ByVal Lo As Variant)
    
    Lo = Lo - 1
    
    If Lo >= 0 Then
        For i = 1 To Lo_Count
            
            'パスワード作成
            Hozon(Lo) = ChrData(i)
            Pass = ""
            For j = 0 To St_Lo - 1
                Pass = Hozon(j) & Pass '←ここでパスワード候補を作成
            Next
            
            'ここでファイルを開く
            
            Call OpenFile(Lo) '←ここで再帰する
        Next
    End If

End Sub

『OpenFile』のコードを指定した桁数『Lo』だけ再帰させてパスワードを作成しています。

こんな感じでパスワードを作成することができます。

パスワード作成

候補が多いので候補の一部だけを貼っておきます。

パスワードを指定してファイルを開く

パスワードを指定してエクセルファイルを開きます。

Workbooks.Open Filename:=FilePath, Password:=Pass

『Workbooks.Open』でエクセルファイルを開きます。引数に『Password:=Pass』としてパスワードを入力してファイルを開きます。

開けたらパスワードを表示

パスワードが間違っていている場合はエラーがでますので『On Error Resume Next』でエラーがでたらスキップさせています。

エラーが出た場合は『Err.Number』が『1004』となります。エラーが出なかった場合は『0』となりますので、『Err.Number』が『0』となったらコードを止めています。

エクセルファイルのパスワード解析が無事成功したらパスワードを表示させています。

On Error Resume Next
Workbooks.Open Filename:=FilePath, Password:=Pass
If Err.Number = 0 Then 'エラーの場合1004 エラーなし0
    MsgBox "開けました。パスワードは " & Pass & " です"
    Exit Sub
End If

パスワードを忘れて開けなくなったファイルを開いてみる

説明したVBAコードを使って読み取りパスワードが設定されたエクセルファイルを開いてみます。

実行条件

設定したパスワードとPCの環境を記載しておきます。

パスワードは『12』

パスワードは2桁で『12』としました。

もちろん実行する際はこのパスワードはわからないものとしていますが、パスワードが2桁ということはわかっていることとします。

実行したPC環境

実行したPCの環境です。

  • OS:Windows10
  • CPU:CORE i5 第8世代
  • メモリ:16GB
  • ビット数:64ビット
  • Officeバージョン:Excel 2016

実行結果

実行した結果です。

パスワード解除できました

無事パスワードを解除してエクセルファイルを開くことができました。

パスワードは『12』です。と出ています。

パスワード解析成功

かかった時間

実行に要した時間は、『355.8 秒』です。

問題点

2桁のパスワード解析で『355.8 秒』です。時間がかかりすぎですね。

時間がかかりすぎる

今回使用したPCの環境では1個のパスワードを試すのに『0.2 秒』ほどかかります。

これはどうしても縮められないので総当たりでやってしまうと2桁だと最大で94文字×94文字×0.2秒=1767.2秒かかる計算になります。約30分ですね。

3桁で46時間、4で180日かかってしまいます。

Excel VBAコード改善点

パスワード解析する際は以下のような改善をしないと厳しいです。

特定ワードを含む文字列で解析

パスワードの中の特定ワードがわかっている場合はそのワードを参考にしてパスワード候補を作成することです。

パスワードは桁数が大きくなればなるほど多大な時間を要します。

なのでその桁数を減らすのが一番効果的です。パスワードの中にこのワード入れたかもというのがあればそれを採用してパスワード候補を作成すると解析時間を大幅に短縮することができるかと思います。

特定文字のみで解析

パスワードを設定する際に『!』や『%』のような記号の文字はあまり使わないかと思います。

なのでパスワード設定した際に絶対これは使っていない文字があればそれを除外してパスワード候補を作成するのが効果的です。

使える文字候補は94文字あります。これをすべて使うと94の累乗で候補が増えてしまいますので、文字候補を減らせればかなり解析時間の短縮につながります。

パスワード解析を途中からできるようにする

一旦パスワード解析を中止して、次パスワード解析をする際は途中から始められるようにするのも改善策の一つだと思います。

これはパスワード解析が長期戦になった際に有効な手段だと思います。

複数パソコンで解析できるようにする

力技ですね。

1台で時間がかかるのであれば、PCを複数台にすれば単純にパスワード解析が早くなります。

この場合は、パスワード候補を分割できるようなコードを作成する必要になりますのでそのVBAコードを作成する必要があります。

おわりに

今回はエクセルのパスワードを総当たりで解析する方法についてご紹介しました。

結果としては、単純な総当たりではかなり厳しくて改善が必要という結果になっています。

パスワードを設定する側からするとやはりパスワードを長くするというのは大事ですね。

エクセルのパスワードがわからなくなって開けなくなってしまった際に少しは役立つかと思います。

最後までご覧くださいましてありがとうございました。

関連する記事から探す

カテゴリから探す

カテゴリから見たい項目を探すと便利ですよ。

アーカイブから探す