代码之家  ›  专栏  ›  技术社区  ›  Artur Szymczak

Perl密码:CBC仅加密/解密第一个列表

  •  2
  • Artur Szymczak  · 技术社区  · 11 年前

    这是我的代码:

    #!/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]));
    

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

    2 回复  |  直到 11 年前
        1
  •  1
  •   ikegami Gilles Quénot    11 年前

    qx is列表上下文返回行列表,因此

    ->encrypt(qx( ... ))
    

    结果

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

    但是

    ->encrypt($plaintext)
    

    应为。使用 质量x 以将整个输出作为一个标量返回。

    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 ,这只是一个例子。

        2
  •  1
  •   simbabque    11 年前

    这个 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;