1

ファイルに保存されているパス フレーズを解読しようとしています。暗号化は Perl::CBC モジュールで行われましたが、Python スクリプト用に暗号化を解除する必要があります。率直に言って、私は暗号化アルゴリズムについてあまり (または実際には何も) 知りません。

パスフレーズは次のように暗号化されました。

use Crypt::CBC;

my $key = '0123456789';
my $iv  = '$KJh#(}q';

my $cipher = Crypt::CBC->new(
    -key    => $key,
    -cipher => 'Blowfish',
    -header => 'none',
    -iv     => $iv,
);

my $passphrase = 'You have decrypted the passphrase.';
my $hex_encrypted = $cipher->encrypt_hex($passphrase);

これにより、暗号化されたパスフレーズが得られます: 9033c838e4418fbdc50a9fc0813745296d195d59954008f94b2b36a8e65dca959686206960a7828a

ここで、これを Python スクリプトで使用する必要があります (Python 2.7 を使用)。素朴に、私はこれがうまくいくことを望んでいました:

from Crypto.Cipher import Blowfish
from binascii import hexlify, unhexlify

perl_pass =  unhexlify('9033c838e4418fbdc50a9fc0813745296d195d59954008f94b2b36a8e65dca959686206960a7828a')
key = '0123456789'
iv  = '$KJh#(}q'
print Blowfish.new(key, Blowfish.MODE_CBC, iv).decrypt(perl_pass)

しかし、それは印刷できないがらくたの束を作成するだけのようです. 私は成功せずに少し遊んだ。このパスワードを正常に復号化するためにここで何をする必要があるのか​​ よくわかりません。

4

1 に答える 1

1

Crypt::CBC に与える「キー」は実際にはパスフレーズであり、そこから「リテラル キー」が生成されます。Crypto.Cipher.Blowfish には、パスフレーズではなく、そのリテラル キーが必要です。生成されたキーを Perl プログラムから 16 進数で出力し、Python で使用できます。

use Crypt::CBC;

my $key = '0123456789';
my $iv  = '$KJh#(}q';

my $cipher = Crypt::CBC->new(
    -key    => $key,
    -cipher => 'Blowfish',
    -header => 'none',
    -iv     => $iv,
);

my $passphrase = "You have decrypted the passphrase.";
my $hex_encrypted = $cipher->encrypt_hex($passphrase);

print unpack('H*', $cipher->key()), "\n";

-

$ perl perl_crypt_cbc.pl
781e5e245d69b566979b86e28d23f2c78e938564cd1410f0ec1c1781466a6738bab0a6ed984c75ab34c68bbf7558077714043c5bdb959e46

-

from Crypto.Cipher import Blowfish
from binascii import hexlify, unhexlify

perl_pass = unhexlify("9033c838e4418fbdc50a9fc0813745296d195d59954008f94b2b36a8e65dca959686206960a7828a")

key = unhexlify("781e5e245d69b566979b86e28d23f2c78e938564cd1410f0ec1c1781466a6738bab0a6ed984c75ab34c68bbf7558077714043c5bdb959e46")
iv  = '$KJh#(}q'
print Blowfish.new(key, Blowfish.MODE_CBC, iv).decrypt(perl_pass)

-

python python_crypt_cbc.py 
You have decrypted the passphrase.

最後にいくつかの印刷できない文字があることに注意してください: Blowfish で暗号化された文字列は 8 バイトの倍数でなければならないので、Perl は黙ってそれをパディングします。パディングされるバイトは、パディングの長さです。この場合、6 バイトのパディングなので、それぞれが 0x06 です。それらは簡単に削除できます。

from Crypto.Cipher import Blowfish
from binascii import hexlify, unhexlify

perl_pass = unhexlify("9033c838e4418fbdc50a9fc0813745296d195d59954008f94b2b36a8e65dca959686206960a7828a")

key = unhexlify("781e5e245d69b566979b86e28d23f2c78e938564cd1410f0ec1c1781466a6738bab0a6ed984c75ab34c68bbf7558077714043c5bdb959e46")
iv  = '$KJh#(}q'
num_padding = ord(Blowfish.new(key, Blowfish.MODE_CBC, iv).decrypt(perl_pass)[-1])

print Blowfish.new(key, Blowfish.MODE_CBC, iv).decrypt(perl_pass)[:(-1*num_padding)]
于 2013-02-13T20:32:58.863 に答える