狐の王国


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)

この記事のURI

最近の記事

以上、1 日分

タイトル一覧


カテゴリ分類
Powered by hns-2.19.8, HyperNikkiSystem Project

過去にこの日記が置いてあったcgi.misao.gr.jpは廃止されました。それによって記事へのURIが変わってしまっています。cgi.misao.gr.jpをwww.misao.gr.jpと置き換えるだけで同じ記事にアクセスできるはずです。

Sugano "狐志庵" Yoshihisa(E) @ 美紗緒ネットワーク <koshian@misao.gr.jp>
日記管理ページ