#!/usr/bin/perl
use strict;
use warnings;
my $pass = '(6\!_I\=";I4U( '
my $pass2 = decrypt( $pass) ;
print "Decrypted: $pass2\n " ;
$pass2 = decrypt( $pass2) ;
print "Decrypted: $pass2\n " ;
if ( $pass ne $pass2) {
print "Test Failed!\n " ;
}
sub encrypt {
my $pass = shift;
my $strTarget = XORString( $pass) ;
$strTarget = StringToHex( $strTarget) ;
return $strTarget;
}
sub decrypt {
my $pass = shift;
my $strTarget = HexToString( $pass) ;
$strTarget = XORString( $strTarget) ;
return $strTarget;
}
sub GetKeyForLength {
my $nLength = shift;
my $nKeyLen = length '4p0L@r1$' ;
my $nRepeats = $nLength / $nKeyLen + 1 ;
my $strResult = '4p0L@r1$' x $nRepeats;
return substr $strResult, 0 , $nLength;
}
sub HexToString {
my $str = shift;
my @bytes;
while ( $str = ~ s/^ ( ..) //) {
my $b = eval( "0x$1" ) ;
push @bytes
, chr
sprintf ( "%d" , $b
) ; }
return join "" , @bytes;
}
sub XORString {
my $strTarget = shift;
my $nTargetLen = length $strTarget;
my $strPaddedKey = GetKeyForLength( $nTargetLen) ;
my @bytes;
while ( $strTarget) {
my $b = ( chop $strTarget) ^ ( chop $strPaddedKey) ;
unshift @bytes, $b;
}
return join "" , @bytes;
}
sub StringToHex {
my $strInput = shift;
my $hex = "" ;
for my $ch ( split //, $strInput) {
}
return $hex;
}
IyEvdXNyL2Jpbi9wZXJsCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKCm15ICRwYXNzID0gJyg2XCFfSVw9IjtJNFUoICcKbXkgJHBhc3MyID0gZGVjcnlwdCgkcGFzcyk7CnByaW50ICJEZWNyeXB0ZWQ6ICRwYXNzMlxuIjsKJHBhc3MyID0gZGVjcnlwdCgkcGFzczIpOwpwcmludCAiRGVjcnlwdGVkOiAkcGFzczJcbiI7CmlmICgkcGFzcyBuZSAkcGFzczIpIHsKICAgIHByaW50ICJUZXN0IEZhaWxlZCFcbiI7CiAgICBleGl0KC0xKTsKfQoKc3ViIGVuY3J5cHQgewogICAgbXkgJHBhc3MgPSBzaGlmdDsKICAgIG15ICRzdHJUYXJnZXQgPSBYT1JTdHJpbmcoJHBhc3MpOwogICAgJHN0clRhcmdldCA9IFN0cmluZ1RvSGV4KCRzdHJUYXJnZXQpOwogICAgcmV0dXJuICRzdHJUYXJnZXQ7Cn0KCnN1YiBkZWNyeXB0IHsKICAgIG15ICRwYXNzID0gc2hpZnQ7CiAgICBteSAkc3RyVGFyZ2V0ID0gSGV4VG9TdHJpbmcoJHBhc3MpOwogICAgJHN0clRhcmdldCA9IFhPUlN0cmluZygkc3RyVGFyZ2V0KTsKICAgIHJldHVybiAkc3RyVGFyZ2V0Owp9CgpzdWIgR2V0S2V5Rm9yTGVuZ3RoIHsKICAgIG15ICRuTGVuZ3RoID0gc2hpZnQ7CiAgICBteSAkbktleUxlbiA9IGxlbmd0aCAnNHAwTEByMSQnOwogICAgbXkgJG5SZXBlYXRzID0gJG5MZW5ndGggLyAkbktleUxlbiArIDE7CiAgICBteSAkc3RyUmVzdWx0ID0gJzRwMExAcjEkJyB4ICRuUmVwZWF0czsKICAgIHJldHVybiBzdWJzdHIgJHN0clJlc3VsdCwgMCwgJG5MZW5ndGg7Cn0KCnN1YiBIZXhUb1N0cmluZyB7CiAgICBteSAkc3RyID0gc2hpZnQ7CiAgICBteSBAYnl0ZXM7CgogICAgd2hpbGUgKCRzdHIgPX4gcy9eKC4uKS8vKSB7CiAgICAgICAgbXkgJGIgPSBldmFsKCIweCQxIik7CiAgICAgICAgcHVzaCBAYnl0ZXMsIGNociBzcHJpbnRmKCIlZCIsICRiKTsKICAgIH0KICAgIHJldHVybiBqb2luICIiLCBAYnl0ZXM7Cn0KCnN1YiBYT1JTdHJpbmcgewogICAgbXkgJHN0clRhcmdldCA9IHNoaWZ0OwogICAgbXkgJG5UYXJnZXRMZW4gPSBsZW5ndGggJHN0clRhcmdldDsKICAgIG15ICRzdHJQYWRkZWRLZXkgPSBHZXRLZXlGb3JMZW5ndGgoJG5UYXJnZXRMZW4pOwogICAgbXkgQGJ5dGVzOwoKICAgIHdoaWxlICgkc3RyVGFyZ2V0KSB7CiAgICAgICAgbXkgJGIgPSAoY2hvcCAkc3RyVGFyZ2V0KSBeIChjaG9wICRzdHJQYWRkZWRLZXkpOwogICAgICAgIHVuc2hpZnQgQGJ5dGVzLCAkYjsKICAgIH0KICAgIHJldHVybiBqb2luICIiLCBAYnl0ZXM7Cn0KCnN1YiBTdHJpbmdUb0hleCB7CiAgICBteSAkc3RySW5wdXQgPSBzaGlmdDsKICAgIG15ICRoZXggPSAiIjsKICAgIGZvciBteSAkY2ggKHNwbGl0IC8vLCAkc3RySW5wdXQpIHsKICAgICAgICAkaGV4IC49IHNwcmludGYoIiUwMngiLCBvcmQgJGNoKTsKICAgIH0KICAgIHJldHVybiAkaGV4Owp9Cg==