【问题标题】:Encrypt/decrypt binary file in Perl using blowfish or AES?使用河豚或AES加密/解密Perl中的二进制文件?
【发布时间】:2010-12-02 14:27:53
【问题描述】:

我试图在 Perl 中加密然后解密一个二进制文件但没有成功,解密后的文件总是与原始文件不同。我尝试了 Blowfish 和 AES (Rijandael),这是一个简短的示例:

#!/usr/bin/perl
use Crypt::CBC;
use autodie;

my $cipher = Crypt::CBC->new(
    -key    => 'my secret key',
    -cipher => 'Blowfish',
    -header => 'none',
    -iv     => 'dupajasi'
);
$cipher->start('encrypting');
my $sourcefile = "fs9419105v001s.zip";

{
    open(my $OUTF, '>', "$sourcefile.perl.crypt");
    open(my $F, '<', $sourcefile);
    print "[?] Encrypting ... \n";
    while (read($F, $buffer, 1024)) {
        print $OUTF $cipher->crypt($buffer);
    }
    print {$OUTF} $cipher->finish;
    close($OUTF);
}

print "[?] Decrypting.,..... \n";
$cipher2 = Crypt::CBC->new(
    -key    => 'my secret key',
    -cipher => 'Blowfish',
    -header => 'none',
    -iv     => 'dupajasi'
);

{
    open(my $OUTF, '>', "$sourcefile.perl.decrypt");
    open(my $F, '<', "$sourcefile.perl.crypt");
    while (read($F, $buffer, 1024)) {
        print {$OUTF} $cipher2->decrypt($buffer);
    }
    print {$OUTF} $cipher2->finish;
    close($OUTF);
}

谁能帮我找出问题所在?

【问题讨论】:

标签: perl aes blowfish


【解决方案1】:

我可以确认这一点。我发现了一个提示:差异恰好出现在 102410/40016 边界处。

> diff -u fs9419105v001s.zip.hex fs9419105v001s.zip.perl.decrypt.hex
--- fs9419105v001s.zip.hex
+++ fs9419105v001s.zip.perl.decrypt.hex
@@ -62,7 +62,7 @@
 03d0  5d d9 f2 f6 43 bb 3d 9d  92 aa 89 ca 75 dc 0e 51  ]...C.=. ....u..Q
 03e0  55 b2 1a e8 65 d5 29 ac  ca d9 a4 f8 1a cc 67 8b  U...e.). ......g.
 03f0  f9 1b 65 be bc 19 bf 51  e6 9f de 28 ef db db ff  ..e....Q ...(....
-0400  85 38 78 09 a7 62 9f 9d  08 db fc cb 13 90 b9 84  .8x..b.. ........
+0400  c6 a0 8b 75 f4 17 6b 64  08 db fc cb 13 90 b9 84  ...u..kd ........
 0410  f4 a8 30 d2 1d 19 52 f7  8e 84 09 a8 59 f3 4e 1e  ..0...R. ....Y.N.
 0420  3c 30 ca 6e 5b dc bb f3  48 fa 5d 3c b1 e0 64 07  <0.n[... H.]<..d.
 0430  61 98 9e a1 57 9a 69 d6  35 a7 95 5b 0d d7 31 c4  a...W.i. 5..[..1.

这更像是一个评论而不是一个答案,但不幸的是评论框不适合这个回复。

【讨论】:

  • 这可能因输入文件而异,所以没有它就不是很有用。
  • 你错了。无论加密什么文件,差异总是在 400(十六进制)的倍数的精确边界处。在自欺欺人之前花两分钟检验你的假设会不会很痛苦?
  • 我也看到了这个;每 1024 个字节有 8 个字节是不同的。 (Perl 5.8.8,Crypt::CBC 2.24。)
  • 似乎是在解密循环中传递给read()的缓冲区大小的每倍数。
【解决方案2】:
  1. 您应该致电binmode

  2. 你错过了 -&gt;start('decrypting'); 解密。

  3. 您应该使用crypt() 而不是decrypt()。 [ 是的,这很令人困惑 ] 请参阅 perldoc:

解密()

$plaintext = $cipher-&gt;decrypt($ciphertext)

这个 便利功能运行整个 start()、crypt() 和 finish() 为你处理 提供密文并返回 对应的明文。

解密例程应该如下所示:

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

$cipher2->start('de')

print "[?] Decrypting ... \n";

{
    open(my $OUTF, '>', "$sourcefile");
    open(my $F, '<', "$sourcefile.perl.crypt");
    binmode $OUTF;
    binmode $F;
    while (read($F, $buffer, 1024)) {
        print $OUTF $cipher2->crypt($buffer);
    }
    print $OUTF $cipher2->finish;
    close $OUTF;
}

【讨论】:

  • 建议使用 binmode,但这里缺少它并不是问题的原因。
  • @daxim,我相信binmode 是原因。如果你有其他想法,你为什么不回答这个?
  • 我也有这个假设,不过和你比起来我并不懒惰,花了两分钟来验证它。信仰属于寺庙,编程没有它的位置。
猜你喜欢
  • 1970-01-01
  • 2014-03-17
  • 1970-01-01
  • 2014-04-30
  • 1970-01-01
  • 2015-09-24
  • 1970-01-01
  • 2012-01-27
  • 1970-01-01
相关资源
最近更新 更多