#!/usr/bin/perl -w use strict; if( $#ARGV < 0 ) { die "$0 \n"; } my $key = shift; $key =~ s/[^a-zA-Z]//g; $key ||= "a"; my @offsets = map {$_ <= ord('Z') ? ord('A') - $_ + 26 : $_ - ord('a')} unpack 'C*', $key; my $index = 0; while( my $line = <> ) { foreach my $i (unpack 'C*', $line) { my $c = chr($i); if( $c =~ /[a-zA-Z]/ ) { my $offset = $offsets[$index++]; $index %= length($key); $c = ($c eq lc($c)) ? chr(($i - ord('a') + $offset) % 26 + ord('a')) : chr(($i - ord('A') + $offset) % 26 + ord('A')); } print $c; } }