#!/usr/bin/perl ## ## Crypt::TripleDES -- Pure Perl Triple DES encryption. ## ## Copyright (c) 1999, Vipul Ved Prakash. All rights reserved. ## This code is free software; you can redistribute it and/or modify ## it under the same terms as Perl itself. ## ## $Id: TripleDES.pm,v 0.24 1999/10/13 23:26:15 root Exp root $ package Crypt::TripleDES; use Crypt::PPDES; use vars qw( $AUTOLOAD $VERSION); ( $VERSION ) = '$Revision: 0.24 $' =~ /\s(\d+\.\d+)\s/; sub AUTOLOAD { my ( $self, @args ) = @_; my $key = $AUTOLOAD; $key =~ s/.*://; if ( $key eq "encrypt3" ) { return $self->decrypt3 ( @args, 1 ); } } sub new { return bless {}, shift } sub decrypt3 { my ( $self, $plaintext, $passphrase, $flag ) = @_; my %keyvecs; $passphrase .= ' ' x (16*3); for ( 0..2 ) { my @kvs = Crypt::PPDES::des_set_key( pack( "H*", substr($passphrase, 16*$_, 16 ))); $keyvecs{$_} = \@kvs; } my $size = length ( $plaintext ); my $tail = 8 - ( $size % 8 ); $tail = 0 if $tail > 7; $plaintext .= chr(32) x $tail; $size = length ( $plaintext ); my $cyphertext = ""; for ( 0 .. (($size)/8) -1 ) { my $pt = substr( $plaintext, $_*8, 8 ); $pt = Crypt::PPDES::des_ecb_encrypt( $flag ? $keyvecs{0} : $keyvecs{2}, $flag, $pt ); $pt = Crypt::PPDES::des_ecb_encrypt( $keyvecs{1}, (not $flag), $pt ); $pt = Crypt::PPDES::des_ecb_encrypt( $flag ? $keyvecs{2} : $keyvecs{0}, $flag, $pt ); $cyphertext .= $pt; } return substr ( $cyphertext, 0, $size ); } sub debug { my ( @mess ) = @_; open D, ">>debug"; print D "@mess\n"; close D; } "True Value"; =head1 NAME Crypt::TripleDES - Triple DES encyption. =head1 SYNOPSIS my $des = new Crypt::TripleDES; my $cyphertext = $des->encrypt3 ( $plaintext, $passphrase ); my $plaintext = $des->decrypt3 ( $cyphertext, $passphrase ); =head1 DESCRIPTION This module implements 3DES encryption in ECB mode. The code is based on Eric Young's implementation of DES in pure perl. It's quite slow because of the way Perl handles bit operations and is not recommended for use with large texts. =head1 METHODS =over 4 =item B The constructor. =item B $plaintext, $passphrase Encrypts the plaintext string using the passphrase. Whitespace characters are appended to the string if its length is not a multiple of eight. User applications can correct for this by storing plaintext size with the cyphertext. The passphrase is an ASCII character string of upto 48 characters. =item B $cyphertext, $passphrase Inverse of encrypt3(). =back =head1 AUTHOR Vipul Ved Prakash, mail@vipul.net Eric Young, eay@psych.psy.uq.oz.au Patches: Jonathan Mayer =cut