2

这是我的代码:

#!/usr/bin/perl -w
use Crypt::CBC;

my $scriptkey = qx(cat /tmp/scriptkeyfile);
chomp $scriptkey;

print new Crypt::CBC(-key=>"$scriptkey",-salt=>"my_salt")->encrypt(qx(cat $ARGV[0]));

此脚本仅加密给定文件的第一行。如果我将加密更改为解密,它只会解密给定文件的一行。如何改变这一点,加密整个文件。

4

2 回答 2

1

qxis list context 返回一个行列表,所以

->encrypt(qx( ... ))

结果是

->encrypt($line1, $line2, $line3, ...)

->encrypt($plaintext)

是期待。在标量上下文中使用qx以将整个输出作为一个标量返回。

my $file = qx( prog ... );
die("Can't execute prog: $!\n") if $? == -1;
die("prog killed by signal ".( $? & 0x7F )."\n") if $? & 0x7F;
die("prog exited with error ".( $? >> 8 )."\n") if $? >> 8;

my $cypher = Crypt::CBC->new( ... );
print $cypher->encrypt($file);

我假设您实际上并没有使用cat,这只是一个示例。

于 2015-08-14T14:30:40.963 回答
1

Crypt::CBC 文档实际上解释了如何加密整个文件。

CBC 算法必须在内部缓冲数据块,直到它们是加密算法块大小的偶数倍(通常为 8 字节)。在最后一次调用 crypt() 之后,您应该调用 finish()。这会刷新内部缓冲区并返回任何剩余的密文。

在一个典型的应用程序中,您将从文件或输入流中读取明文,然后在一个可能如下所示的循环中将结果写入标准输出:

   $cipher = new Crypt::CBC('hey jude!');
   $cipher->start('encrypting');
   print $cipher->crypt($_) while <>;
   print $cipher->finish();

所以你的程序可能看起来像这样。

use strict;
use warnings;
use Crypt::CBC;
use File::Slurp;

my $scriptkey = read_file( '/tmp/scriptkeyfile' );
chomp $scriptkey;

open my $fh, '<', $ARGV[0] or die $!; # sanitize this!!!

my $encrypted;
my $cipher = Crypt::CBC->new( -key => $scriptkey, -salt => "my_salt" );
$cipher->start('encrypting');
$encrypted .= $cipher->crypt($_) while <$fh>;
$encrypted .= $cipher->finish;

close $fh;
于 2015-08-14T13:04:34.490 回答