Шифрование TripleDES ECB в Perl, совместимое с реализацией PHP mcrypt

Я пытаюсь создать пакет в 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, при этом decrypt делает то же самое, но в обратном порядке.

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

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

0 ответов

Другие вопросы по тегам