use strict; use warnings; sub getcryptkey { return 'ABCDEFGHIJK'; } { ##### WRITER ##### my @records = ( [ 0, 1, 2 ], [ 3, 4, 5 ], [ 6, 7, 8 ], ); my $newenckey = getcryptkey(); local *PASSF; open(PASSF, ">$ENV{HOME}/.perlpasswd") or die("Can't write $ENV{HOME}/.perlpasswd: $!\n"); binmode(PASSF); my $buf = ''; foreach (@records) { # Might want to use FreezeThaw instead. $buf .= "$_->[0] $_->[1] $_->[2]\n"; print PASSF substr($buf, 0, length($newenckey), '') ^ $newenckey while (length($buf) >= length($newenckey)); } print PASSF $buf ^ substr($newenckey, 0, length($buf)); close(PASSF); } { ##### READER ##### my @records; my $newenckey = getcryptkey(); local *PASSF; open(PASSF, "<$ENV{HOME}/.perlpasswd") or die("Can't read $ENV{HOME}/.perlpasswd: $!\n"); binmode(PASSF); my $buf_e = ''; my $buf_d = ''; my $BLOCK_SIZE = length($newenckey); # Can be anything. while (sysread(PASSF, $buf_e, $BLOCK_SIZE, length($buf_e))) { $buf_d .= substr($buf_e, 0, length($newenckey), '') ^ $newenckey while (length($buf_e) >= length($newenckey)); push(@records, [ $1, $2, $3 ]) while ($buf_d =~ s/^(\S+)\s+(\S+)\s+(\S+)\n//s); } $buf_d .= $buf_e ^ substr($newenckey, 0, length($buf_e)); push(@records, [ $1, $2, $3 ]) while ($buf_d =~ s/^(\S+)\s+(\S+)\s+(\S+)\n//s); close(PASSF); require Data::Dumper; print(Data::Dumper::Dumper(\@records)); } __END__ ##### OUTPUT ##### $VAR1 = [ [ '0', '1', '2' ], [ '3', '4', '5' ], [ '6', '7', '8' ] ];