OpenSSL のあの暗号化って Perl でどうやんの?
DES, 3DES (またの名をDES EDEあるいはTripleDES) * ECB, CBC だけ。最初、 Crypt::TripleDES というモジュールが見つかったので試したけど一向にうまくいかず、EDE のほうを見つけるのに苦労しました。
#!perl
use v5.12;
use utf8;
use strict;
use warnings;
use Crypt::ECB;
use Crypt::CBC;
use Crypt::DES;
use Crypt::DES_EDE3;
use MIME::Base64;
use Test::More;
use File::Temp;
sub openssl ($$) {
my ($args, $content) = @_;
my $fh = File::Temp->new;
print $fh $content;
close $fh;
my $cmd = "openssl $args -in " . $fh->filename;
note $cmd;
my $ret = `$cmd`;
chomp $ret;
$ret;
}
subtest 'DES ECB' => sub {
my $key = '1' x 16;
is openssl("enc -e -nopad -des-ecb -K $key -base64", "foobar "), do {
my $cipher = Crypt::ECB->new;
$cipher->key(pack("H16", $key));
$cipher->cipher('DES');
encode_base64($cipher->encrypt('foobar '), '');
};
};
subtest 'DES CBC' => sub {
my $key = '1' x 16;
my $iv = '1' x 16;
is openssl("enc -e -nopad -des-cbc -iv $iv -K $key -base64", "foobar "), do {
my $cipher = Crypt::CBC->new({
cipher => Crypt::DES->new(pack('H16', $key)),
padding => 'none',
header => 'none',
iv => pack('H16', $iv),
});
encode_base64($cipher->encrypt('foobar '), '');
};
};
subtest '3DES ECB' => sub {
my $key = '1' x 48;
is openssl("enc -e -nopad -des-ede -K $key -base64", "foobar "), do {
my $cipher = Crypt::ECB->new;
$cipher->key(pack("H48", $key));
$cipher->cipher('DES_EDE3');
encode_base64($cipher->encrypt('foobar '), '');
};
};
subtest '3DES CBC' => sub {
my $key = '1' x 48;
my $iv = '1' x 16;
is openssl("enc -e -des-ede-cbc -iv $iv -K $key -base64", "foobar"), do {
my $cipher = Crypt::CBC->new({
cipher => Crypt::DES_EDE3->new(pack('H48', $key)),
header => 'none',
iv => pack('H16', $iv),
});
encode_base64($cipher->encrypt('foobar'), '');
};
};
subtest '3DES CBC (space padding)' => sub {
my $key = '1' x 48;
my $iv = '1' x 16;
is openssl("enc -e -nopad -des-ede-cbc -iv $iv -K $key -base64", "foobar "), do {
my $cipher = Crypt::CBC->new({
cipher => Crypt::DES_EDE3->new(pack('H48', $key)),
padding => 'space',
header => 'none',
iv => pack('H16', $iv),
});
encode_base64($cipher->encrypt('foobar'), '');
};
};
done_testing;