Шифрование 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 - неправильный способ атаковать эту проблему, то я рад использовать что-то еще - этот код будет переписан во что-то более аккуратное в любом случае.
В качестве дополнительного примечания это должно работать с несколькими длинами клавиш, поэтому, если это проблема заполнения, пожалуйста, объясните, как рассчитать правильное заполнение на основе длины ключа.