Crypt-DES_PP
view release on metacpan or search on metacpan
lib/Crypt/DES_PP.pm view on Meta::CPAN
# -*- perl -*-
# DES_PP.pm - Pure perl implementation of DES.
#
# The master file for the module is DES_PP.m4 which needs to be run through
# the m4. Please edit DES_PP.m4 if you need to modify!
package Crypt::DES_PP;
use strict;
use Carp;
use integer;
use vars qw($VERSION @ISA @EXPORT @EXPORT_OK);
require Exporter;
@ISA = qw (Exporter);
@EXPORT = qw ();
@EXPORT_OK = qw ();
$VERSION = '1.00';
use constant BLKSIZE => 8;
# Stolen from Crypt::DES.
sub usage {
my ($package, $filename, $line, $subr) = caller (1);
$Carp::CarpLevel = 2;
croak "Usage: $subr (@_)";
}
sub blocksize () { BLKSIZE };
sub keysize () { BLKSIZE };
sub expand_key ($);
sub crypt ($$$);
sub new {
usage ("new Crypt::DES_PP key")
unless @_ == 2;
my ($package, $key) = @_;
bless { ks => Crypt::DES_PP::expand_key ($key) }, $package;
}
sub encrypt {
usage ("encrypt data[8 bytes]") unless @_ == 2;
my ($self,$data) = @_;
return Crypt::DES_PP::crypt ($data, $self->{ks}, 1);
}
sub decrypt {
usage("decrypt data[8 bytes]") unless @_ == 2;
my ($self,$data) = @_;
return Crypt::DES_PP::crypt ($data, $self->{ks}, 0);
}
use constant ITERATIONS => 16;
# These used to be a single reference to an array of array references.
# Splitting them up into distinct constants slightly improves performance.
use constant des_SPtrans_0 =>
[ # Nibble 0
0x00820200, 0x00020000, 0x80800000, 0x80820200,
0x00800000, 0x80020200, 0x80020000, 0x80800000,
0x80020200, 0x00820200, 0x00820000, 0x80000200,
0x80800200, 0x00800000, 0x00000000, 0x80020000,
0x00020000, 0x80000000, 0x00800200, 0x00020200,
0x80820200, 0x00820000, 0x80000200, 0x00800200,
0x80000000, 0x00000200, 0x00020200, 0x80820000,
0x00000200, 0x80800200, 0x80820000, 0x00000000,
0x00000000, 0x80820200, 0x00800200, 0x80020000,
0x00820200, 0x00020000, 0x80000200, 0x00800200,
0x80820000, 0x00000200, 0x00020200, 0x80800000,
0x80020200, 0x80000000, 0x80800000, 0x00820000,
0x80820200, 0x00020200, 0x00820000, 0x80800200,
0x00800000, 0x80000200, 0x80020000, 0x00000000,
0x00020000, 0x00800000, 0x80800200, 0x00820200,
0x80000000, 0x80820000, 0x00000200, 0x80020200,
];
use constant des_SPtrans_1 =>
[ # Nibble 1
0x10042004, 0x00000000, 0x00042000, 0x10040000,
0x10000004, 0x00002004, 0x10002000, 0x00042000,
0x00002000, 0x10040004, 0x00000004, 0x10002000,
0x00040004, 0x10042000, 0x10040000, 0x00000004,
0x00040000, 0x10002004, 0x10040004, 0x00002000,
0x00042004, 0x10000000, 0x00000000, 0x00040004,
0x10002004, 0x00042004, 0x10042000, 0x10000004,
0x10000000, 0x00040000, 0x00002004, 0x10042004,
0x00040004, 0x10042000, 0x10002000, 0x00042004,
0x10042004, 0x00040004, 0x10000004, 0x00000000,
0x10000000, 0x00002004, 0x00040000, 0x10040004,
0x00002000, 0x10000000, 0x00042004, 0x10002004,
0x10042000, 0x00002000, 0x00000000, 0x10000004,
0x00000004, 0x10042004, 0x00042000, 0x10040000,
0x10040004, 0x00040000, 0x00002004, 0x10002000,
0x10002004, 0x00000004, 0x10040000, 0x00042000,
];
use constant des_SPtrans_2 =>
[ # Nibble 2
0x41000000, 0x01010040, 0x00000040, 0x41000040,
0x40010000, 0x01000000, 0x41000040, 0x00010040,
0x01000040, 0x00010000, 0x01010000, 0x40000000,
0x41010040, 0x40000040, 0x40000000, 0x41010000,
0x00000000, 0x40010000, 0x01010040, 0x00000040,
0x40000040, 0x41010040, 0x00010000, 0x41000000,
0x41010000, 0x01000040, 0x40010040, 0x01010000,
0x00010040, 0x00000000, 0x01000000, 0x40010040,
0x01010040, 0x00000040, 0x40000000, 0x00010000,
0x40000040, 0x40010000, 0x01010000, 0x41000040,
0x00000000, 0x01010040, 0x00010040, 0x41010000,
0x40010000, 0x01000000, 0x41010040, 0x40000000,
0x40010040, 0x41000000, 0x01000000, 0x41010040,
0x00010000, 0x01000040, 0x41000040, 0x00010040,
lib/Crypt/DES_PP.pm view on Meta::CPAN
$t = $r ^ $s[($i - 0) + 1];
$t = (($t >> 4) & 0x0fffffff) | ($t << 28);
$l ^= des_SPtrans_1->[($t ) & 0x3f]|
des_SPtrans_3->[($t >> 8) & 0x3f]|
des_SPtrans_5->[($t >> 16) & 0x3f]|
des_SPtrans_7->[($t >> 24) & 0x3f]|
des_SPtrans_0->[($u ) & 0x3f]|
des_SPtrans_2->[($u >> 8) & 0x3f]|
des_SPtrans_4->[($u >> 16) & 0x3f]|
des_SPtrans_6->[($u >> 24) & 0x3f];
$u = ($l ^ $s[($i - 2) ]);
$t = $l ^ $s[($i - 2) + 1];
$t = (($t >> 4) & 0x0fffffff) | ($t << 28);
$r ^= des_SPtrans_1->[($t ) & 0x3f]|
des_SPtrans_3->[($t >> 8) & 0x3f]|
des_SPtrans_5->[($t >> 16) & 0x3f]|
des_SPtrans_7->[($t >> 24) & 0x3f]|
des_SPtrans_0->[($u ) & 0x3f]|
des_SPtrans_2->[($u >> 8) & 0x3f]|
des_SPtrans_4->[($u >> 16) & 0x3f]|
des_SPtrans_6->[($u >> 24) & 0x3f];
}
}
$l = (($l >> 1) & 0x7fffffff) | ($l << 31);
$r = (($r >> 1) & 0x7fffffff) | ($r << 31);
# Clear the top bits on machines with 8byte longs.
$l &= 0xffffffff;
$r &= 0xffffffff;
# Swap $l and $r.
# We will not do the swap so just remember they are
# Reversed for the rest of the subroutine
# Luckily FP fixes this problem :-)
$t = (($r >> 1) ^ $l) & 0x55555555;
$l ^= $t;
$r ^= $t << 1;
$t = (($l >> 8) ^ $r) & 0x00ff00ff;
$r ^= $t;
$l ^= $t << 8;
$t = (($r >> 2) ^ $l) & 0x33333333;
$l ^= $t;
$r ^= $t << 2;
$t = (($l >> 16) ^ $r) & 0x0000ffff;
$r ^= $t;
$l ^= $t << 16;
$t = (($r >> 4) ^ $l) & 0x0f0f0f0f;
$l ^= $t;
$r ^= $t << 4;
pack "VV", $l, $r;
}
1;
__END__
=head1 NAME
Crypt::DES_PP - Perl extension for DES encryption
=head1 SYNOPSIS
use Crypt::DES_PP;
$des = Crypt::DES_PP->new ($key);
$cipher = $des->encrypt ($plain);
$plain = $des->decrypt ($cipher);
$blocksize = $des->blocksize;
$keysize = $des->keysize;
=head1 DESCRIPTION
The Data Encryption Standard (DES), also known as Data Encryption
Algorithm (DEA) is a semi-strong encryption and decryption algorithm.
The module is 100 % compatible to Crypt::DES but is implemented
entirely in Perl. That means that you do not need a C compiler to
build and install this extension.
The module implements the Crypt::CBC interface. You are encouraged
to read the documentation for Crypt::CBC if you intend to use this
module for Cipher Block Chaining.
The minimum (and maximum) key size is 8 bytes. Shorter keys will
cause an exception, longer keys will get silently truncated. Data
is encrypted and decrypted in blocks of 8 bytes.
The module implements the Ultra-Fast-Crypt (UFC) algorithm as found
for example in the GNU libc. On the Perl side a lot has been done
in order to make the module as fast as possible (function inlining,
use integer, ...).
Note: For performance issues the source code for the module is
first preprocessed by m4. That means that you need an m4 macro
processor in order to hack on the sources. This is of no concern
for you if you only want to use the module, the preprocessed output
is always included in the distribution.
=head1 BUGS
Nothing known. The module has not been tested on 64 bit architectures.
=head1 AUTHOR
This implementation was written by Guido Flohr (guido@imperia.net).
It is available under the terms of the Lesser GNU General Public
License (LGPL) version 2 or - at your choice - any later version,
see the file ``COPYING.LIB''.
The original C implementation of the Ultra-Fast-Crypt algorithm
was written by Michael Glad (glad@daimi.aau.dk) and has been donated to
the Free Software Foundation, Inc. It is covered by the GNU library
license version 2, see the file ``COPYING.LIB''.
=head1 SEE ALSO
Crypt::CBC(3), Crypt::DES(3), perl(1), m4(1).
=cut
Local Variables:
mode: perl
perl-indent-level: 4
perl-continued-statement-offset: 4
perl-continued-brace-offset: 0
perl-brace-offset: -4
perl-brace-imaginary-offset: 0
perl-label-offset: -4
tab-width: 4
End:
( run in 0.956 second using v1.01-cache-2.11-cpan-39bf76dae61 )