#!/usr/bin/perl -w use Getopt::Std; use Crypt::ECB; use strict; my $usage = "Usage: ecb.pl [-d] [-c ] [-p ] [-k ] [-f ] or ecb.pl -l or ecb.pl -v Encrypt/decrypt files using ECB mode. Reads from STDIN, writes to STDOUT. Options: -l list available ciphers -d decrypt (default mode is encrypt) -k key to use -f file containing key; either -k or -f must be specified -c block cipher to use, defaults to 'Rijndael' (AES) -p padding mode to use, possible values are 'standard' (default), 'zeroes', 'oneandzeroes', 'rijndael_compat', 'null', 'space' and 'none'. See Crypt::ECB for details on the different modes. -v print Crypt::ECB version "; my $version = "Using Crypt::ECB version $Crypt::ECB::VERSION.\n"; my $options = {}; getopts('vldc:p:k:f:', $options) || die $usage; print($version), exit(0) if $options->{v}; list_ciphers(), exit(0) if $options->{l}; die $usage unless $options->{k} or $options->{f}; sub slurp { open(F,$_[0]) || die "Couldn't open $_[0]: $!\n"; local $/; return } my $key = $options->{k} || slurp($options->{f}); my $cipher = $options->{c} || 'Rijndael'; # AES my $padding = $options->{p} || 'standard'; my $mode = $options->{d} ? 'decrypt' : 'encrypt'; my $ecb = Crypt::ECB->new(-key => $key, -cipher => $cipher, -padding => $padding); $ecb->start($mode); print $ecb->crypt while read(STDIN, $_, 1024); print $ecb->finish; exit(0); sub list_ciphers { print "Checking your perl installation for block ciphers compliant with Crypt::ECB...\n"; my ($ecb, $ok) = (Crypt::ECB->new, 0); close STDERR; # avoid strange error messages from modules tried foreach my $path (@INC) { while (<$path/Crypt/*.pm $path/Crypt/*/*.pm>) { next unless /\.pm$/; s|^.*Crypt/||; s|\.pm$||; s|/|::|g; eval { $ecb->cipher($_) }; printf(" found %-25s (keysize: %2s, blocksize: %2s)\n", "$_ ".$ecb->module->VERSION, $ecb->keysize, $ecb->blocksize) if !$@ and ++$ok; } } print "There do not seem to be any block ciphers installed (at least none which I can\n" . "use). Crypt::ECB will not be of any use to you unless you install some suitable\n" . "cipher module(s).\n" unless $ok; }