Fun with randomness

One-time pads are an old-fashoned way of doing cryptography, not used much these days. On the other hand, they are as secure as the random device is random. (Want a better random device? here's one.)

I've been meaning to write this code for a while now:

#!/usr/bin/perl
## crypt-otp.pl ##
if (@ARGV OUTPUT\n";
    exit 1;
}
my $a_file = shift @ARGV;
my $b_file = shift @ARGV;
open(OTP, "< $a_file");
open(PTX, "< $b_file");
while (read(PTX,$b,1)) {
    read(OTP,$a,1) or die "Out of otp.";
    print $a ^ $b;
}

Here's how to use it.

$ head -c 10k /dev/random > otp.data
$ ./crypt-otp.pl otp.data file > file.crypt
$ ./crypt-otp.pl otp.data file.crypt | less

Here's how NOT to use it:

$ perl -e 'for $x (1..1000) {print "PASSWORD"}' > badotp
$ gzip < file | ./crypt-otp.pl  badotp - > x
$ ./crypt-otp.pl badotp x | gunzip - | less

If /dev/random hangs, jiggle your mouse for a while to build up entropy. If you input file is biger than your OTP, then it won't work. That's the one part of one-time. So make a bigger OTP by changing the argument to head.