Perl中Rijndael CBC加密解密

Rijndael CBC encryption decryption in Perl

我在下面有 encrypting/decrypting 的 perl 代码。加密接缝正在工作。解密不是恢复原件。原文:4111111111111111 加密:IW7K95q8p1Wa89CQ2DoIxQ== 解密:§À@ŽŒ¦õúubp 我需要解密以匹配原件。有任何想法吗?还有其他建议吗?

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

下面将@_(1)中的元素个数赋值给$mystring

my $my_string=@_;

你想要:

my ($my_string) = @_;

错误 2

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

错误 3

你所拥有的是非常不安全的!

您通过使用带有文本密码的 literal_key 和常量 iv.

来挑战许多安全机制

请注意,仅当明文不能包含 NUL 字符时,用 null 填充才有效。不是很合适的padding方法

我不知道使用 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