悪あがきプログラマー

悪あがきを続けていきたい技術と書評なブログです。トレタでiOSエンジニアやってます。

暗号化復号化の高速化

RailsアプリでCSV出力を実装していたのだが、これがどうも遅い。調査しているうちに復号化処理部分であることがわかった。わかったものの高速化の手段がわからなかったためQA@ITで質問してみた。

Railsアプリでの復号化が遅い - QA@IT

質問サイトへの投稿は始めてだったのでドキドキだったが、特に怒られることもなく、親切に教えて頂いた。その中で、暗号化復号化の鍵生成部分が重いのでは?との指摘があった。

このようなメソッドを3万回呼ぶと、3万回鍵生成が呼ばれてしまいます。鍵生成は中でハッシュを何千回も行なっていたりするので、3万回も呼ぶと、数千万回ハッシュを行なってしまい、不必要に重いかもと思います。パスワード(およびそれから生成される鍵)がつねに同一だとすると、1回でよいはずです。

http://qa.atmarkit.co.jp/q/2787

たしかに。。

PJで使用している暗号化復号化処理は昔誰かが書いたものを使いまわしていたので、特にその処理を深堀りしていなかったのである。

鍵は固定なので使いまわすことが出来る。ということで教えて頂いた方法を試そうと思ったのだが、Rubyが1.8.6のため、pbkdf2_hmac_sha1メソッドは無いと怒られた。

しょうがないので、単純に鍵生成まで完了したオブジェクトを使いまわす方法で実装してみた。

これを5万件の名前リストで実行してみた結果が下記である。

iMac-y-koh@yoonchulkoh:test $ time ruby encrypt_test.rb encrypt name_list_50000.txt 

real	0m53.752s
user	0m53.653s
sys	0m0.033s
iMac-y-koh@yoonchulkoh:test $ time ruby encrypt_test.rb encrypt_shared name_list_50000.txt 

real	0m0.228s
user	0m0.214s
sys	0m0.013s
iMac-y-koh@yoonchulkoh:test $ time ruby encrypt_test.rb decrypt name_list_50000_encrypted.txt

real	0m53.159s
user	0m53.141s
sys	0m0.018s
iMac-y-koh@yoonchulkoh:test $ time ruby encrypt_test.rb decrypt_shared name_list_50000_encrypted.txt

real	0m0.273s
user	0m0.259s
sys	0m0.013s

53.752s/0.228s≒235倍
53.159s/0.273s≒194倍
いやはや爆速である。