エクセルマクロ模索中…パスワード解除かぁ…
ということで、会社であった相談に、「エクセルに付けたパスワード忘れたんだけど何とかならない?」というものがありました。結論から言っちゃえば、「そういうことできるソフト」ってのは、Vectorさんとか行けばゴマンとあります。しかしながら、そこは「企業」という縛りがあるため、「こういうのがあるから使ってください!」…とはなりません~。で、目を付けたのが、「ブルートフォース(総当たり)」方式で何とかならんかと…。平たくいえば、マクロで総当たりでファイルが開けるか試せばいいじゃんってことでしたが、「そういうことができるソフト」は基本的にはこの方式をとっているみたいです。うん、にわか仕込みの知識ではちょっと時間が足りませんでしたw総当たりのいいところは、「いつかは解除できる」という点ですが、最大のデメリットは、「総数が増えると時間がめちゃくちゃかかる」ということですね。コレ、今回の件で試してみてわかったのですが、Microsoft Office系ソフトって、パスワードの使用可能文字に制約ないんですね。その上、大文字・小文字は分けるので、対象となるのは下記のような感じ。英字:abcdefghijklmnopqrstuvwxygABCDEFGHIJKLMNOPQRSTUVWXYG数字:0123456789記号: !"#$%&'()-^\@[;:],./\=~|`{+*}<>?_その数、実に96種類!(実は、「半角スペース」も使えてしまいます)この数字がどういうことかというと、1桁のパスワードであれば、「96通り」。2桁のパスワードであれば、「9,216通り(96の二乗)」。3桁のパスワードであれば、「884,736通り(96の三乗)」。4桁のパスワードであれば、「84,934,656通り(96の四乗)」。5桁のパスワードであれば…。…とまぁ、とんでもない跳ね上がり方します。総当たりをかける速度が1回あたり0.1秒程度と仮定しても、4桁のパスワードを解読するのに約98日ほどかかるみたいです。まぁ、CPUパワーに任せれば、もっと速いと思いますが、「かなりかかる」という印象を持っていただければと思います。さらに、「桁数」がわかっていれば問題ありませんが、「忘れた人」は何桁で作ったかなんて考えません(自分もそうですし)。結果、それぞれの桁数の結果を順繰りに試さないといけないわけです。「1」「01」「001」「0001」…パスワードとしては、別物ってことですね。んで、最初に作ったのは、配列に入れてから順繰りにぶつける方法でしたが、どれだけの数を入れることになるかが不明瞭(桁数のせいで…)のため、頭から順繰りに引っ掛ける方式にしたんですね。ひとまず、数字のみでって感じでしたが、これがめちゃくちゃ時間がかかる。単純な方式だったので、パスワードをぶつける方法を考えないと…でしたね。データが開けた際の処理も後回しだったので、まぁ、ひどいものでしたがwサンプルコードを…と思いましたが、手元にエクセルがないためちょっと断念。動作検証もできないものはちょっと掲載できないです。ざっくり書くと下記の感じですね。Sub パスワード解除Dim i As LongOn Error Resume NextDo Until i = 2017 'パスワードは2017に指定してあった Workbooks.Open ファイルパス,Password:=i 'Passwordのところ違うかも? i = i + 1LoopOn Error Goto 0End Sub色々と抜け、間違えはあると思うので、コピペではなく、コードを直接たたいてみてください。どっか間違えているはずです…多分。さておき、これに時間をかけすぎて業務がどうにかなるのも避けたかったので、「ありませんでした」という返信で終わらせることとしましたよ~…って話ですね。もうちょっと、時間と技量に余裕が出てきたら、再度挑戦したものです…。