Hatena::Groupsubtech

冬通りに消え行く制服ガールは✖夢物語にリアルを求めない。

 | 

Nov 08, 2012 (Thu)

OpenSSL のあの暗号化って Perl でどうやんの? 17:07 はてなブックマーク - 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;

gerry++ 17:04 はてなブックマーク - gerry++ - 冬通りに消え行く制服ガールは✖夢物語にリアルを求めない。

 | 

スポンサード リンク

書いてる人

cho45 (佐藤広央) (www.lowreal.net)

Perl, JavaScript, Ruby, HTML, CSS, Web etc


スポンサード リンク