Crypt::RC4を使ってみる

winnyにも使用されたRC4!っていうとすごそうに見えるけど、実装はかなりシンプルっぽい。お手軽に使える可逆暗号を探してたので、これはちょうどいいかも。今まではCrypt::CBCでBlowfish + Base64でASCII化とかしてたけど、そこまでするほどか?と思ってきたので。

use strict;
use warnings;
use Crypt::RC4;

my $passphrase = 'crypton';
my $plaintext  = 'hatsunemiku';

my $encrypted = encrypt($passphrase, $plaintext);
my $decrypted = decrypt($passphrase, $encrypted);

print "encrypted = $encrypted\n";
print "decrypted = $decrypted\n";

sub encrypt{
  my ($passphrase, $plaintext) = @_;
  my $encrypted = RC4($passphrase, $plaintext);
  $encrypted =~ s/(.)/unpack('H2', $1)/eg;
  return $encrypted;
}

sub decrypt{
  my ($passphrase, $encrypted) = @_;
  $encrypted =~ s/([0-9A-Fa-f]{2})/pack('H2', $1)/eg;
  my $decrypted = RC4($passphrase, $encrypted);
  return $decrypted;
}
$ perl rc4.pl
encrypted = 6cec7abbb3035df64a491f
decrypted = hatsunemiku

ふむ。
エンコードされたパスワードはスクリプト内にベタ打ちしたいので*1、文字列になってると嬉しいかなと思ってベタなエンコードをしてみました。Base64使うのも大げさだしなー。
これで多少軽くなるとよいのだけど。

*1:まあ、その程度のセキュリティ要件なのです