in reply to Unbreakable
Congrats on getting Steeeeeve's cipher working :-) I'm not sure that decrypting a previously encrypted string is really an obfu though. Here is an interesting feature of this cipher. It is perfectly symetric thus you can use the enciper sub to both encipher and decipher. Or you can use the decipher sub the same. As such there is quite a bit of redundant code. Here is a demo with the MeowChow (c) patches applied. I have just dumped the module in to save hassles running the examples. As I am using your key we see that funny bit of text in your example upon encoding and JAPH on decoding.
my $ecret = 'L33T_CYPH3RP0NK'; my $n_Cr1pT0r = CipherTextI->new("R_KEY=$ecret"); my $code = $n_Cr1pT0r->encipher('Just Another Perl Hacker'); my $decode = $n_Cr1pT0r->encipher($code); print $code, "\n", $decode, "\n"; my $code = $n_Cr1pT0r->decipher('Just Another Perl Hacker'); my $decode = $n_Cr1pT0r->decipher($code); print $code, "\n", $decode, "\n"; # CipherTextI.pm # # Charles Prichard 6-16-01 # # ################################################# package CipherTextI; use strict; use integer; use bytes; ################################################# # PUBLIC Subroutine # ################################################# sub new($) { my $class = shift; my $self = {}; bless $self, ref $class || $class; $self->{xString} = undef; $self->{xStr} = undef; $self->{R_KEY} = undef; $self->{ATT} = undef; $self->{S_KEY} = undef; $self->{cipher_key} = undef; $self->{RSORT} = []; $self->init(@_); return $self; } sub init($){ my $self = shift; my ($params) = shift; my @temp1 = split /\;/, $params; my %params = (); my @temp2=(); foreach my $x (@temp1){ @temp2 = split /\=/, $x; $self->{$temp2[0]} = $temp2[1]; } $self->{RSORT} = [3,28,7,5,39,62,34,32,56,18,17,6,29,49,63,45,13,1 +3,29,40,2,17,17,9,12,61,56,23,55,37,31,13,27,52,8,23,38,53,9,60,31,30 +,39,27,37,14,14,34,8,29,58,10,25,3,19,37,11,35,52,39,48,24,22,19]; $self->{S_KEY} = $self->Make_shiftedKeys(); return; } ################################################# # PUBLIC Subroutine # ################################################# sub encipher($) { my $self = shift; my $MSG = shift;; $MSG = $self->Encode($self->Encode($MSG,$self->{R_KEY}),$self->{S_ +KEY}); return $MSG; } ################################################# # PUBLIC Subroutine # ################################################# sub decipher { my $self = shift; my $MSG = shift;; $MSG = $self->Decode($self->Decode($MSG,$self->{S_KEY}),$self->{R_ +KEY}); return $MSG; } ################################################# # PRIVATE Subroutine # ################################################# sub Make_shiftedKeys(){ my $self = shift; my $shift = $self->setAttribute(); $self->{S_KEY} = $self->modifyKeys(); if (($shift % 2) == 1){$self->{S_KEY} = (substr($self->{S_KEY},1,( +length $self->{S_KEY})));} else {$self->{S_KEY} = (substr($self->{S_KEY},0,(length $self->{S_ +KEY}) - 1));} my $key; my $v; for (my $i=0; $i <= ($shift - 1) % length $self->{S_KEY}; $i++){ + my $key = substr($self->{S_KEY},0,1); $v = ord($key) - 32; $self->{S_KEY} = (substr($self->{S_KEY},1,(length $self->{ +S_KEY}) - 1)); $self->{S_KEY} .= chr($v ^ $self->{RSORT}[$v] + 32); } return $self->{S_KEY}; } ################################################# # PRIVATE Subroutine # ################################################# sub setAttribute(){ my $self = shift; $self->{ATT} = 0x00; for (my $i=0; $i < (length $self->{R_KEY}); $i++){ $self->{ATT} = $self->{ATT} ^ (ord(substr($self->{R_KEY},$i,1) +) - 0x20); } return $self->{ATT}; } ################################################# # PRIVATE Subroutine # ################################################# sub modifyKeys { my $self = shift; my $S_KEY = ""; my ($i, $x); for my $x (0..length($self->{R_KEY})-1) { $i = ord(substr($self->{R_KEY}, $x, 1)) - 32; $S_KEY .= chr(($i ^ $self->{RSORT}[$i] ^ $self->{ATT}) + 32) } return $S_KEY; } ################################################# # PRIVATE Subroutine # ################################################# sub Encode($$){ my $self = shift; $self->{xString} = shift; $self->{cipher_key} = shift; $self->cipher(); return $self->{xStr}; } ################################################# # PRIVATE Subroutine # ################################################# sub Decode($$){ my $self = shift; $self->{xString} = shift; $self->{cipher_key} = shift; $self->cipher(); return $self->{xStr}; } ################################################# # PRIVATE Subroutine # ################################################# sub cipher(){ my $self = shift; $self->{xStr} = ""; my $keyval; my $xch; my @akeys = split "",$self->{cipher_key}; my $keylen = length $self->{cipher_key}; my $i = (length ($self->{xString}) % $keylen); # DATA DEPENDEN +T SHIFT for(my $x=0; $x < length ($self->{xString}); $x++){ $keyval = ord($akeys[$i]) - 0x20; $xch = ord(substr($self->{xString},$x,1)); if ($xch > 0x7f){ $xch = $xch - 0x21;} if ($xch > 0x1f){ $xch = ($keyval ^ ($xch - 0x20)) + 0x20; # Apply ciph +er } if ($xch > 0x7f){ $xch = $xch + 0x21;} $self->{xStr} .= chr($xch); $i++; if ($i == $keylen){$i = 0;} } return; } 1;
cheers
tachyon
s&&rsenoyhcatreve&&&s&n.+t&"$'$`$\"$\&"&ee&&y&srve&&d&&print
|
|---|