| Crypt-OFB documentation | Contained in the Crypt-OFB distribution. |
Crypt::OFB - Encrypt Data using OFB Mode
Use Crypt::OFB OO style
use Crypt::OFB;
$crypt = Crypt::OFB->new;
$crypt->padding(PADDING_AUTO);
$crypt->cipher("Blowfish") || die $crypt->errstring;
$crypt->key("some_key");
$enc = $crypt->encrypt("Some data.");
print $crypt->decrypt($enc);
This module is a Perl-only implementation of the OFB mode. It is a inheritance class of Crypt::ECB. Please read Crypt::ECB(3) for the default function description.
This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version.
This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
Kang-min Liu <gugod@gugod.org>.
perl(1), Crypt::DES(3), Crypt::IDEA(3), Crypt::CBC(3), Crypt::ECB(3)
| Crypt-OFB documentation | Contained in the Crypt-OFB distribution. |
package Crypt::OFB; ######################################## # general module startup things ######################################## use strict; use vars qw(@ISA @EXPORT @EXPORT_OK $VERSION); require Exporter; use Crypt::ECB; @ISA=qw(Crypt::ECB); @EXPORT_OK = qw(encrypt decrypt encrypt_hex decrypt_hex); $VERSION = 0.01; ######################################## # basic methods ######################################## # # sets iv if given # returns iv # sub iv (\$;$) { my $crypt = shift; $crypt->{Iv} = shift if @_; return $crypt->{Iv}; } # # calls the crypting module # returns the en-/decrypted data # sub crypt (\$;$) { my $crypt = shift; my $data = shift || $_ || ''; my $errmsg = $crypt->{Errstring}; my $bs = $crypt->{Blocksize}; my $mode = $crypt->{Mode}; die $errmsg if $errmsg; unless ($mode) { die "You tried to use crypt() without calling start()" . " before. Use '\$your_obj->start(\$mode)' first," . " \$mode being one of 'decrypt' or 'encrypt'.\n"; } $data = $crypt->{buffer}.$data; # data is split into blocks of proper size which is reported # by the cipher module my @blocks = $data=~/(.{1,$bs})/gs; $crypt->{buffer} = pop @blocks; my $cipher = $crypt->_getcipher; my $text = ''; # OFB Implementation here. my $skey = $crypt->iv; foreach my $block (@blocks) { $skey = $cipher->encrypt($skey); $text .= $block ^ $skey; } # return $text; } ######################################## # convenience functions/methods ######################################## # # magic convenience encrypt function/method # sub encrypt ($$;$$) { if (ref($_[0]) =~ /^Crypt/) { my $crypt = shift; $crypt->start('encrypt') || die $crypt->errstring; my $text = $crypt->crypt(shift) . $crypt->finish; return $text; } else { my ($key, $cipher, $data, $padstyle) = @_; my $crypt = Crypt::OFB->new($key); $crypt->padding($padstyle || 0); $crypt->cipher($cipher) || die $crypt->errstring; $crypt->start('encrypt') || die $crypt->errstring; my $text = $crypt->crypt($data || $_) . $crypt->finish; return $text; } } # # magic convenience decrypt function/method # sub decrypt ($$;$$) { if (ref($_[0]) =~ /^Crypt/) { my $crypt = shift; $crypt->start('decrypt') || die $crypt->errstring; my $text = $crypt->crypt(shift) . $crypt->finish; return $text; } else { my ($key, $cipher, $data, $padstyle) = @_; my $crypt = Crypt::OFB->new($key); $crypt->padding($padstyle || 0); $crypt->cipher($cipher) || die $crypt->errstring; $crypt->start('decrypt') || die $crypt->errstring; my $text = $crypt->crypt($data || $_) . $crypt->finish; return $text; } } # # calls encrypt, returns hex packed data # sub encrypt_hex ($$;$$) { if (ref($_[0]) =~ /^Crypt/) { my $crypt = shift; join('',unpack('H*',$crypt->encrypt(shift))); } else { join('',unpack('H*',encrypt($_[0], $_[1], $_[2], $_[3]))); } } # # calls decrypt, expected input is hex packed # sub decrypt_hex ($$;$$) { if (ref($_[0]) =~ /^Crypt/) { my $crypt = shift; $crypt->decrypt(pack('H*',shift)); } else { decrypt($_[0], $_[1], pack('H*',$_[2]), $_[3]); } } ######################################## # finally, to satisfy require ######################################## 1; __END__