Шифрование TripleDES ECB в Perl, совместимое с реализацией PHP mcrypt - PullRequest
1 голос
/ 30 октября 2011

Я пытаюсь создать пакет в perl, который эквивалентен нашему ранее существующему классу в php для обработки шифрования данных.

Тип шифрования, как представляется, TripleDES в режиме ECB, однако я не могу реплицироватьрезультирующий зашифрованный текст с использованием Crypt :: CBC или Crypt :: TripleDES.

Я думаю, что проблема связана с заполнением или форматом ключа (двоичный или шестнадцатеричный и т. д.), но поиск, хотя документация мне не помогаетнайти ответ.

Текущий класс PHP выглядит следующим образом (урезанный, но с той же основной функциональностью):

<?php
class Encryption {
    private $encryption_key;
    private $encryption_td;
    private $encryption_iv;

    private function __construct() {
        $this->encryption_key = 'abc123';
        $this->encryption_td = mcrypt_module_open( 'tripledes', '', 'ecb', '' );
        $this->encryption_iv = mcrypt_create_iv ( mcrypt_enc_get_iv_size( $this->encryption_td ), MCRYPT_RAND );

        mcrypt_generic_init( $this->encryption_td, $this->encryption_key, $this->encryption_iv );
    }

    public function __destruct() {
        mcrypt_generic_deinit( $this->encryption_td );
        mcrypt_module_close( $this->encryption_td );
    }   

    public static function instance($key = null, $iv = null, $algorithm = null, $mode = null) {
        static $instance;

        if (! $instance) {
            $instance = new Encryption( $key, $iv, $algorithm, $mode );
        }

        return $instance;
    }

    public function encrypt( $password ) {
        return base64_encode( mcrypt_generic( $this->encryption_td, $password ) );
    }

    public function decrypt( $password ) {
        return trim(mdecrypt_generic( $this->encryption_td, base64_decode( $password ) ) );
    }
}

function decrypt_password( $password ) {
    return Encryption::instance()->decrypt( $password );
}

function encrypt_password( $password ) {
    return Encryption::instance()->encrypt( $password );
}

print encrypt_password( 'wibblewobble123' ) . "\n";
print decrypt_password( encrypt_password( 'wibblewobble123' ) ) . "\n";
?>

Мой текущий пакет perl выглядит следующим образом:

package Encryption;
use warnings;
use strict;
use MIME::Base64;
use Crypt::TripleDES;

sub new {
    my $class = shift;
    my $self = {};
    $self->{'encryption_key'} = 'abc123';
    $self->{'td'} = Crypt::TripleDES->new();
    bless( $self, $class );
    return $self;
}

sub decrypt {
    my( $self, $encrypted_password ) = @_;
    $encrypted_password = decode_base64( $encrypted_password );
    my $password = $self->{'td'}->decrypt3( $encrypted_password, $self->{'encryption_key'} );
    chomp( $password );
    return $password;
}

sub encrypt {
    my( $self, $password ) = @_;
    my $encrypted_password = $self->{'td'}->encrypt3( $password, $self->{'encryption_key'} );
    $encrypted_password = encode_base64( $encrypted_password );
    chomp( $encrypted_password );
    undef( $password );
    return $encrypted_password;
}

1;

И тестовый код:

use warnings;
use strict;

use Encryption;

sub decrypt {
    my $password = shift;
    my $eh = Encryption->new();
    return $eh->decrypt( $password );
}

sub encrypt {
    my $password = shift;
    my $eh = Encryption->new();
    return $eh->encrypt( $password );
}

print encrypt( 'wibblewobble123' ) . "\n";
print decrypt( encrypt( 'wibblewobble123' ) ) . "\n";

Вывод каждого из них выглядит следующим образом:

php:

xuRt3xxjPO1GUz+DccTVKw==
wibblewobble123

perl:

mmWuKkpvveHvnUsQ2NC6DA==
wibblewobble123

Ожидаемым результатом является то, что подпрограмма шифрования perl возвращает тот же вывод, что и функция шифрования php, при этом расшифровка выполняется так же, но в обратном порядке.

Если Crypt :: TripleDES является неправильным способом для атаки на эту проблему,я рад использовать что-то другое - этот код все равно будет переписан во что-то более аккуратное.

В качестве дополнительного примечания это должно работать с несколькими длинами клавиш, поэтому, если это проблема заполнения, пожалуйста,объяснить, как рассчитать правильный отступ на основе длины ключа.

...