2

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

誰かが何が間違っているかを見つけるのを手伝ってくれますか?

4

2 に答える 2

2

これを確認できます。ヒントを見つけました。違いは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.

これは回答というよりコメントですが、残念ながらコメントボックスはこの返信には適していません。

于 2010-12-02T15:13:51.700 に答える
1
  1. あなたは電話するべきですbinmode

  2. ->start('decrypting');復号化に失敗 しました。

  3. crypt()notを使用する必要がありますdecrypt()。[はい、これは紛らわしいです] perldoc を参照してください:

復号化()

$plaintext = $cipher->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;
}
于 2010-12-02T15:02:48.567 に答える