Anonymous Monk has asked for the wisdom of the Perl Monks concerning the following question:

Hello, I know this is a simple question. I seek the masters of perls advice however. Can someone show me a simple XOR decryption routine. In case any of you wonder, the decryption scheme that I am trying to decrypt with XOR is at: http://www.lingo.de/wwwboard/messages/XOR_encryption.htm

Replies are listed 'Best First'.
Re: XOR decryption
by tye (Sage) on Aug 23, 2000 at 01:27 UTC
    sub xor_befuddle { my( $cleartext, $onetimepad )= @_; $onetimepad .= $onetimepad while length($onetimepad) < length($cleartext); return $cleartext ^ substr( $onetimepad, 0, length($cleartext) ); }
            - tye (but my friends call me "Tye")
Re: XOR decryption
by young perlhopper (Scribe) on Aug 23, 2000 at 01:14 UTC
    Well, you can use unpack to get the ascii values of the string into an array like: (courtesy of PCB)

    @array = unpack("C*", $string);

    and then go through the array doing the xoring like this:

    foreach $char (@array) { push (@xor_array, ($char ^ (shift @crypt_array))); }
    @xor_array now contains the result of all the xoring you did.

    That said, I really hope you are just doing this as a learning exercise because this is an incredibly insecure way to do encryption. Even if the xor string (your one time pad) is *truly* random, the algorithm calls for repeating it if you run out. As soon as you do that the cipher text can be cracked easily. Also, if your pad is not truly random, it doesn't matter whether you repeat it or not.

    Hope this helps,
    Mark

Re: XOR decryption
by Cirollo (Friar) on Aug 23, 2000 at 01:24 UTC
    If you want to do real encryption, Seach CPAN for the Crypt modules.