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
我在下面有 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