2011-07-04 48 views
2

我有一些使用Perl的Crypt::CBC模塊加密的密文,我希望在其他地方解密。如何使用鹹頭解密Blowfish密文?

生成密文使用Crypt::CBC構造的「簡單」的版本,那就是:

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

從閱讀手冊頁,這種施工方法將採取簡單的字符串鍵和隨機鹽生成一個IV &文字鍵用於加密,以及嵌入一個標題與鹽。

「鹽」 - 結合 一個8字節隨機值,以生成 兩個塊密碼密鑰和由 提供密碼短語的IV密碼。鹽將被附加到數據流的開頭 ,允許解密到 在給定正確密碼的情況下重新生成密鑰和IV。 此方法與當前版本的OpenSSL兼容。

我現在需要解密上僅支持CBC解密給出的密文,一個文本鍵值& IV另一個平臺的密文。以嘗試產生文本鍵值,IV &鹽,我用地穴:: 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(); 

這裏的解密是正確的,但我一直無法使用生成的文本鍵值四,解密密碼;這產生垃圾:

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

我不能提供一個文字鍵和使用鹽頭,所以我迷失在下一步。

如何解密此文本?

編輯:目標系統未運行的Perl,但我已經能夠產生相同的值作爲上述$垃圾,所以我敢肯定,它使用相同的算法(CBC,河豚)破譯。

回答

1

要解密流,首先需要消除由地穴:: CBC的「鹽所附加的標題「模式。標題由8個字符Salted__組成,接着是8個字節的鹽數據。如果有人需要_salted_key_and_iv功能在PHP

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

現貨!謝謝一堆。 –

+0

作爲一個額外的注意事項,以防其他搜索者在同一條船上,我有幾個不連貫的文本解密,所有加密都使用相同的密碼,所以必須從鹽中計算出IV和密鑰。我將代碼直接移出Crypt :: CBC中的_salted_key_and_iv函數(http://cpansearch.perl.org/src/LDS/Crypt-CBC-2.30/CBC.pm)。 –

1

這可能工作。您的密鑰將不得不在長度正好56字節,IV將有很長正好八個字節:

#!/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); 
+0

我有兩個系統上的Blowfish庫,但麻煩系統是一個嵌入式Windows應用程序,無法運行Perl。我設法讓兩個系統都輸出我最後一個Perl例子生成的相同的垃圾文本,所以Blowfish部分似乎在工作。我在目標系統上沒有支持從密碼短語或嵌入的鹽和標題生成密鑰和密鑰的代碼。 –

+0

您確定Windows應用程序正在使用CBC嗎?你可以嘗試直接使用'Crypt :: Blowfish'。 –

+0

是 - 用於2次喧鬧。 1)該函數被稱爲blf_BytesDecRawCBC,2)被調用時,它會生成與我在OP中輸出的最終示例('垃圾'輸出)完全相同的*輸出。 –

1

- 這裏是::

在Perl中,這樣的事情應該去做

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; 
}