Perl 我如何用盐头解密河豚密文?

Perl 我如何用盐头解密河豚密文?,perl,cryptography,openssl,blowfish,Perl,Cryptography,Openssl,Blowfish,我有一些使用Perl模块加密的密文,我想在别处解密 密文是使用Crypt::CBC构造函数的“简单”版本生成的,即: use Crypt::CBC; $cipher = Crypt::CBC->new( -key => 'my secret key', -cipher => 'Blowfish' ); 通过阅读手册页,这种构造方法将使用简单的字符串密钥和随机salt

我有一些使用Perl模块加密的密文,我想在别处解密

密文是使用
Crypt::CBC
构造函数的“简单”版本生成的,即:

use Crypt::CBC;
$cipher = Crypt::CBC->new( -key    => 'my secret key',
                           -cipher => 'Blowfish'
                          );
通过阅读手册页,这种构造方法将使用简单的字符串密钥和随机salt生成用于加密的IV&literal密钥,并用salt嵌入一个头

“salt”——将密码短语与 一个8字节的随机值 从中生成分组密码密钥和IV 提供密码短语。盐将被加到盘子里 允许解密的数据流的开始 根据正确的密码短语重新生成密钥和IV。 此方法与当前版本的OpenSSL兼容

我现在需要在另一个只支持CBC解密的平台上解密密文,给定密文、文本密钥和IV。为了尝试生成文本密钥、IV和salt,我使用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,但我已经能够生成与上面$垃圾中相同的值,因此我确信它使用相同的算法(CBC、Blowfish)进行解密。

这可能会起作用。您的密钥长度必须正好为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);

要解密流,首先需要删除Crypt::CBC的“salt”模式添加的头。标题由8个字符
salt__
和8个字节的salt数据组成

在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));

如果有人需要PHP中的_salted_key_和_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;
}
函数_salt_key_和_iv($pass,$salt){
如果(strlen($salt)!=8){
die(“Salt必须是8字节长”);
}
$key_len=56;
$iv_len=8;
$desired_len=$key_len+$iv_len;
$data='';
$d='';
while(strlen($data)<$desired\u len){
$d=包装(“H*”,md5($d.$pass.$salt));
$data.=“$d”;
}
返回$data;
}

我在两个系统上都有Blowfish库,但麻烦的是系统是一个嵌入式Windows应用程序,无法运行Perl。我已经成功地让两个系统输出了我上一个Perl示例生成的相同垃圾文本,因此Blowfish部分似乎工作正常。我在目标系统上没有支持从密码短语或嵌入式salt和标头生成IV和密钥的代码。您确定Windows应用程序正在使用CBC吗?您可以直接尝试使用
Crypt::Blowfish
。1) 函数名为blf_BytesDecRawCBC,2)调用时,它生成的输出与我在OP中给出的最后一个示例完全相同(“垃圾”输出)。作为一个额外的注意事项,万一另一个搜索者也在同一条船上,我有几个离散的文本要破译,所有密码都使用相同的密码短语加密,因此必须从salt计算IV&密钥。我把代码直接从数据库中移植了出来。