[Perl]Crypt::CBC - 加密解密模块

头像
523066680
Administrator
Administrator
帖子: 338
注册时间: 2016年07月19日 12:14
拥有现金: 锁定
储蓄: 锁定
Has thanked: 30 times
Been thanked: 24 times
联系:

[Perl]Crypt::CBC - 加密解密模块

帖子 #1 523066680 » 2017年12月21日 11:22

示例:

use Modern::Perl;
use Data::Dump qw/dump/;
use Crypt::CBC;
my $cipher = Crypt::CBC->new(
-key => 'password',
-cipher => 'Blowfish',
-header => 'randomiv',
);

my $ciphertext = $cipher->encrypt("This data is hush hush");
my $plaintext = $cipher->decrypt($ciphertext);
say unpack("H*", $ciphertext);
say $plaintext;


Straberry Perl PDL 版本自带 Crypt 相关模块(Strawberry/perl/vendor/lib/crypt),
通常你可以直接使用 Crypt::RSA,Crypt::Blowfish 等模块,
但是这些模块需要手动对数据、密钥进行固定字节的对齐,而Crypt::CBC模块对这些细节做了自动处理。

-cipher 是加密/解密方案,支持 DSA,RSA,IDEA,DES,Blowfish,Twofish 等加密算法
-header 可以是 randomiv, salt, none 三种模式,默认情况下 salt 和 randomiv 都是随机取值。

在 $cipher 对象建立之后,可以重新设置 salt 和 randomiv,也可以通过 $cipher->salt() 的方式获取其值。

送一个示例,终端输入密码(显示星号),将脚本自身加密再解密:

=info
Author: 523066680
Date: 2017-12-20
=cut

use Modern::Perl;
use Win32::Console;
use Crypt::CBC;
use File::Slurp;
use Time::HiRes qw/sleep/;
use IO::Handle;
STDOUT->autoflush(1);

our $IN=Win32::Console->new(STD_INPUT_HANDLE);
our $OUT=Win32::Console->new(STD_OUTPUT_HANDLE);
our $IN_DEFAULT = $IN->Mode();
$IN->Mode(ENABLE_MOUSE_INPUT);

my $key = get_password();
cipher("encrypt", $key, __FILE__ , __FILE__ ."_enc.txt", );
cipher("decrypt", $key, __FILE__ ."_enc.txt" , __FILE__ ."_dec.txt", );
pause();

sub get_password
{
my @st;
my $inp = "";
print "Password:";
while (1)
{
sleep 0.01;
@st = $IN->Input();
next if ($#st < 0);
if ( $st[0] == 1 and $st[1] == 1 )
{
if ( chr($st[5]) =~ /[\x20-\x7e]/ ) { print "*"; $inp .= chr($st[5]) }
elsif ( $st[5] == 27 ) { exit }
elsif ( $st[5] == 13 ) { print "\n"; last }
elsif ( $st[5] == 8 ) { backspace( \$inp ) }
}
}
return $inp;
}

sub backspace
{
my $s_ref = shift;
if ( length($$s_ref) > 0 )
{
print "\b \b";
$$s_ref =~ s/.$//;
}
}

sub pause
{
print "Press any key to continue ...";
my @st;
while (1)
{
sleep 0.02;
@st = $IN->Input();
next if ($#st < 0);
exit if ( $st[0] == 1 and $st[1] == 1 );
}
}

sub cipher
{
my ($mode, $key, $src, $dst) = @_;
say "${mode}ing";
my $cipher = Crypt::CBC->new( -key => $key, -cipher => 'Blowfish' );
my $stream = read_file( $src, binmode => ":raw" );
my $result = $cipher->$mode( $stream );
write_file( $dst, { binmode => ":raw" }, $result );
}
[Finished in 0.4s]

回到 “模块”

在线用户

用户浏览此论坛: 没有注册用户 和 0 访客