⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 sha.pm

📁 source of perl for linux application,
💻 PM
📖 第 1 页 / 共 2 页
字号:
package Digest::SHA;require 5.003000;use strict;use integer;use vars qw($VERSION @ISA @EXPORT @EXPORT_OK);$VERSION = '5.45';require Exporter;require DynaLoader;@ISA = qw(Exporter DynaLoader);@EXPORT_OK = qw(	hmac_sha1	hmac_sha1_base64	hmac_sha1_hex	hmac_sha224	hmac_sha224_base64	hmac_sha224_hex	hmac_sha256	hmac_sha256_base64	hmac_sha256_hex	hmac_sha384	hmac_sha384_base64	hmac_sha384_hex	hmac_sha512	hmac_sha512_base64	hmac_sha512_hex	sha1		sha1_base64		sha1_hex	sha224		sha224_base64		sha224_hex	sha256		sha256_base64		sha256_hex	sha384		sha384_base64		sha384_hex	sha512		sha512_base64		sha512_hex);# If possible, inherit from Digest::base (which depends on MIME::Base64)*addfile = \&Addfile;eval {	require MIME::Base64;	require Digest::base;	push(@ISA, 'Digest::base');};if ($@) {	*hexdigest = \&Hexdigest;	*b64digest = \&B64digest;}# The following routines aren't time-critical, so they can be left in Perlsub new {	my($class, $alg) = @_;	$alg =~ s/\D+//g if defined $alg;	if (ref($class)) {	# instance method		unless (defined($alg) && ($alg != $class->algorithm)) {			sharewind($$class);			return($class);		}		shaclose($$class) if $$class;		$$class = shaopen($alg) || return;		return($class);	}	$alg = 1 unless defined $alg;	my $state = shaopen($alg) || return;	my $self = \$state;	bless($self, $class);	return($self);}sub DESTROY {	my $self = shift;	shaclose($$self) if $$self;}sub clone {	my $self = shift;	my $state = shadup($$self) || return;	my $copy = \$state;	bless($copy, ref($self));	return($copy);}*reset = \&new;sub add_bits {	my($self, $data, $nbits) = @_;	unless (defined $nbits) {		$nbits = length($data);		$data = pack("B*", $data);	}	shawrite($data, $nbits, $$self);	return($self);}sub _bail {	my $msg = shift;        require Carp;        Carp::croak("$msg: $!");}sub _addfile {  # this is "addfile" from Digest::base 1.00    my ($self, $handle) = @_;    my $n;    my $buf = "";    while (($n = read($handle, $buf, 4096))) {        $self->add($buf);    }    _bail("Read failed") unless defined $n;    $self;}sub Addfile {	my ($self, $file, $mode) = @_;	return(_addfile($self, $file)) unless ref(\$file) eq 'SCALAR';	$mode = defined($mode) ? $mode : "";	my ($binary, $portable) = map { $_ eq $mode } ("b", "p");	my $text = -T $file;	local *FH;	open(FH, "<$file") or _bail("Open failed");	binmode(FH) if $binary || $portable;	unless ($portable && $text) {		$self->_addfile(*FH);		close(FH);		return($self);	}	my ($n1, $n2);	my ($buf1, $buf2) = ("", "");	while (($n1 = read(FH, $buf1, 4096))) {		while (substr($buf1, -1) eq "\015") {			$n2 = read(FH, $buf2, 4096);			_bail("Read failed") unless defined $n2;			last unless $n2;			$buf1 .= $buf2;		}		$buf1 =~ s/\015?\015\012/\012/g; 	# DOS/Windows		$buf1 =~ s/\015/\012/g;          	# early MacOS		$self->add($buf1);	}	_bail("Read failed") unless defined $n1;	close(FH);	$self;}sub dump {	my $self = shift;	my $file = shift || "";	shadump($file, $$self) || return;	return($self);}sub load {	my $class = shift;	my $file = shift || "";	if (ref($class)) {	# instance method		shaclose($$class) if $$class;		$$class = shaload($file) || return;		return($class);	}	my $state = shaload($file) || return;	my $self = \$state;	bless($self, $class);	return($self);}Digest::SHA->bootstrap($VERSION);1;__END__=head1 NAMEDigest::SHA - Perl extension for SHA-1/224/256/384/512=head1 SYNOPSISIn programs:		# Functional interface	use Digest::SHA qw(sha1 sha1_hex sha1_base64 ...);	$digest = sha1($data);	$digest = sha1_hex($data);	$digest = sha1_base64($data);	$digest = sha256($data);	$digest = sha384_hex($data);	$digest = sha512_base64($data);		# Object-oriented	use Digest::SHA;	$sha = Digest::SHA->new($alg);	$sha->add($data);		# feed data into stream	$sha->addfile(*F);	$sha->addfile($filename);	$sha->add_bits($bits);	$sha->add_bits($data, $nbits);	$sha_copy = $sha->clone;	# if needed, make copy of	$sha->dump($file);		#	current digest state,	$sha->load($file);		#	or save it on disk	$digest = $sha->digest;		# compute digest	$digest = $sha->hexdigest;	$digest = $sha->b64digest;From the command line:	$ shasum files	$ shasum --help=head1 SYNOPSIS (HMAC-SHA)		# Functional interface only	use Digest::SHA qw(hmac_sha1 hmac_sha1_hex ...);	$digest = hmac_sha1($data, $key);	$digest = hmac_sha224_hex($data, $key);	$digest = hmac_sha256_base64($data, $key);=head1 ABSTRACTDigest::SHA is a complete implementation of the NIST Secure HashStandard.  It gives Perl programmers a convenient way to calculateSHA-1, SHA-224, SHA-256, SHA-384, and SHA-512 message digests.The module can handle all types of input, including partial-bytedata.=head1 DESCRIPTIONDigest::SHA is written in C for speed.  If your platform lacks aC compiler, you can install the functionally equivalent (but muchslower) L<Digest::SHA::PurePerl> module.The programming interface is easy to use: it's the same one foundin CPAN's L<Digest> module.  So, if your applications currentlyuse L<Digest::MD5> and you'd prefer the stronger security of SHA,it's a simple matter to convert them.The interface provides two ways to calculate digests:  all-at-once,or in stages.  To illustrate, the following short program computesthe SHA-256 digest of "hello world" using each approach:	use Digest::SHA qw(sha256_hex);	$data = "hello world";	@frags = split(//, $data);	# all-at-once (Functional style)	$digest1 = sha256_hex($data);	# in-stages (OOP style)	$state = Digest::SHA->new(256);	for (@frags) { $state->add($_) }	$digest2 = $state->hexdigest;	print $digest1 eq $digest2 ?		"whew!\n" : "oops!\n";To calculate the digest of an n-bit message where I<n> is not amultiple of 8, use the I<add_bits()> method.  For example, considerthe 446-bit message consisting of the bit-string "110" repeated148 times, followed by "11".  Here's how to display its SHA-1digest:	use Digest::SHA;	$bits = "110" x 148 . "11";	$sha = Digest::SHA->new(1)->add_bits($bits);	print $sha->hexdigest, "\n";Note that for larger bit-strings, it's more efficient to use thetwo-argument version I<add_bits($data, $nbits)>, where I<$data> isin the customary packed binary format used for Perl strings.The module also lets you save intermediate SHA states to disk, ordisplay them on standard output.  The I<dump()> method generatesportable, human-readable text describing the current state ofcomputation.  You can subsequently retrieve the file with I<load()>to resume where the calculation left off.To see what a state description looks like, just run the following:	use Digest::SHA;	Digest::SHA->new->add("Shaw" x 1962)->dump;As an added convenience, the Digest::SHA module offers routines tocalculate keyed hashes using the HMAC-SHA-1/224/256/384/512algorithms.  These services exist in functional form only, andmimic the style and behavior of the I<sha()>, I<sha_hex()>, andI<sha_base64()> functions.	# Test vector from draft-ietf-ipsec-ciph-sha-256-01.txt	use Digest::SHA qw(hmac_sha256_hex);	print hmac_sha256_hex("Hi There", chr(0x0b) x 32), "\n";=head1 NIST STATEMENT ON SHA-1I<NIST was recently informed that researchers had discovered a wayto "break" the current Federal Information Processing Standard SHA-1algorithm, which has been in effect since 1994. The researchershave not yet published their complete results, so NIST has notconfirmed these findings. However, the researchers are a reputableresearch team with expertise in this area.>I<Due to advances in computing power, NIST already planned to phaseout SHA-1 in favor of the larger and stronger hash functions (SHA-224,SHA-256, SHA-384 and SHA-512) by 2010. New developments should usethe larger and stronger hash functions.>ref. L<http://www.csrc.nist.gov/pki/HashWorkshop/NIST%20Statement/Burr_Mar2005.html>=head1 PADDING OF BASE64 DIGESTSBy convention, CPAN Digest modules do B<not> pad their Base64 output.Problems can occur when feeding such digests to other software thatexpects properly padded Base64 encodings.For the time being, any necessary padding must be done by the user.Fortunately, this is a simple operation: if the length of a Base64-encodeddigest isn't a multiple of 4, simply append "=" characters to the endof the digest until it is:

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -