package pc; use strict; use Digest::SHA qw(hmac_sha256 sha1 sha224 sha384); use Exporter "import"; use vars '@EXPORT_OK'; use bytes; sub step { my $i=shift; $_[$i->[0]]^= hmac_sha256(substr("op",abs($i->[0]),1) ,$i->[-1] ,$_[$i->[0]-$i->[1]].$_[$i->[0]+$i->[1]]); $i->[0]+=1; return ($i,$_[1],$_[-1],$_[0]) } sub block{ my ($key,$d,$s)=@_; return shift if @_==1; $key=[-1,1+-2*$d,$key]if!ref$key; my @r=reverse step step step $key,substr($s,0,32),substr($s,32,32),substr($s,64,32); pop @r; return join"",@r } sub hash{ my $b=shift; return scalar reverse sha224($b).sha384($b).sha1($b) } sub test{my($k,$d)=@_; return $d eq round $k,1,round $k,0,$d } sub size(){96} sub encrypt{my($k,$d)=@_; return 1 if!@_; return([-1,-1,@_],1)if@_==1; my$o=(length$d)%size; my$b=hash $d; my$iv=$b; $b.=$d; my$r=$iv; my$x; for($x=size;$x+$olength$e; my$o=(length$e)%size; my$x=substr$e,0,$o; my$r=""; my$iv=block$x.$k,1,hash$k.$x; for($x=$o;$x