1

非ANSI文字をPerlでCrypt::Blowfishに処理する方法は?

次のスクリプトは文字セット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 );
4

2 に答える 2

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));
于 2013-02-27T12:48:49.063 に答える
2

Crypt :: *モジュールの多くは、ブロック暗号化アルゴリズムです。したがって、固定長のブロックでのみ機能します。'§'はUTF8文字であるため、実際には1バイト以上含まれているため、コードが失敗します。もう1つの問題は、use utf8プラグマを使用していることです。つまり、utf8定数文字列は「utf8フラグ」で作成されます。これにより、暗号化などのバイナリアルゴリズムに大きな変更が生じる可能性があります。

モジュールを使用することをお勧めしますCrypt::CBC(CPANで確認してください)。そして、暗号化の前にutf8フラグを削除します。utf8::encode($_);

于 2013-02-27T12:48:18.277 に答える