1#!perl 2require 5.002 ; 3 4use strict; 5use warnings; 6 7use vars qw($XOR $BLOCKSIZE $HEADERSIZE $CRYPT_MAGIC_1 $CRYPT_MAGIC_2 8 $size $mode $line $Fingerprint $file $block 9 ) ; 10 11$XOR = 'Perl' ; 12$BLOCKSIZE = length $XOR ; 13$HEADERSIZE = 2 ; 14$CRYPT_MAGIC_1 = 0xff ; 15$CRYPT_MAGIC_2 = 0x00 ; 16 17$Fingerprint = pack ("C*", $CRYPT_MAGIC_1, $CRYPT_MAGIC_2) ; 18 19die "Usage: encrypt file...\n" 20 unless @ARGV ; 21 22# Loop throught each file in turn. 23foreach $file (@ARGV) 24{ 25 26 if (! -T $file) 27 { 28 print "Skipping directory $file\n" if -d $file ; 29 print "Skipping non-text $file\n" if ! -d $file ; 30 next ; 31 } 32 33 open (F, "<", $file) or die "Cannot open $file: $!\n" ; 34 binmode F; 35 open (O, ">", ${file}.".pe") or die "Cannot open ${file}.pe: $!\n" ; 36 binmode O; 37 38 # Get the mode 39 $mode = (stat F)[2] ; 40 41 # Check for "#!perl" line 42 $line = <F> ; 43 44 if ( $line =~ /^#!/ ) 45 { print O $line } 46 else 47 { seek F, 0, 0 } 48 49 print O "use Filter::decrypt ;\n" ; 50 print O $Fingerprint ; 51 52 53 $block = ''; 54 while ($size = read(F, $block, $BLOCKSIZE) ) 55 { 56 print O ($block ^ substr($XOR, 0, length $block)) ; 57 } 58 59 close F ; 60 close O ; 61 62 unlink ($file) 63 or die "Could not remove '$file': $!\n" ; 64 65 rename ("${file}.pe", $file) 66 or die "Could not rename $file.pe to $file: $!\n" ; 67 68 chmod $mode, $file unless $^O eq 'MSWin32' ; 69 70 print "encrypted $file\n" ; 71} 72 73