Beefy Boxes and Bandwidth Generously Provided by pair Networks
Clear questions and runnable code
get the best and fastest answer
 
PerlMonks  

Polyglot (crypto)

by beretboy (Chaplain)
on Jun 10, 2001 at 20:56 UTC ( #87315=sourcecode: print w/ replies, xml ) Need Help??

Category: Cryptography
Author/Contact Info Written by beretboy
Description: polyalphabetic encryption algoritm. CANNOT HANDLE MULTILINE. enter on line to be encoded and it will spit out cipher text. run with -d and it will decipher ciphertext
$switch = @ARGV[0];
if ($switch eq "-d")
{
$plaintext = <STDIN>;
@text = split(/ /, $plaintext);
$length = @text;
$i = 0;
$w = 0;
while ($w <= $length) {
if ($i == 0) {
@text[$w] =~ tr/seklbvrfzijdqypcnowmtxuagh/a-z/; 
$i++;
$w++;
next;
}
if ($i == 1) {
@text[$w] =~ tr/elbtjpwdvzqaorfiyxnukmghsc/a-z/; 
$i++;
$w++;
next;
}
if ($i == 2) {
@text[$w] =~ tr/velukbiyxnordctjgpwhzqafms/a-z/; 
$i++;
$w++;
next;
}
if ($i == 3) {
@text[$w] =~ tr/orsdvejwmcbiyhfzlukxntqgpa/a-z/; 
$i++;
$w++;
next;
}
if ($i == 4) {
@text[$w] =~ tr/yxsdicvejqfbhmpluaorgkztwn/a-z/; 
$i++;
$w++;
next;
}
if ($i == 5) {
@text[$w] =~ tr/ejqyxsdkziurgtwcaovfbhmpln/a-z/; 
$i++;
$w++;
next;
}
if ($i == 6) {
@text[$w] =~ tr/jqyhcaxsdlkziuevfrgtwobmpn/a-z/; 
$i++;
$w++;
next;
}
if ($i == 7) {
@text[$w] =~ tr/atdvnsirekmfqhwobjclgypxuz/a-z/; 
$w++;
$i = 0;
next;
}
}
reverse @text;
$ciphertext = join (" ", @text);
print $ciphertext;
} else {
$plaintext = <STDIN>;
$plaintext =~ tr/A-Z/a-z/;
@text = split(/ /, $plaintext);
$length = @text;
$i = 0;
$w = 0;
while ($w <= $length) {
if ($i == 0) {
@text[$w] =~ tr/a-z/seklbvrfzijdqypcnowmtxuagh/; 
$i++;
$w++;
next;
}
if ($i == 1) {
@text[$w] =~ tr/a-z/elbtjpwdvzqaorfiyxnukmghsc/; 
$i++;
$w++;
next;
}
if ($i == 2) {
@text[$w] =~ tr/a-z/velukbiyxnordctjgpwhzqafms/; 
$i++;
$w++;
next;
}
if ($i == 3) {
@text[$w] =~ tr/a-z/orsdvejwmcbiyhfzlukxntqgpa/; 
$i++;
$w++;
next;
}
if ($i == 4) {
@text[$w] =~ tr/a-z/yxsdicvejqfbhmpluaorgkztwn/; 
$i++;
$w++;
next;
}
if ($i == 5) {
@text[$w] =~ tr/a-z/ejqyxsdkziurgtwcaovfbhmpln/; 
$i++;
$w++;
next;
}
if ($i == 6) {
@text[$w] =~ tr/a-z/jqyhcaxsdlkziuevfrgtwobmpn/; 
$i++;
$w++;
next;
}
if ($i == 7) {
@text[$w] =~ tr/a-z/atdvnsirekmfqhwobjclgypxuz/; 
$w++;
$i = 0;
next;
}
}
reverse @text;
$ciphertext = join (" ", @text);
print $ciphertext;
}

Comment on Polyglot (crypto)
Download Code
Re: Polyglot (crypto)
by marcink (Monk) on Jun 10, 2001 at 21:37 UTC
    Just a couple of comments:

    • use arrays instead of all those ifs -- think about the problems you'll get into if you want to add,remove or change one of alphabet sets,
    • use for and foreach instead of array indexes -- they do the same thing with less code and less variables,
    • when accessing a single array element use '$text[$w]' rather than '@text[$w]' -- the first character tells Perl that you want to get a scalar (single) value, not an array,
    • use strict and -w (my generic advice ;-)),


    And my attempt at rewriting your code:

    #!/usr/bin/perl -w use strict; # One array instead of 2x8 if statements my @alphabets = ( "seklbvrfzijdqypcnowmtxuagh", "elbtjpwdvzqaorfiyxnukmghsc", "velukbiyxnordctjgpwhzqafms", "orsdvejwmcbiyhfzlukxntqgpa", "yxsdicvejqfbhmpluaorgkztwn", "ejqyxsdkziurgtwcaovfbhmpln", "jqyhcaxsdlkziuevfrgtwobmpn", "atdvnsirekmfqhwobjclgypxuz" ); my $dec = $ARGV[0] && ($ARGV[0] eq '-d'); # are we decoding? my ( $i, $out ) = ( 0, '' ); foreach ( split / /, <STDIN> ) { # read and split a single li +ne if ( $dec ) { eval "tr/$alphabets[$i]/a-z/"; # decoding tr/// # We need eval because tr/// + does # not allow for substitution +s } else { tr/A-Z/a-z/; eval "tr/a-z/$alphabets[$i]/"; # encoding tr/// -- as above +, # just reversed } $out .= "$_ "; $i = ($i + 1) % @alphabets; # this will walk through 0..7 circle } print "$out\n";


    Update: I just noticed the 'reverse' operations in your code -- I skipped them during rewrite and yet the programs are compatible ;-) 'Reverse' does not modify its argument, so you probably wanted to use @text = reverse @text;

    -mk

Back to Code Catacombs

Log In?
Username:
Password:

What's my password?
Create A New User
Node Status?
node history
Node Type: sourcecode [id://87315]
help
Chatterbox?
and the web crawler heard nothing...

How do I use this? | Other CB clients
Other Users?
Others contemplating the Monastery: (6)
As of 2014-12-26 01:36 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    Is guessing a good strategy for surviving in the IT business?





    Results (163 votes), past polls