这是我的代码:
#!/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]));
此脚本仅加密给定文件的第一行。如果我将加密更改为解密,它将只解密给定文件的一行。如何改变这一点,以加密整个文件。
答案 0 :(得分:1)
Crypt::CBC docs actually explain如何加密整个文件。
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;
答案 1 :(得分:1)
qx
是列表上下文返回行列表,所以
->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
,这只是一个例子。