暗号化してメールの設定を保存する

EncodeクラスではCreateSalt(string str)メソッドでソルトを生成するとともに、初期化ベクトルを生成していました。そしてパスワードとソルトから暗号鍵を生成していました。そしてCreateSalt(string str)メソッドとCreateIV(string str)メソッドは以下のような内容になっていました。

引数が渡されていますが、使用されていません。Rfc2898DeriveBytesコンストラクタに渡されているのは”8文字以上の文字列を指定すること”という定まった文字列と生成するソルトのサイズだけです。これを利用して以下の方法で暗号鍵を生成するのはどうなのでしょうか?

たしかにソルトを生成するときは同じ文字列でも異なったものが生成されます。でもそうであってもソルト生成のために渡す文字列は不規則に変化させたほうがよいと思われます。

暗号化ソフトのなかには説明書に、

と書かれているものがあります。マウスを動かすクセというのは人によって違うのでコンピュータが作り出す疑似乱数よりもランダムなデータが取得できそうです。そこでこれまで作ってきた暗号化の処理を改良してみることにします。

これは

メールが来たら知らせてくれるアプリをつくる

で作成したものですが、マスターパスワードを生成するダイアログを表示させているときにユーザーに不規則にマウスを動かさせるのはどうでしょうか?

暗号化してメールの設定を保存する

で作成した文字列を暗号化するクラスを少し修正します。

暗号化するときにランダムな文字列が必要なのでコンストラクタの引数の数が増えました。

Docクラス同様、暗号化するときにランダムな文字列が必要なのでコンストラクタの引数の数が増えました。

Dataクラスも暗号化するときにランダムな文字列が必要なので暗号化処理をするメソッドの引数の数が増えました。

あとは設定を保存するときにランダムな文字列を作成して各コンストラクタに渡すだけです。

以下は設定を暗号化してファイルに保存するときに表示されるフォームです。

マウスがフォームの外側にあるときの動きも捕捉したいので、マウスフックをしています。

マウスが動いたらその座標を取得します。前の座標とある程度変化していたらその座標をリストに格納します。そしてマウス座標から文字を生成します。

そのときはマウス座標に 0x4000をプラスして文字コードからランダムな文字列を作り出しています。得られる文字は以下のようなものです。

Unicode一覧 4000-4FFF – Wikipedia