2006年09月11日(月) [過去の今日]
#1 perlによるAESベンチ
ちょっと都合で共通鍵を使うことになったので、とりあえずcpanで見つけたモジュールをベンチマークすることにした。候補は以下の通り。
このうち Crypt::OpenSSL::AES と Crypt::Rijndael は、 Crypt::CBC から利用する。
んで、ベンチを取るスクリプトは、Crypt::CBCを利用するもの用と、Crypt::GCryptを利用するもので二つ用意。
ひとつは aesbench-libcrypt-cbc.pl
#!/usr/bin/perl use strict; use Crypt::CBC; srand; my $plain; while(<>) { $plain .= $_; } my $key_gen = sub { my $seed = '0123456789ABCDEF'; my $key; for ( my $i = 0; $i < 32; $i++ ) { my $num = int(rand(16)); $key .= substr($seed, $num, 1); } return pack('H*', $key); }; my $cipher = Crypt::CBC->new( -key => $key_gen->(), #-cipher => "Crypt::OpenSSL::AES" -cipher => "Crypt::Rijndael" ); my $data = $cipher->encrypt($plain); print $cipher->decrypt($data);
もいっこがGCrypt用、aesbench-gcrtypt.pl
#!/usr/bin/perl use strict; use Crypt::GCrypt; srand; my $plain; while(<>) { $plain .= $_; } my $key_gen = sub { my $seed = '0123456789ABCDEF'; my $key; for ( my $i = 0; $i < 32; $i++ ) { my $num = int(rand(16)); $key .= substr($seed, $num, 1); } return pack('H*', $key); }; my $cipher = Crypt::GCrypt->new( type => 'cipher', algorithm => 'aes', mode => 'cbc' ); my $key = $key_gen->(); $cipher->start('encrypting'); $cipher->setkey($key); my $data = $cipher->encrypt($plain); $data .= $cipher->finish; $cipher->start('decrypting'); $cipher->setkey($key); print $cipher->decrypt($data);
で、これらを切り替えてtimeコマンドで計れるようにシェルスクリプトを用意。aesbench.sh
#!/bin/sh for i in spam/*; do perl $1 <$i >/dev/null done
このスクリプトを見てもわかるが、spamディレクトリに適当にMaildirからひろってきたspamファイルを200個ほど用意した。
@ ベンチマーク開始:
いざ3回ずつ実行。 まずはCrypt::OpenSSL::AES
$ time ./aesbench.sh aesbench-libcrypt-cbc.pl real 5.21 user 3.62 sys 0.75 $ time ./aesbench.sh aesbench-libcrypt-cbc.pl real 4.57 user 3.59 sys 0.79 $ time ./aesbench.sh aesbench-libcrypt-cbc.pl real 4.53 user 3.53 sys 0.85
次はCrypt::Rijndael。
$ time ./aesbench.sh aesbench-libcrypt-cbc.pl real 6.40 user 4.48 sys 0.76 $ time ./aesbench.sh aesbench-libcrypt-cbc.pl real 6.68 user 4.45 sys 0.77 $ time ./aesbench.sh aesbench-libcrypt-cbc.pl real 6.37 user 4.72 sys 0.57
んでもってCrypt::GCrypt
$ time ./aesbench.sh aesbench-gcrypt.pl real 2.90 user 1.50 sys 0.42 $ time ./aesbench.sh aesbench-gcrypt.pl real 2.01 user 1.39 sys 0.48 $ time ./aesbench.sh aesbench-gcrypt.pl real 2.88 user 1.49 sys 0.39
@ まとめ:
いやなんつーか、GCrypt速すぎ。ぶっちぎりじゃん。なんでこんなに速いのよ。
しかし、GCryptはencryptしたものをencryptするのはできない模様。正確にはできるんだけど、decryptできなくなる。最初はそれでベンチマーク取ってたんだけどね、1000回くらいループさせて。おかげでベンチマークがめんどうになった。もしかしたらなんかのミスがあるのかもしれないけど、ちょっとわからない。
さらにCrypt::GCryptだとコードがすっきりしない。手続きが繁雑でめんどいのよね。そういう意味でもCrypt::CBCのほうが有利。
うーん、というわけで総合的にはCrypt::OpenSSL::AESかな。どうしても速度が欲しいときはCrypt::GCryptで。
(@577)