Perl 我如何用盐头解密河豚密文?
我有一些使用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
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&密钥。我把代码直接从数据库中移植了出来。