1#!/usr/local/bin/perl 2 3# This script will decrypt a Perl script that has been encrypted using the 4# "encrypt" script. It cannot decrypt any other kind of encrypted Perl script. 5# 6# Usage is decr file... 7# 8 9use strict; 10use warnings; 11 12use vars qw($XOR $BLOCKSIZE $HEADERSIZE $CRYPT_MAGIC_1 $CRYPT_MAGIC_2 13 $size $mode $line $Fingerprint $file $block $sharp_bang $f 14 ) ; 15$XOR = 'Perl' ; 16$BLOCKSIZE = length $XOR ; 17$HEADERSIZE = 2 ; 18$CRYPT_MAGIC_1 = 0xff ; 19$CRYPT_MAGIC_2 = 0x00 ; 20my $Version = 1 ; 21my $module_name = 'Filter::decrypt' ; 22 23my $Fingerprint = pack ("C*", $CRYPT_MAGIC_1, $CRYPT_MAGIC_2) ; 24 25die "Usage: decrypt file...\n" 26 unless @ARGV ; 27 28 29# Loop through each file in turn. 30foreach $file (@ARGV) 31{ 32 if (! -f $file) 33 { 34 print "Skipping directory $file\n" if -d $file ; 35 #print "Skipping strange file $file\n" if ! -d $file ; 36 next ; 37 } 38 39 open (F, "<", $file) || die "Cannot open $file: $!\n" ; 40 binmode F; 41 42 # skip the #! line 43 $a = <F> ; 44 if ($a =~ /^#!/) 45 { 46 $sharp_bang = $a ; 47 $a = <F> ; 48 } 49 50 # skip "use decrypt;" line 51 die "No use $module_name in $file\n" 52 unless $a =~ /use\s+$module_name\s*;/ ; 53 54 read(F, $f, length($Fingerprint)) || die "Cannot read from $file: $!\n" ; 55 (print "skipping file '$file': not encrypted\n"), next 56 unless $f eq $Fingerprint ; 57 58 print "decrypting $file to $file.pd\n" ; 59 open (O, ">", ${file}.".pd") || die "Cannot open ${file}.pd: $!\n" ; 60 binmode O; 61 print O $sharp_bang if $sharp_bang ; 62 while ($size = read(F, $block, $BLOCKSIZE) ) 63 { 64 print O ($block ^ substr($XOR, 0, $size)) ; 65 } 66 67 68 close F ; 69 close O ; 70 71} 72 73