脆弱なパスワード付きファイルを作成しないためのメモ

# パスワードの暗号解析の基本

パスワードに使用する文字の種類により、かかる計算量は下表のようになります。
※億未満は切り捨てています。

|         使用する文字の種類         | 使用できる文字数 |    4桁   |   6桁  |      8桁     |        10桁        |
|------------------------------------|------------------|----------|--------|--------------|--------------------|
| アラビア数字のみ（0～9）           |               10 | 0.0001億 | 0.01億  | 1億          | 100億              |
| 英字（大文字、小文字区別しない）   |               26 | 0.0045億 | 3億    | 2088億       | 141兆1670億        |
| 英字（大小区別せず）+数字          |               36 | 0.0167億 | 21億   | 2兆8211億    | 1京3656兆1584億    |
| 英字（大文字、小文字区別）＋数字   |               62 | 0.1477億 | 568億  | 218兆3401億  | 83京9299兆3658億   |
| 英字（大小区別）＋数字＋記号31文字 |               93 | 0.7480億 | 6469億 | 5595兆8180億 | 4838京8230兆7179億 |
| 英字（大小区別）＋数字＋記号34文字 |               96 | 0.8493億 | 7827億 | 7213兆8957億 | 6648京3263兆5991億 |

最近のCPU(Intel core i7 3770K)であれば、1秒1億のファイルを計算できるようになるため、総当たり法での処理時間はおよそ下表のようになります。

|         使用する文字の種類         | 使用できる文字数 |    4桁   |   6桁  |      8桁     |        10桁        |
|------------------------------------|------------------|----------|--------|--------------|--------------------|
| アラビア数字のみ（0～9）           |               10 | 0.0001秒 | 0.01秒  | 1秒          | 1分40秒              |
| 英字（大文字、小文字区別しない）   |               26 | 0.0045秒 | 3秒    | 34分       | 16日        |
| 英字（大小区別せず）+数字          |               36 | 0.0167秒 | 21秒   | 8時間50分    | 4.3年    |
| 英字（大文字、小文字区別）＋数字   |               62 | 0.1477秒 | 9分  | 25日  | 270年   |
| 英字（大小区別）＋数字＋記号31文字 |               93 | 0.7480秒 | 1時間50分 | 1年10ヶ月 | 15557年 |
| 英字（大小区別）＋数字＋記号34文字 |               96 | 0.8493秒 | 2時間10分 | 2年4ヶ月 | 21375年 |

また、GPGPUを利用すると、この40倍を超える速度で計算できるようになるため、処理時間はより短縮されます。
つまり、英数字であっても大文字や小文字の違いがなければ、専用のソフトで1日かからずに解除することができます。

ただし、実際は、ファイル形式によってパスワードハッシュ化などがなされているため、それぞれのハッシュ形式の違いにより解除時間は上記表よりかかります。

# 代表的な暗号解読

## 総当たり方式（Brute-force attack）

可能な組合せを全てのパスワードを試す方法です。パスワードを忘れた場合などはよくこちらの方法を利用して割り出します。

## 辞書式（Dictionary attack）

辞書の単語組み合わせからパスワード推測をする方法です。総当たりでは対応しきれない長いパスワードに対しての攻撃に対して有効になります。
ただし、どちらかといえば、ＩＤの割り出しやメールアドレスの割り出しといったことの方が得意な暗号方式になります。


# パスワードをかけるファイルを間違えないこと※バイナリエディタで解読可能なパスワードもある（ExcelVBAなど）

いくら長いパスワードをつけても、バイナリエディタで解析されるパスワードもあります。
例えば、ExcelVBAなどに限っていえば、google検索で方法を調べればバイナリエディタで簡単にパスワード解除が可能です。
※すべては確認できていませんが、MS系の多くのアプリケーションは（ファイル形式にもよりますが）解析が可能とのことです。
情報をしっかり守るのであれば、パスワード付きZip圧縮をかけるなりの対策をとりましょう

つまり情報を守るためにはパスワードの長さではなく、パスワードをかけるアプリケーションも考える脆弱性対策が必要です。

# 暗号ライブラリの暗号強度

最後に、暗号化ライブラリについて簡単に触れておきます。
実はOpenなライブラリは、暗号強度の高いファイル（Excelであれば、xls＜xlsx形式）は開けないこともあります。
例えば、Oracle が配布しているJDKでは、暗号強度の制約があり、パスワードがわかっていても開けないファイルがあります。

自分で解除ライブラリを作成して、自分のファイルに対して脆弱性がないことを確かめても、暗号強度の制約に引っかかっていて、検証ができていないかもしれません。

JDKであれば、

* Java Cryptography Extension (JCE) Unlimited Strength Jurisdiction Policy Files

をインストールすれば、暗号強度の制約を解除することができます。
暗号強度の脆弱性をしっかり調べるときは、自身のJDKにそった実行環境を整えることをお勧めいたします。

* JDK1.7ならこちら
    * <http://www.oracle.com/technetwork/java/javase/downloads/jce-7-download-432124.html>
* JDK1.8ならこちら
    * <http://www.oracle.com/technetwork/java/javase/downloads/jce8-download-2133166.html>

をダウンロードして ```%JAVA_HOME%\jre\lib\seculity``` に上書き配置することでJDKの暗号強度の制約が解除されます。


# 脆弱なパスワードファイルを作成しないために

* 暗号は10文字以上の英数字記号混在を推奨
* 簡単な単語の組み合わせでパスワードを構成しないこと（辞書式への対応）
* バイナリ解析で暗号解析できるファイルにしないこと
* 暗号が他の人にわたらないようなしっかり管理をすること

などを注意して脆弱なパスワードファイルを作成しないよう注意する必要だと思います。