use strict; while(){ chomp; /(\d+)\s+([_a-z.]+)/ or last; my $plaintext = decipher($1, $2); print "$plaintext\n"; } sub decipher { $,=0;($;,$_)=@_;@;{@;{0..27}=('_','a'..'z','.')}=0..27;$;[$;*$,++%@_]=$;{($;{$_}+$,)%28}for@_=/./g;join'',@; } __DATA__ 5 cs. 101 thqqxw.lui.qswer 3 b_ylxmhzjsys.virpbkr 0 #### sub decipher { my($k,@r,%b,@s)=@_;@s=pop=~/./g;@b{@b{0..27}=('_','a'..'z','.')}=0..27;$r[$k*$_%@s]=$b{($b{$s[$_]}+$_)%28}for 0..$#s;join'',@r }