2

Perl のCrypt::CBCモジュールを使用して暗号化された暗号文があり、それを別の場所で解読したいと考えています。

Crypt::CBC暗号文は、コンストラクターの「単純な」バージョンを使用して生成されました。つまり、次のとおりです。

use Crypt::CBC;
$cipher = Crypt::CBC->new( -key    => 'my secret key',
                           -cipher => 'Blowfish'
                          );

MANページを読むと、この構築方法は、単純な文字列キーとランダムソルトを取得して、暗号化に使用するIVおよびリテラルキーを生成し、ソルトを使用してヘッダーを埋め込みます.

"salt" -- パスフレーズを 8 バイトのランダム値と組み合わせて、提供されたパスフレーズからブロック暗号キーと IV の両方を生成します。ソルトはデータ ストリームの先頭に追加され、正しいパスフレーズが与えられた場合、復号化によってキーと IV の両方が再生成されます。この方法は、OpenSSL の現在のバージョンと互換性があります。

ここで、暗号文、リテラル キー、および IV を指定して、CBC 復号化のみをサポートする別のプラットフォームで暗号文を復号化する必要があります。リテラル キー、IV & ソルトを生成するために、Crypt::CBC を使用して次のような値を生成しました。

my $crypt = new Crypt::CBC(-key => 'my secret key', -cipher => 'Blowfish');
my $out = $crypt->decrypt($ciphertext);
my $literal_key = $crypt->key();
my $iv = $crypt->iv();
my $salt = $crypt->salt();

ここでの復号化は正しいですが、生成されたリテラル キー & IV を使用して暗号を復号化できませんでした。これはゴミを生成します:

my $crypt2 = new Crypt::CBC(
    -literal_key => 1,
    -key => $literal_key,
    -cipher => 'Blowfish',
    -iv => $iv,
    -header => 'none');
my $rubbish - $crypt2->decrypt($ciphertext);

リテラルキーを提供してソルトヘッダーを使用することはできないため、次の動きについて迷っています。

このテキストを解読するにはどうすればよいですか?

編集: ターゲット システムは Perl を実行していませんが、上記の $rubbish と同じ値を生成できたので、同じアルゴリズム (CBC、Blowfish) を使用して解読していると確信しています。

4

3 に答える 3

1

PHP で _salted_key_and_iv 関数が必要な場合は、次のとおりです。

function _salted_key_and_iv ($pass, $salt) {
        if(strlen($salt) != 8) {
            die("Salt must be 8 bytes long");
        }

        $key_len = 56;
        $iv_len  = 8;

        $desired_len = $key_len+$iv_len;

        $data  = '';
        $d = '';

        while (strlen($data) < $desired_len) {
            $d = pack("H*", md5($d . $pass . $salt));
            $data .= "$d";
        }

        return $data;
}
于 2012-02-02T13:15:29.673 に答える
1

これはうまくいくかもしれません。キーの長さは正確に 56 バイトである必要があり、iv の長さは正確に 8 バイトである必要があります。

#!/usr/bin/perl

use strict;
use warnings;

use Crypt::CBC;

my $key = "x" x 56;
my $iv  = "x" x 8;

my $plaintext  = "this is just some normal text\n";
my $ciphertext = Crypt::CBC->new(
    -cipher      => 'Blowfish',
    -header      => 'none',
    -literal_key => 1,
    -key         => $key,
    -iv          => $iv,
)->encrypt($plaintext);

print Crypt::CBC->new(
    -cipher      => 'Blowfish',
    -header      => 'none',
    -literal_key => 1,
    -key         => $key,
    -iv          => $iv,
)->decrypt($ciphertext);
于 2011-07-04T05:15:27.347 に答える
1

ストリームを解読するには、まず Crypt::CBC の「salt」モードによって追加されたヘッダーを削除する必要があります。ヘッダーは、8 文字のSalted__後に続く 8 バイトのソルト データで構成されます。

perl では、次のようにする必要があります。

my $crypt2 = new Crypt::CBC(
    -literal_key => 1,
    -key => $literal_key,
    -cipher => 'Blowfish',
    -iv => $iv,
    -header => 'none');
my $cleartext = $crypt2->decrypt(substr($ciphertext, 16));
于 2011-07-06T13:19:54.430 に答える