sub encrypt { my $FileHandle = shift; my $cipher = shift; my ($buffer, $cyphertext); while ( read($FileHandle, $buffer, 8) ) { if ( length($buffer) == 8 ) { $cyphertext .= $cipher->encrypt($buffer) } } # reading is done, now deal with padding of last block if ( length($buffer) < 8 ) { my $len = length($buffer); $buffer .= chr( 8 - $len ); for (2..$len) { $buffer.=chr(0) } } elsif ( length($buffer) == 8 ) { # we add a full padding block! $buffer = chr(8); for (2..8) { $buffer.=chr(0) } } else { warn 'We should never have a buffer bigger than 8!!!' } # now encrypt the final block $cyphertext .= $cipher->encrypt($buffer); return $cyphertext; } #___ sub decrypt { my $FileHandle = shift; my $cipher = shift; my ($buffer, $plaintext); while ( read($FileHandle, $buffer, 8) ) { $plaintext .= $cipher->decrypt($buffer); } # trim the padding my $last_chunk = substr($plaintext, -8, 8, ''); #removes last 8, too! # remove for a char followed by a string of chr(00) that's 1-7 long # this should be the padding of 'oneandzeroes' $last_chunk =~ s/(.)(\x00{1,7})/; # check that out to see if it went well warn "Trim went all strange!" if ord($1) != length($2); $plaintext.=$last_chunk; #put it back }