2011-07-04 55 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; 
}