Perl

时间:2016-06-26 04:33:56

标签: perl encryption base64 rijndael

我在下面有加密/解密的perl代码。加密接缝正在运行。解密不是恢复原始。原文:4111111111111111加密:IW7K95q8p1Wa89CQ2DoIxQ ==解密:§À@ŽŒ|õúbp 我需要解密来匹配原始。有任何想法吗?还有其他建议吗?

use strict;
use warnings;
use feature qw( say );

use Crypt::CBC   qw( );
use MIME::Base64 qw( encode_base64 decode_base64 );

sub decrypt {
my $my_string=@_;
my $cipher = Crypt::CBC->new(
{
    'key'         => 'length16length16',
    'cipher'      => 'Rijndael',
    'iv'          => '1234567890abcdef',
    'literal_key' => 1,
    'padding'     => 'null',
    'header'      => 'none',
    keysize       => 128 / 8
}
);
my $return = $cipher->decrypt($my_string);
return $return;
}

sub encrypt {
my $my_string=@_;
my $cipher = Crypt::CBC->new(
{
    'key'         => 'length16length16',
    'cipher'      => 'Rijndael',
    'iv'          => '1234567890abcdef',
    'literal_key' => 1,
    'padding'     => 'null',
    'header'      => 'none',
    keysize       => 128 / 8
}
);
my $return = encode_base64($cipher->encrypt($my_string));
return $return;
}

my $cc = '4111111111111111';
my $coded = encrypt($cc);
say $coded;
my $decoded = decrypt($coded);
say $decoded;

1 个答案:

答案 0 :(得分:3)

错误1

以下内容将@_1)中的元素数量分配给$mystring

my $my_string=@_;

你想:

my ($my_string) = @_;

错误2

您在加密期间使用base64对数据进行了编码,但在解密期间没有相应的decode_base64

错误3

你有什么不安全的地方!

您使用literal_key使用文本密码并使用常量iv来违反许多安全机制。

请注意,只有明文不能包含NUL字符时才能使用null填充。这不是一个非常合适的填充方法。

我不知道使用16字节密钥而不是默认的32字节密钥有什么含义。

错误4

encode_base64被滥用,因为您不希望编码字符串中有换行符。将encode_base64($s)替换为encode_base64($s, '')

错误5

你的缩进很糟糕。

解决方案

#!/usr/bin/perl    
use strict;
use warnings;
use feature qw( say );

use Crypt::CBC   qw( );
use MIME::Base64 qw( encode_base64 decode_base64 );

my $key = 'length16length16';

my $cipher = Crypt::CBC->new({
    cipher => 'Rijndael',
    key    => $key,
});

sub decrypt {
    my ($my_string) = @_;
    return $cipher->decrypt(decode_base64($my_string));
}

sub encrypt {
    my ($my_string) = @_;
    return encode_base64($cipher->encrypt($my_string), '');
}

{
    my $cc = '4111111111111111';
    my $coded = encrypt($cc);
    say $coded;
    my $decoded = decrypt($coded);
    say $decoded;
}

输出:

U2FsdGVkX1/QYQrNSEadlko4jtKdjM+yNaW0ZnCAmhyHHz0NyDL+id6BsM2kVPGw
4111111111111111