我在下面有加密/解密的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;
答案 0 :(得分:3)
以下内容将@_
(1
)中的元素数量分配给$mystring
:
my $my_string=@_;
你想:
my ($my_string) = @_;
您在加密期间使用base64对数据进行了编码,但在解密期间没有相应的decode_base64
。
你有什么不安全的地方!
您使用literal_key
使用文本密码并使用常量iv
来违反许多安全机制。
请注意,只有明文不能包含NUL字符时才能使用null
填充。这不是一个非常合适的填充方法。
我不知道使用16字节密钥而不是默认的32字节密钥有什么含义。
encode_base64
被滥用,因为您不希望编码字符串中有换行符。将encode_base64($s)
替换为encode_base64($s, '')
。
你的缩进很糟糕。
#!/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