データ暗号化を処理するために、php の既存のクラスと同等のパッケージを perl で作成しようとしています。
暗号化タイプは ECB モードの TripleDES のようですが、Crypt::CBC または Crypt::TripleDES を使用して結果の暗号テキストを複製できません。
問題は、パディングまたはキー形式(バイナリと16進数など)のいずれかに関係していると思いますが、ドキュメントは答えを見つけるのに役立っていません。
現在の 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
パール:
mmWuKkpvveHvnUsQ2NC6DA==
wibblewobble123
予想される結果は、perl の暗号化サブルーチンが php の暗号化関数と同じ出力を返し、復号化が同じことを逆に行うことです。
Crypt::TripleDES がこの問題を攻撃するのに間違った方法である場合は、別のものを喜んで使用します。とにかく、このコードはよりきちんとしたものに書き直されます。
補足として、これは複数のキーの長さで機能する必要があるため、パディングの問題である場合は、キーの長さに基づいて正しいパディングを計算する方法を説明してください。