【发布时间】:2017-07-24 12:05:12
【问题描述】:
我正在尝试在 perl 中使用 Crypt::CBC 加密然后解密文件。在加密后解密我的密文时,我在恢复的明文末尾丢失了一些字节。
加密方式:
#!/usr/bin/perl
use 5.24.0;
use warnings;
use Crypt::CBC;
my $cipher;
my $buffer;
$cipher = Crypt::CBC->new( {'key' => 'abcdefgh',
'literal_key' => 1,
# 'cipher' => 'Blowfish',
'iv' => '01234567',
# 'regenerate_key' => 0, # default true
'padding' => 'standard',
'prepend_iv' => 0,
'blocksize' => 8
});
$cipher->start('encrypting');
open(F,"./plaintext.txt");
open(STDOUT,">ciphertext.txt");
while (sysread(F,$buffer,1024)) {
print $cipher->crypt($buffer);
}
close STDOUT;
我的明文如下所示:
然后我解密我的密文:
#!/usr/bin/perl
# # entschlüsselt eine datei, http://www.perlmonks.org/?node_id=252460
use 5.24.0;
use warnings;
use Crypt::CBC;
my $cipher;
my $buffer;
$cipher = Crypt::CBC->new( {'key' => 'abcdefgh',
'literal_key' => 1,
#'cipher' => 'Blowfish',
'iv' => '01234567',
# 'regenerate_key' => 0, # default true
'padding' => 'standard',
'prepend_iv' => 0,
'blocksize' => 8
});
$cipher->start('decrypting');
open(F,"./ciphertext.txt")
while (sysread(F,$buffer,1024)) {
print $cipher->crypt($buffer);
}
close STDOUT;
以及之后的明文:
【问题讨论】:
-
像这样重新打开 STDOUT 是一种奇怪的做法。您可以尝试打开一个单独的非默认文件句柄吗?我想知道这样做是否会导致它不像你期望的那样被刷新。
-
虽然它在这种特殊情况下可能没有效果,但您希望使用
:raw句柄完成与ciphertext.txt的交互,因为它是“二进制”文件,而不是文本文件(尽管扩展名)。 -
提示:使用常量 IV 是不负责任并且严重会削弱您的加密。让 CBC 随机选择一个!
-
... 并将 IV 作为密文的前缀(它具有恒定的大小)。但这是上面代码的第四个问题,我猜你(ichtyp)需要在继续之前阅读更多关于文件处理和加密的内容。
-
@frezik:我现在使用一个单独的文件处理程序,它帮助我摆脱了行尾的 CR LF 格式问题。
标签: perl encryption file-handling des