A number of the folks I work with have been using Cryptopad for a while now. I hadn't messed with the code in quite a while, so I figured I'd clean things up a bit, add a few more algorithms, etc., etc. At any rate, here it is...hopefully you'll find it useful. I'd appreciate it any constructive comments.
#--------------------------------------------------------------------#
# CryptoPad
# Date Written: 07-Nov-2001 09:29:47 AM
# Last Modified: 30-Sep-2003 08:01:44 PM
# Author: Kurt Kincaid (sifukurt@yahoo.com)
# Copyright(c) 2003, Kurt Kincaid
# All Rights Reserved
#
# NOTICE: This package is free software and may be modified and/or
# redistributed under the same terms as Perl itself.
#--------------------------------------------------------------------#
use Tk;
use Tk::Dialog;
use Tk::DialogBox;
use Tk::Text;
use Tk::FileSelect;
use Tk::FileDialog;
use Tk::Menu;
use Tk::Menubutton;
use Tk::widgets qw(Menu);
use Tk::Checkbutton;
use Tk::BrowseEntry;
use File::Butler;
use File::Glob;
use Crypt::RC4;
use Crypt::GOST_PP;
use Crypt::TripleDES;
use Crypt::CBC;
use Crypt::Rijndael;
use Crypt::RIPEMD160;
use Crypt::PPDES;
use Crypt::RC5;
use Crypt::CBC;
use Crypt::CAST5;
use Crypt::RC6;
use Crypt::Khazad;
use Crypt::Anubis;
use Crypt::Blowfish;
use Crypt::Twofish2;
use Crypt::Noekeon;
use Crypt::Misty1;
use Crypt::Rainbow;
use Crypt::Serpent;
use Crypt::Skipjack;
use URI::Escape;
use MIME::Base64;
use Digest::MD2;
use Digest::MD4;
use Digest::MD5;
use Digest::SHA1;
use Digest::Haval256;
use Acme::Playwright;
use constant;
use strict;
use vars qw/ $temp_var $cipher $info $t $title $enc_type $mw $passphra
+se
$ref $algorithm $f $fileName $ea $help $saveas $des $aes $hex
$hex2 $hex3 $hex4 $hex5 $hex6 $tripledes_header $tripledes_footer
$rc4_header $rc4_footer $rc5_header $rc5_footer $cast5_header
$cast5_footer $gost_header $gost_footer $m $fname $mod_date $FSref
$ripemd $aes_header $aes_footer $VERSION $mm $tt $md2 $md4 $md5
$helptext $help_label $error @lines $sha $play_header $play_footer
$anubis_header $anubis_footer %enc %dec $blowfish_header $blowfish_f
+ooter
$khazad_header $khazad_footer $noekeon_header $noekeon_footer $misty
+1_header
$misty1_footer $rainbow_header $rainbow_footer $rc6_header $rc6_foot
+er
$serpent_header $serpent_footer $skipjack_header $skipjack_footer
$twofish_header $twofish_footer $haval $proc /;
$VERSION = "3.10.01";
$mod_date = "30-Sep-2003 08:01:44 PM";
$title = "Cryptopad v" . $VERSION;
$rc4_header = "----- CryptoPad RC4 Encrypted Message: Begin ----
+-\n";
$rc4_footer = "\n----- CryptoPad RC4 Encrypted Message: End ----
+-";
$tripledes_header = "----- CryptoPad TripleDES Encrypted Message: Begi
+n -----\n";
$tripledes_footer = "\n----- CryptoPad TripleDES Encrypted Message: En
+d -----";
$aes_header = "----- CryptoPad AES (Rijndael) Encrypted Message:
+ Begin -----\n";
$aes_footer = "\n----- CryptoPad AES (Rijndael) Encrypted Messag
+e: End -----";
$gost_header = "----- CryptoPad GOST Encrypted Message: Begin ---
+--\n";
$gost_footer = "\n----- CryptoPad GOST Encrypted Message: End ---
+--";
$rc5_header = "----- CryptoPad RC5 Encrypted Message: Begin ----
+-\n";
$rc5_footer = "\n----- CryptoPad RC5 Encrypted Message: End ----
+-";
$cast5_header = "----- CryptoPad CAST5 Encrypted Message: Begin --
+---\n";
$cast5_footer = "\n----- CryptoPad CAST5 Encrypted Message: End --
+---";
$play_header = "----- CryptoPad Acme::Playwright Encrypted Messag
+e: Begin -----\n";
$play_footer = "\n----- CryptoPad Acme::Playwright Encrypted Mess
+age: End -----";
$anubis_header = "----- CryptoPad Anubis Encrypted Message: Begin -
+----\n";
$anubis_footer = "\n----- CrtypoPad Anubis Encrypted Message: End -
+----";
$blowfish_header = "----- CryptoPad Blowfish Encrypted Message: Begin
+ -----\n";
$blowfish_footer = "\n----- CrtypoPad Blowfish Encrypted Message: End
+ -----";
$khazad_header = "----- CryptoPad Khazad Encrypted Message: Begin -
+----\n";
$khazad_footer = "\n----- CrtypoPad Khazad Encrypted Message: End -
+----";
$noekeon_header = "----- CryptoPad Noekeon Encrypted Message: Begin
+-----\n";
$noekeon_footer = "\n----- CrtypoPad Noekeon Encrypted Message: End
+-----";
$misty1_header = "----- CryptoPad Misty1 Encrypted Message: Begin -
+----\n";
$misty1_footer = "\n----- CrtypoPad Misty1 Encrypted Message: End -
+----";
$rainbow_header = "----- CryptoPad Rainbow Encrypted Message: Begin
+-----\n";
$rainbow_footer = "\n----- CrtypoPad Rainbow Encrypted Message: End
+-----";
$rc6_header = "----- CryptoPad RC6 Encrypted Message: Begin ----
+-\n";
$rc6_footer = "\n----- CrtypoPad RC6 Encrypted Message: End ----
+-";
$serpent_header = "----- CryptoPad Serpent Encrypted Message: Begin
+-----\n";
$serpent_footer = "\n----- CrtypoPad Serpent Encrypted Message: End
+-----";
$skipjack_header = "----- CryptoPad Skipjack Encrypted Message: Begin
+ -----\n";
$skipjack_footer = "\n----- CrtypoPad Skipjack Encrypted Message: End
+ -----";
$twofish_header = "----- CryptoPad Twofish Encrypted Message: Begin
+-----\n";
$twofish_footer = "\n----- CrtypoPad Twofish Encrypted Message: End
+-----";
$proc = "Processing....";
%enc = (
'aes' => \&aes_encrypt,
'tripledes' => \&tripledes_encrypt,
'gost' => \&gost_encrypt,
'rc4' => \&rc4_encrypt,
'rc5' => \&rc5_encrypt,
'rc6' => \&rc6_encrypt,
'cast5' => \&cast5_encrypt,
'playwright' => \&playwright_encrypt,
'anubis' => \&anubis_encrypt,
'blowfish' => \&blowfish_encrypt,
'khazad' => \&khazad_encrypt,
'misty1' => \&misty1_encrypt,
'noekeon' => \&noekeon_encrypt,
'serpent' => \&serpent_encrypt,
'skipjack' => \&skipjack_encrypt,
'twofish' => \&twofish_encrypt,
'rainbow' => \&rainbow_encrypt
);
%dec = (
'aes' => \&aes_decrypt,
'tripledes' => \&tripledes_decrypt,
'gost' => \&gost_decrypt,
'rc4' => \&rc4_decrypt,
'rc5' => \&rc5_decrypt,
'rc6' => \&rc6_decrypt,
'cast5' => \&cast5_decrypt,
'playwright' => \&playwright_decrypt,
'anubis' => \&anubis_decrypt,
'blowfish' => \&blowfish_decrypt,
'khazad' => \&khazad_decrypt,
'misty1' => \&misty1_decrypt,
'noekeon' => \&noekeon_decrypt,
'serpent' => \&serpent_decrypt,
'skipjack' => \&skipjack_decrypt,
'twofish' => \&twofish_decrypt,
'rainbow' => \&rainbow_decrypt
);
$mw = MainWindow->new;
$mw->title( $title );
$m = $mw->Frame( -relief => 'groove', -bd => 2 )->pack( -side => 'top'
+, -anchor => 'n', -fill => 'x' );
$m->Menubutton(
-text => "File",
-tearoff => 0,
-menuitems => [
[
"command" => "New",
-command => \&clear
],
[
"command" => "Open",
-command => \&OpenDocument
],
[
"command" => "Save",
-command => \&SaveDocument
],
[
"command" => "Save As",
-command => \&SaveAs
],
[
"command" => "Exit",
-command => sub { exit }
]
]
)->pack( -side => 'left' );
$ea = "ENCRYPTION ALGORITHM:";
$m->Menubutton(
-text => "Algorithm",
-tearoff => 0,
-menuitems => [
[
"command" => "AES",
-command => sub { $algorithm = "$ea AES"; $enc_type = "aes
+"; }
],
[
"command" => "Anubis",
-command => sub { $algorithm = "$ea Anubis"; $enc_type = "
+anubis"; }
],
[
"command" => "Blowfish",
-command => sub { $algorithm = "$ea Blowfish"; $enc_type =
+ "blowfish"; }
],
[
"command" => "CAST5",
-command => sub { $algorithm = "$ea CAST5"; $enc_type = "c
+ast5"; }
],
[
"command" => "GOST",
-command => sub { $algorithm = "$ea GOST"; $enc_type = "go
+st"; }
],
[
"command" => "Khazad",
-command => sub { $algorithm = "$ea Khazad"; $enc_type = "
+khazad"; }
],
[
"command" => "Misty1",
-command => sub { $algorithm = "$ea Misty1"; $enc_type = "
+misty1"; }
],
[
"command" => "Noekeon",
-command => sub { $algorithm = "$ea Noekeon"; $enc_type =
+"noekeon"; }
],
[
"command" => "Rainbow",
-command => sub { $algorithm = "$ea Rainbow"; $enc_type =
+"rainbow"; }
],
[
"command" => "RC4",
-command => sub { $algorithm = "$ea RC4"; $enc_type = "rc4
+"; }
],
[
"command" => "RC5",
-command => sub { $algorithm = "$ea RC5"; $enc_type = "rc5
+"; }
],
[
"command" => "RC6",
-command => sub { $algorithm = "$ea RC6"; $enc_type = "rc6
+"; }
],
[
"command" => "Serpent",
-command => sub { $algorithm = "$ea Serpent"; $enc_type =
+"serpent"; }
],
[
"command" => "Skipjack",
-command => sub { $algorithm = "$ea Skipjack"; $enc_type =
+ "skipjack"; }
],
[
"command" => "TripleDES",
-command => sub { $algorithm = "$ea TripleDES"; $enc_type
+= "tripledes"; }
],
[
"command" => "Twofish",
-command => sub { $algorithm = "$ea Twofish"; $enc_type =
+"twofish"; }
],
[
"command" => "Acme::Playwright",
-command => sub {
$algorithm = "$ea Acme::Playwright";
$enc_type = "playwright";
}
]
]
)->pack( -side => 'left' );
$m->Menubutton(
-text => "Help",
-tearoff => 0,
-menuitems => [
[
"command" => "Help...",
-command => \&help
],
[
"command" => "About...",
-command => \&about
]
]
)->pack( -side => 'left' );
my $font = $mw->Frame( -bd => 2 )->pack( -side => 'top', -anchor =>
+'n', -fill => 'x' );
my $family = 'Courier';
my $be = $font->BrowseEntry( -label => 'Font: ', -variable=> \$fam
+ily,
-browsecmd => \&apply_font)->pack( -fill
+=> 'x', -side => 'left', -anchor => 'n' );
$be->insert( 'end', sort $mw->fontFamilies );
my $size = 10;
my $bentry = $font->BrowseEntry(-label => 'Size: ', -variable => \$siz
+e,
-browsecmd => \&apply_font)->pack(-side =
+> 'left');
$bentry->insert( 'end', (3..32));
my $weight = 'normal';
$font->Checkbutton( -onvalue => 'bold', -offvalue=> 'normal',
-text => 'Bold', -variable => \$weight,
-command => \&apply_font)->pack(-side => 'left' );
my $slant = 'roman';
$font->Checkbutton(-onvalue => 'italic', -offvalue => 'roman',
-text => 'Italic', -variable => \$slant,
-command => \&apply_font)->pack( -side => 'left' );
my $underline = 0;
$font->Checkbutton(-text => 'Underline', -variable => \$underline,
-command => \&apply_font)->pack(-side => 'left' );
my $overstrike = 0;
$font->Checkbutton(-text => 'Overstrike', -variable => \$overstrike,
-command => \&apply_font)->pack(-side => 'left' );
$f = $mw->Frame->pack( -side => 'top', -fill => 'x' );
$f->Label( -text => "Passphrase:" )->pack( -side => 'left', -anchor =>
+ 'w' );
$f->Entry( -show => '*', -textvariable => \$passphrase )->pack(
-side => 'left',
-anchor => 'w',
-fill => 'x',
-expand => 1
);
$f->Button( -text => "Message Digest", -command => \&Digest )->pack( -
+side => 'right' );
$f->Button( -text => "Decrypt", -command => \&decrypt )->pack( -side =
+> 'right', -anchor => 'e' );
$f->Button( -text => "Encrypt", -command => \&encrypt )->pack( -side =
+> 'right', -anchor => 'e' );
if ( $algorithm eq "" ) {
$algorithm = "No Encryption Algorithm Selected";
}
$f->Button( -text => "Clear", -command => \&clear )->pack( -side => 'r
+ight', -anchor => 'e' );
$mw->Label( -textvariable => \$algorithm, -relief => 'ridge' )->pack(
+-side => 'top', -fill => 'x' );
$mw->Label( -textvariable => \$info, -relief => 'ridge' )->pack( -side
+ => 'bottom', -fill => 'x' );
$t = $mw->Scrolled( "Text", -wrap => 'word', -scrollbars => 'e' )->pac
+k(
-side => 'bottom',
-fill => 'both',
-expand => 1
);
$info = $title;
#my $stext = $t->get( "1.0", "end" );
#my $sample = $mw->Entry( -textvariable => \$stext)->pack( -fill => 'x
+');
&apply_font;
MainLoop;
#--------------------------------------------------------------------#
# Encryption Sub-Routines
#--------------------------------------------------------------------#
sub encrypt {
if ( $enc_type ) {
$info = $proc;
$temp_var = $t->get( "1.0", "end" );
chomp $temp_var;
&{ $enc{ $enc_type } };
} else {
Error( "Error", "No encryption algorithm has been selected. Pl
+ease select an algorithm and try again." );
}
}
sub decrypt {
if ( $enc_type ) {
$info = "Processing....";
$temp_var = $t->get( "1.0", "end" );
chomp $temp_var;
&{ $dec{ $enc_type } };
} else {
Error( "Error", "No encryption algorithm has been selected. Pl
+ease select an algorithm and try again." );
}
}
sub rc4_encrypt {
if ( Confirm() ) {
$cipher = RC4( $passphrase, $temp_var );
$info = "";
$t->delete( "1.0", "end" );
$cipher = encode_base64( $cipher );
$cipher =~ s/.{80}/$&\n/g;
chomp $cipher;
$cipher = $rc4_header . $cipher . $rc4_footer;
$t->insert( "end", $cipher );
$info = $title;
}
}
sub rc4_decrypt {
if ( Confirm() ) {
$temp_var =~ s/$rc4_header//;
$temp_var =~ s/$rc4_footer//;
$temp_var =~ s/\n//g;
$temp_var = Prep( $temp_var );
$cipher = RC4( $passphrase, $temp_var );
chomp $cipher;
$info = "";
$t->delete( "1.0", "end" );
$t->insert( "end", $cipher );
$info = $title;
}
}
sub rc5_encrypt {
if ( Confirm() ) {
my $ref = Crypt::RC5->new( $passphrase, 16 );
$cipher = $ref->encrypt( $temp_var );
$info = "";
$t->delete( "1.0", "end" );
$cipher = encode_base64( $cipher );
$cipher =~ s/.{80}/$&\n/g;
chomp $cipher;
$cipher = $rc5_header . $cipher . $rc5_footer;
$t->insert( "end", $cipher );
$info = $title;
}
}
sub rc5_decrypt {
if ( Confirm() ) {
$temp_var =~ s/$rc5_header//;
$temp_var =~ s/$rc5_footer//;
$temp_var =~ s/\n//g;
$temp_var = Prep( $temp_var );
my $ref = Crypt::RC5->new( $passphrase, 16 );
$cipher = $ref->decrypt( $temp_var );
chomp $cipher;
$info = "";
$t->delete( "1.0", "end" );
$t->insert( "end", $cipher );
$info = $title;
}
}
sub blowfish_encrypt {
if ( Confirm() ) {
my $ref = Crypt::CBC->new(
{
'key' => $passphrase,
'cipher' => "Blowfish"
}
);
$cipher = $ref->encrypt( $temp_var );
$info = "";
$t->delete( "1.0", "end" );
$cipher = encode_base64( $cipher );
$cipher =~ s/.{80}/$&\n/g;
chomp $cipher;
$cipher = $blowfish_header . $cipher . $blowfish_footer;
$t->insert( "end", $cipher );
$info = $title;
}
}
sub blowfish_decrypt {
if ( Confirm() ) {
$temp_var =~ s/$blowfish_header//;
$temp_var =~ s/$blowfish_footer//;
$temp_var =~ s/\n//g;
$temp_var = Prep( $temp_var );
my $ref = Crypt::CBC->new(
{
'key' => $passphrase,
'cipher' => "Blowfish"
}
);
$cipher = $ref->decrypt( $temp_var );
chomp $cipher;
$info = "";
$t->delete( "1.0", "end" );
$t->insert( "end", $cipher );
$info = $title;
}
}
sub twofish_encrypt {
if ( Confirm() ) {
my $ref = Crypt::CBC->new(
{
'key' => $passphrase,
'cipher' => "Twofish2"
}
);
$cipher = $ref->encrypt( $temp_var );
$info = "";
$t->delete( "1.0", "end" );
$cipher = encode_base64( $cipher );
$cipher =~ s/.{80}/$&\n/g;
chomp $cipher;
$cipher = $twofish_header . $cipher . $twofish_footer;
$t->insert( "end", $cipher );
$info = $title;
}
}
sub twofish_decrypt {
if ( Confirm() ) {
$temp_var =~ s/$twofish_header//;
$temp_var =~ s/$twofish_footer//;
$temp_var =~ s/\n//g;
$temp_var = Prep( $temp_var );
my $ref = Crypt::CBC->new(
{
'key' => $passphrase,
'cipher' => "Twofish2"
}
);
$cipher = $ref->decrypt( $temp_var );
chomp $cipher;
$info = "";
$t->delete( "1.0", "end" );
$t->insert( "end", $cipher );
$info = $title;
}
}
sub cast5_encrypt {
if ( Confirm() ) {
my $ref = Crypt::CBC->new(
{
key => $passphrase,
cipher => "CAST5",
}
);
$cipher = $ref->encrypt( $temp_var );
$info = "";
$t->delete( "1.0", "end" );
$cipher = encode_base64( $cipher );
$cipher =~ s/.{80}/$&\n/g;
chomp $cipher;
$cipher = $cast5_header . $cipher . $cast5_footer;
$t->insert( "end", $cipher );
$info = $title;
}
}
sub cast5_decrypt {
if ( Confirm() ) {
$temp_var =~ s/$cast5_header//;
$temp_var =~ s/$cast5_footer//;
$temp_var =~ s/\n//g;
$temp_var = Prep( $temp_var );
my $ref = Crypt::CBC->new(
{
key => $passphrase,
cipher => "CAST5",
}
);
$cipher = $ref->decrypt( $temp_var );
chomp $cipher;
$info = "";
$t->delete( "1.0", "end" );
$t->insert( "end", $cipher );
$info = $title;
}
}
sub rc6_encrypt {
if ( Confirm() ) {
my $ref = Crypt::CBC->new(
{
key => $passphrase,
cipher => "RC6",
}
);
$cipher = $ref->encrypt( $temp_var );
$info = "";
$t->delete( "1.0", "end" );
$cipher = encode_base64( $cipher );
$cipher =~ s/.{80}/$&\n/g;
chomp $cipher;
$cipher = $rc6_header . $cipher . $rc6_footer;
$t->insert( "end", $cipher );
$info = $title;
}
}
sub rc6_decrypt {
if ( Confirm() ) {
$temp_var =~ s/$rc6_header//;
$temp_var =~ s/$rc6_footer//;
$temp_var =~ s/\n//g;
$temp_var = Prep( $temp_var );
my $ref = Crypt::CBC->new(
{
key => $passphrase,
cipher => "RC6",
}
);
$cipher = $ref->decrypt( $temp_var );
chomp $cipher;
$info = "";
$t->delete( "1.0", "end" );
$t->insert( "end", $cipher );
$info = $title;
}
}
sub anubis_encrypt {
my $IV = pack "H32", 0;
if ( Confirm() ) {
my $ref = Crypt::CBC->new(
{
'key' => $passphrase,
'cipher' => "Anubis",
'iv' => $IV,
'regenerate_key' => 1,
'padding' => 'standard',
'prepend_iv' => 0
}
);
$cipher = $ref->encrypt( $temp_var );
$info = "";
$t->delete( "1.0", "end" );
$cipher = encode_base64( $cipher );
$cipher =~ s/.{80}/$&\n/g;
chomp $cipher;
$cipher = $anubis_header . $cipher . $anubis_footer;
$t->insert( "end", $cipher );
$info = $title;
}
}
sub anubis_decrypt {
my $IV = pack "H32", 0;
if ( Confirm() ) {
$temp_var =~ s/$anubis_header//;
$temp_var =~ s/$anubis_footer//;
$temp_var =~ s/\n//g;
$temp_var = Prep( $temp_var );
my $ref = Crypt::CBC->new(
{
'key' => $passphrase,
'cipher' => "Anubis",
'iv' => $IV,
'regenerate_key' => 1,
'padding' => 'standard',
'prepend_iv' => 0
}
);
$cipher = $ref->decrypt( $temp_var );
chomp $cipher;
$info = "";
$t->delete( "1.0", "end" );
$t->insert( "end", $cipher );
$info = $title;
}
}
sub rainbow_encrypt {
my $IV = pack "H32", 0;
if ( Confirm() ) {
my $ref = Crypt::CBC->new(
{
'key' => $passphrase,
'cipher' => "Rainbow",
'iv' => $IV,
'regenerate_key' => 1,
'padding' => 'standard',
'prepend_iv' => 0
}
);
$cipher = $ref->encrypt( $temp_var );
$info = "";
$t->delete( "1.0", "end" );
$cipher = encode_base64( $cipher );
$cipher =~ s/.{80}/$&\n/g;
chomp $cipher;
$cipher = $rainbow_header . $cipher . $rainbow_footer;
$t->insert( "end", $cipher );
$info = $title;
}
}
sub rainbow_decrypt {
my $IV = pack "H32", 0;
if ( Confirm() ) {
$temp_var =~ s/$rainbow_header//;
$temp_var =~ s/$rainbow_footer//;
$temp_var =~ s/\n//g;
$temp_var = Prep( $temp_var );
my $ref = Crypt::CBC->new(
{
'key' => $passphrase,
'cipher' => "Rainbow",
'iv' => $IV,
'regenerate_key' => 1,
'padding' => 'standard',
'prepend_iv' => 0
}
);
$cipher = $ref->decrypt( $temp_var );
chomp $cipher;
$info = "";
$t->delete( "1.0", "end" );
$t->insert( "end", $cipher );
$info = $title;
}
}
sub noekeon_encrypt {
my $IV = pack "H32", 0;
if ( Confirm() ) {
my $ref = Crypt::CBC->new(
{
'key' => $passphrase,
'cipher' => "Noekeon",
'iv' => $IV,
'regenerate_key' => 1,
'padding' => 'standard',
'prepend_iv' => 0
}
);
$cipher = $ref->encrypt( $temp_var );
$info = "";
$t->delete( "1.0", "end" );
$cipher = encode_base64( $cipher );
$cipher =~ s/.{80}/$&\n/g;
chomp $cipher;
$cipher = $noekeon_header . $cipher . $noekeon_footer;
$t->insert( "end", $cipher );
$info = $title;
}
}
sub noekeon_decrypt {
my $IV = pack "H32", 0;
if ( Confirm() ) {
$temp_var =~ s/$noekeon_header//;
$temp_var =~ s/$noekeon_footer//;
$temp_var =~ s/\n//g;
$temp_var = Prep( $temp_var );
my $ref = Crypt::CBC->new(
{
'key' => $passphrase,
'cipher' => "Noekeon",
'iv' => $IV,
'regenerate_key' => 1,
'padding' => 'standard',
'prepend_iv' => 0
}
);
$cipher = $ref->decrypt( $temp_var );
chomp $cipher;
$info = "";
$t->delete( "1.0", "end" );
$t->insert( "end", $cipher );
$info = $title;
}
}
sub skipjack_encrypt {
my $IV = pack "H16", 0;
if ( Confirm() ) {
my $ref = Crypt::CBC->new(
{
'key' => $passphrase,
'cipher' => "Skipjack",
'iv' => $IV,
'regenerate_key' => 1,
'padding' => 'standard',
'prepend_iv' => 0
}
);
$cipher = $ref->encrypt( $temp_var );
$info = "";
$t->delete( "1.0", "end" );
$cipher = encode_base64( $cipher );
$cipher =~ s/.{80}/$&\n/g;
chomp $cipher;
$cipher = $skipjack_header . $cipher . $skipjack_footer;
$t->insert( "end", $cipher );
$info = $title;
}
}
sub skipjack_decrypt {
my $IV = pack "H16", 0;
if ( Confirm() ) {
$temp_var =~ s/$skipjack_header//;
$temp_var =~ s/$skipjack_footer//;
$temp_var =~ s/\n//g;
$temp_var = Prep( $temp_var );
my $ref = Crypt::CBC->new(
{
'key' => $passphrase,
'cipher' => "Skipjack",
'iv' => $IV,
'regenerate_key' => 1,
'padding' => 'standard',
'prepend_iv' => 0
}
);
$cipher = $ref->decrypt( $temp_var );
chomp $cipher;
$info = "";
$t->delete( "1.0", "end" );
$t->insert( "end", $cipher );
$info = $title;
}
}
sub khazad_encrypt {
my $IV = pack "H16", 0;
if ( Confirm() ) {
my $ref = Crypt::CBC->new(
{
'key' => $passphrase,
'cipher' => "Khazad",
'iv' => $IV,
'regenerate_key' => 1,
'padding' => 'standard',
'prepend_iv' => 0
}
);
$cipher = $ref->encrypt( $temp_var );
$info = "";
$t->delete( "1.0", "end" );
$cipher = encode_base64( $cipher );
$cipher =~ s/.{80}/$&\n/g;
chomp $cipher;
$cipher = $khazad_header . $cipher . $khazad_footer;
$t->insert( "end", $cipher );
$info = $title;
}
}
sub khazad_decrypt {
my $IV = pack "H16", 0;
if ( Confirm() ) {
$temp_var =~ s/$khazad_header//;
$temp_var =~ s/$khazad_footer//;
$temp_var =~ s/\n//g;
$temp_var = Prep( $temp_var );
my $ref = Crypt::CBC->new(
{
'key' => $passphrase,
'cipher' => "Khazad",
'iv' => $IV,
'regenerate_key' => 1,
'padding' => 'standard',
'prepend_iv' => 0
}
);
$cipher = $ref->decrypt( $temp_var );
chomp $cipher;
$info = "";
$t->delete( "1.0", "end" );
$t->insert( "end", $cipher );
$info = $title;
}
}
sub serpent_encrypt {
my $IV = pack "H16", 0;
if ( Confirm() ) {
my $ref = Crypt::CBC->new(
{
'key' => $passphrase,
'cipher' => "Serpent",
'iv' => $IV,
'regenerate_key' => 1,
'padding' => 'standard',
'prepend_iv' => 0
}
);
$cipher = $ref->encrypt( $temp_var );
$info = "";
$t->delete( "1.0", "end" );
$cipher = encode_base64( $cipher );
$cipher =~ s/.{80}/$&\n/g;
chomp $cipher;
$cipher = $serpent_header . $cipher . $serpent_footer;
$t->insert( "end", $cipher );
$info = $title;
}
}
sub serpent_decrypt {
my $IV = pack "H16", 0;
if ( Confirm() ) {
$temp_var =~ s/$serpent_header//;
$temp_var =~ s/$serpent_footer//;
$temp_var =~ s/\n//g;
$temp_var = Prep( $temp_var );
my $ref = Crypt::CBC->new(
{
'key' => $passphrase,
'cipher' => "Serpent",
'iv' => $IV,
'regenerate_key' => 1,
'padding' => 'standard',
'prepend_iv' => 0
}
);
$cipher = $ref->decrypt( $temp_var );
chomp $cipher;
$info = "";
$t->delete( "1.0", "end" );
$t->insert( "end", $cipher );
$info = $title;
}
}
sub misty1_encrypt {
my $IV = pack "H16", 0;
if ( Confirm() ) {
my $ref = Crypt::CBC->new(
{
'key' => $passphrase,
'cipher' => "Misty1",
'iv' => $IV,
'regenerate_key' => 1,
'padding' => 'standard',
'prepend_iv' => 0
}
);
$cipher = $ref->encrypt( $temp_var );
$info = "";
$t->delete( "1.0", "end" );
$cipher = encode_base64( $cipher );
$cipher =~ s/.{80}/$&\n/g;
chomp $cipher;
$cipher = $misty1_header . $cipher . $misty1_footer;
$t->insert( "end", $cipher );
$info = $title;
}
}
sub misty1_decrypt {
my $IV = pack "H16", 0;
if ( Confirm() ) {
$temp_var =~ s/$misty1_header//;
$temp_var =~ s/$misty1_footer//;
$temp_var =~ s/\n//g;
$temp_var = Prep( $temp_var );
my $ref = Crypt::CBC->new(
{
'key' => $passphrase,
'cipher' => "Misty1",
'iv' => $IV,
'regenerate_key' => 1,
'padding' => 'standard',
'prepend_iv' => 0
}
);
$cipher = $ref->decrypt( $temp_var );
chomp $cipher;
$info = "";
$t->delete( "1.0", "end" );
$t->insert( "end", $cipher );
$info = $title;
}
}
sub tripledes_encrypt {
if ( Confirm() ) {
my $des = new Crypt::TripleDES;
$cipher = $des->encrypt3( $temp_var, $passphrase );
$info = "";
$t->delete( "1.0", "end" );
$cipher = encode_base64( $cipher );
$cipher =~ s/.{80}/$&\n/g;
chomp $cipher;
$cipher = $tripledes_header . $cipher . $tripledes_footer;
$t->insert( "end", $cipher );
$info = $title;
}
}
sub tripledes_decrypt {
if ( Confirm() ) {
my $des = new Crypt::TripleDES;
$temp_var =~ s/$tripledes_header//;
$temp_var =~ s/$tripledes_footer//;
$temp_var =~ s/\n//g;
$temp_var = Prep( $temp_var );
$cipher = $des->decrypt3( $temp_var, $passphrase );
$cipher =~ s/\s*$//;
chomp $cipher;
$t->delete( "1.0", "end" );
$t->insert( "end", $cipher );
$info = $title;
}
}
sub aes_encrypt {
if ( Confirm() ) {
$aes = new Crypt::CBC( $passphrase, 'Rijndael' );
$cipher = $aes->encrypt( $temp_var );
$info = "";
$t->delete( "1.0", "end" );
$cipher = encode_base64( $cipher );
$cipher =~ s/.{80}/$&\n/g;
chomp $cipher;
$cipher = $aes_header . $cipher . $aes_footer;
$t->insert( "end", $cipher );
$info = $title;
}
}
sub aes_decrypt {
if ( Confirm() ) {
@lines = split ( /\n/, $temp_var );
shift @lines;
pop @lines;
$temp_var = join ( "", @lines );
$temp_var = Prep( $temp_var );
$aes = new Crypt::CBC( $passphrase, 'Rijndael' );
$cipher = $aes->decrypt( $temp_var );
chomp $cipher;
$info = "";
$t->delete( "1.0", "end" );
$t->insert( "end", $cipher );
$info = $title;
}
}
sub gost_encrypt {
if ( Confirm() ) {
my $ref = Crypt::GOST_PP->new( $passphrase );
$cipher = $ref->encrypt( $temp_var );
$info = "";
$t->delete( "1.0", "end" );
$cipher = encode_base64( $cipher );
$cipher =~ s/.{80}/$&\n/g;
chomp $cipher;
$cipher = $gost_header . $cipher . $gost_footer;
$t->insert( "end", $cipher );
$info = $title;
}
}
sub gost_decrypt {
if ( Confirm() ) {
my $ref = Crypt::GOST_PP->new( $passphrase );
$temp_var =~ s/$gost_header//;
$temp_var =~ s/$gost_footer//;
$temp_var =~ s/\n//g;
$temp_var = Prep( $temp_var );
$cipher = $ref->decrypt( $temp_var );
$cipher =~ s/\s*$//;
chomp $cipher;
$t->delete( "1.0", "end" );
$t->insert( "end", $cipher );
$info = $title;
}
}
sub playwright_encrypt {
if ( Confirm() ) {
$cipher = Acme::Playwright::Make( $temp_var );
chomp $cipher;
$info = "";
$t->delete( "1.0", "end" );
$cipher = $play_header . $cipher . $play_footer;
$t->insert( "end", $cipher );
$info = $title;
}
}
sub playwright_decrypt {
if ( Confirm() ) {
$temp_var =~ s/$play_header//;
$temp_var =~ s/$play_footer//;
$cipher = Acme::Playwright::UnMake( $temp_var );
chomp $cipher;
$info = "";
$t->delete( "1.0", "end" );
$t->insert( "end", $cipher );
$info = $title;
}
}
#--------------------------------------------------------------------#
# End Encryption Sub-Routines
#--------------------------------------------------------------------#
sub clear {
$t->delete( "1.0", "end" );
$passphrase = "";
$info = $title;
$algorithm = "No Encryption Algorithm Selected";
$enc_type = "";
}
sub about {
$mw->Dialog(
-title => "About...",
-text => <<"END", -popover => $mw, -font => 'ansi' )->Show;
$title
Last Modified: $mod_date
Copyright 2003 Kurt Kincaid. All rights reserved.
Cryptopad is free software; you can redistribute it and/or modify it u
+nder the same terms as Perl itself.
END
}
sub Digest {
$info = "Generating Message Digest....";
$hex = Digest::MD5->new();
$temp_var = $t->get( "1.0", "end" );
chomp $temp_var;
if ( $temp_var eq "" ) {
$info = $title;
return;
}
$hex->add( $temp_var );
$md5 = $hex->hexdigest();
$hex2 = Digest::SHA1->new();
$hex2->add( $temp_var );
$sha = $hex2->hexdigest();
$hex3 = Digest::MD4->new();
$hex3->add( $temp_var );
$md4 = $hex3->hexdigest();
$hex4 = Digest::MD2->new();
$hex4->add( $temp_var );
$md2 = $hex4->hexdigest();
$hex5 = Crypt::RIPEMD160->new();
$hex5->reset();
$hex5->add( $temp_var );
$ripemd = $hex5->hexdigest();
$hex6 = Digest::Haval256->new();
$hex6->reset();
$hex6->add( $temp_var );
$haval = $hex6->hexdigest();
$mw->Dialog(
-title => "Message Digest",
-text => <<"END", -popover => $mw, -font => 'ansi' )->Show;
[ SHA ]
$sha
[ MD5 ]
$md5
[ MD4 ]
$md4
[ MD2 ]
$md2
[ RIPEMD-160 ]
$ripemd
[ Haval256 ]
$haval
END
$info = $title;
}
sub OpenDocument {
$FSref = $mw->FileSelect();
$fileName = $FSref->Show();
$temp_var = Butler( $fileName, "read" );
if ( !-e $fileName ) {
$info = "Cannot open $fileName: $!";
return;
}
$t->delete( "1.0", "end" );
$t->insert( "end", $temp_var );
}
sub SaveDocument {
if ( $fileName eq "" ) {
$saveas = $mw->FileDialog( -Title => 'Save As', -Create => 1 )
+;
$saveas->Label( -text => "File Name: ", -relief => 'groove' );
$saveas->Entry( -width => 20, -textvariable => \$fileName );
$fname = $saveas->Show();
}
$saveas->destroy();
$temp_var = $t->get( "1.0", "end" );
Butler( $fname, "write", \$temp_var );
$info = "$fname saved";
}
sub SaveAs {
undef $fileName;
SaveDocument();
}
sub help {
$helptext = "
$title
Last Modified: $mod_date
The encryption is accomplished with your choice of numerous encryption
+ algorithms. It should be noted that to avoid complications with disp
+laying meta-characters, the encrypted output is escaped via MIME::Bas
+e64. Starting with v2.02, Acme::Playwright is included as one of the
+encryption algorithms. Please be advised that this is not, nor should
+ it be considered to be strong encryption. Rather, it is simple text
+obfuscation in the form of a play.
CryptoPad supports multiple rounds of encryption. For example, it is p
+ossible to encrypt your data with TripleDES, then with AES, then with
+ RC4. Decryption would then be possible in the reverse order. The nam
+e of the encryption algorithm is shown to facilitate this. It is impo
+rtant to note that knowing which encryption algorithm was used in no
+way diminishes the security of the encryption.
The Message Digests are generated with SHA1, MD5, MD4, and MD2 Message
+ Digest algorithms by RSA Security Inc., RIPEMD-160 by Hans Dobbertin
+, Antoon Bosselaers, and Haval256 by Bart Preneel, of Katholieke Univ
+ersiteit Leuven, and Yuliang Zheng, Josef Pieprzyk, and Jennifer Sebe
+rry..
";
$help_label = "$title Help";
$help = MainWindow->new();
$help->title( "Help" );
$mm = $help->Frame->pack( -side => 'top', -fill => 'x' );
$mm->Button(
-text => "Close Window",
-command => sub { $help->destroy() }
)->pack( -side => 'right' );
$help->Label( -textvariable => \$help_label, -relief => 'ridge' )-
+>pack( -side => 'bottom', -fill => 'x' );
$tt = $help->Scrolled(
"Text",
-width => 120,
-wrap => 'word',
-background => '#ffff88',
-font => 'ansi',
-scrollbars => 'e'
)->pack( -side => 'bottom', -fill => 'both', -expand => 1 );
$tt->insert( "end", $helptext );
}
sub Confirm {
if ( $enc_type eq "playwright" ) {
return 1;
}
if ( $temp_var eq "" ) {
return 0;
}
if ( length( $passphrase ) < 5 ) {
Error( "Passphrase Error", "The passphrase must be at least 5
+characters" );
return 0;
}
return 1;
}
sub Error {
my $error;
my ( $et, $em ) = @_;
$error = $mw->Dialog(
-bitmap => 'error',
-title => $et,
-text => <<"END", -popover => $mw, -font => 'ansi' )->Show;
$em
END
$info = $title;
}
sub Prep {
my $var = shift;
if ( $var =~ /\%/ ) {
$var = uri_unescape( $var );
} else {
$var = decode_base64( $var );
}
return $var;
}
sub apply_font {
$t->configure( -font =>
[ -family => $family,
-size => $size,
-weight => $weight,
-slant => $slant,
-underline => $underline,
-overstrike => $overstrike]);
}
-
Are you posting in the right place? Check out Where do I post X? to know for sure.
-
Posts may use any of the Perl Monks Approved HTML tags. Currently these include the following:
<code> <a> <b> <big>
<blockquote> <br /> <dd>
<dl> <dt> <em> <font>
<h1> <h2> <h3> <h4>
<h5> <h6> <hr /> <i>
<li> <nbsp> <ol> <p>
<small> <strike> <strong>
<sub> <sup> <table>
<td> <th> <tr> <tt>
<u> <ul>
-
Snippets of code should be wrapped in
<code> tags not
<pre> tags. In fact, <pre>
tags should generally be avoided. If they must
be used, extreme care should be
taken to ensure that their contents do not
have long lines (<70 chars), in order to prevent
horizontal scrolling (and possible janitor
intervention).
-
Want more info? How to link
or How to display code and escape characters
are good places to start.