如何在Perl中处理非ANSI字符到Crypt :: Blowfish?
以下脚本是使用charset UTF-8编写的,仅在§
或ö
上失败。
#!/usr/bin/env perl
use strict;
use warnings FATAL => 'all';
use utf8;
use Crypt::Blowfish;
my $cipher = Crypt::Blowfish->new( pack 'H16', '12345678' );
my @chars = ( 'a', '§', 'ö', '9' );
printf( "%s: %s",
$_, ( eval { $cipher->encrypt( $_ x 8 ) } ) ? "ok\n" : "fail: $@" )
for ( @chars );
答案 0 :(得分:4)
密码可以处理字节的流或块,但是您没有为它提供字节。您正在为其提供Unicode应对点。
在加密之前,您需要将要加密的任何文本序列化为字节,也就是说,您需要对文本进行编码。
use Encode qw( encode_utf8 );
my $bytes = encode_utf8($char x 8);
此外,您不应直接使用Crypt::Blowfish。这将产生弱加密。您想通过Crypt::CBC访问它。这提供了盐渍,链接和填充。
use Crypt::CBC qw( );
use Encode qw( encode_utf8 decode_utf8 );
my $cipher = Crypt::CBC->new(
-key => '... key phrase ...',
-cipher => 'Blowfish',
);
my $cipher_bytes = $cipher->encrypt(encode_utf8($plain_text));
my $plain_text = decode_utf8($cipher->decrypt($cipher_bytes));
答案 1 :(得分:2)
许多Crypt :: *模块都是块加密算法。因此,它们只能使用固定长度的块。由于'§'是一个UTF8字符,它实际上包含超过1个字节,这就是你的代码失败的原因。另一个问题是你使用use utf8
pragma,这意味着将使用“utf8 flag”创建utf8常量字符串。这可能导致二进制算法发生重大变化,如加密。
我建议您使用Crypt::CBC
模块(在CPAN上查看);并且,在加密前删除utf8标志:utf8::encode($_);