#!/usr/bin/perl -tw # rotten.pl - take a text scream via sdtin ("file |rotation.pl <#>" or "rotation.pl <#> < file") # and output each character shifted (or 'rotated') a given number of positions up or down the character group, # which is stored in an array. The array of characters startes from the Decimal value 32 (" ") and goes to "~" by # default. This set will work for any english language text, but will need to be expanded or altered for other # languages. the name rotten comes from the type of cipher, ROT(N) # # If this looks familiar, its because ROT13 and ROT47 is what it's based on. This script merely allows for non # alpha-numeric characters to be endcoded (limited to the current character set in the array below), and allows # for a shift value of other than 13 or 47 to be used (why? good question, guess variation is the spice of life, # and having the oportunity to tweak the character set and shift value further obfuscates text, although sharing the # resulting text requires collaboration ahead of time). # # To decode text repeat the process with either the negative value of <#> or <#>'s compliment (character set length # - <#>). # # Use this script in full or in part however with or without attribution to its creator (search google for # "ROT13 ROT47" and you quickly see that this notion is not new, therefore this version of the same thing # deserves no special distinction; specifically, see http://en.wikipedia.org/wiki/ROT13 as to why you really # don't want to use this Caeser cipher for important data...). # my $DEBUG=0; my $rotate = shift; $rotate = 13 unless $rotate =~ /^\d+?$/; my $text = ""; while (<>) { $text .= $_; } my @txtAry = split ("",$text); # ASCI char short list array - ASCII character array used for A-Za-z case insensative my @alphabet = ('a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z'); # ASCI char long list array - ASCII character set beginning at Dec 32m Hex 20 #my @alphabet = (" ","!","\"","\#","\$","\%","\&","\'","\(","\)","\*","+",",","-",".","/","0","1","2","3","4","5","6","7","8","9",":",";","<","=",">","?","@","A","B","C","D","E","F","G","H","I","J","K","L","M","N","O","P","Q","R","S","T","U","V","W","X","Y","Z","[","\\","]","^","_","`","a","b","c","d","e","f","g","h","i","j","k","l","m","n","o","p","q","r","s","t","u","v","w","x","y","z","{","|","}","~"); #my @alphabet = ("a","b","c","d","e","f","g","h","i","j","k","l","m","n","o","p","q","r","s","t","u","v","w","x","y","z","A","B","C","D","E","F","G","H","I","J","K","L","M","N","O","P","Q","R","S","T","U","V","W","X","Y","Z"); my $alpha_len = @alphabet; # $rotate = $aplha_len - $rotate if $rotate < 0 && ! $rotate >= $aphla_len; my $offset = 0; print "Rotate: $rotate\nText: $text\nText Array:" . @txtAry ."\n" if $DEBUG==1; foreach ( @txtAry ) { my $found = 0; for ( my $i=0; $i<$alpha_len && $found != 1; $i++ ) { # if ( lc($_) eq $alphabet[$i] ) { # Used for ASCII char short list array if ( $_ eq $alphabet[$i] ) { # Used for ASCII char long list array print "DEBUG: found $_ at $i...\n" if $DEBUG==1; $offset = ($i + $rotate ) % $alpha_len; $_ = $alphabet[$offset]; $found = 1; print "DEBUG: Finished $_ ($offset])\n" if $DEBUG==1; } else { print "DEBUG: $_ does not equal ($alphabet[$i])\n" if $DEBUG==1; } } } my $newtext = join("", @txtAry); print "$text\n" if $DEBUG==1; print "$newtext\n";