base64计算

zjzc01:/root# cat aa.pl 
use URI::Escape;
use URI::Escape qw(uri_unescape);
use MIME::Base64;
use Digest::HMAC_SHA1;
$xx="GET&%2F&AccessKeyId%3DZ7bph8ZgNR4oMNVh%26Action%3DDescribeRegions%26Format%3DJSON%26RegionId%3Dregion1%26SignatureMethod%3DHMAC-SHA1%26SignatureNonce%3DNwDAxvLU6tFE0DVb%26SignatureVersion%3D1.0%26TimeStamp%3D$SDATEX%26Version%3D2014-05-26";
print "$xx is $xx
";
$str=Digest::HMAC_SHA1::hmac_sha1("$xx",'fQIJzvxOXZuc1AhLxtVMz0q2Nd7zkj&');
$Signature = encode_base64($str);
print "$Signature
";



$head='http://ecs.aliyuncs.com/?';
#+ 替换为%20 =替换为%3d
$Signature = uri_escape("$Signature");
print "$Signature is $Signature
";
zjzc01:/root# perl aa.pl 
$xx is GET&%2F&AccessKeyId%3DZ7bph8ZgNR4oMNVh%26Action%3DDescribeRegions%26Format%3DJSON%26RegionId%3Dregion1%26SignatureMethod%3DHMAC-SHA1%26SignatureNonce%3DNwDAxvLU6tFE0DVb%26SignatureVersion%3D1.0%26TimeStamp%3D%26Version%3D2014-05-26
I3GHM2wC+3i40vWpXMRox7AK1WE=

$Signature is I3GHM2wC%2B3i40vWpXMRox7AK1WE%3D%0A

回车是 %0a  

原因是base64计算的时候没有加第2个参数

zjzc01:/root# cat aa.pl 
use URI::Escape;
use URI::Escape qw(uri_unescape);
use MIME::Base64;
use Digest::HMAC_SHA1;
$xx="GET&%2F&AccessKeyId%3DZ7bph8ZgNR4oMNVh%26Action%3DDescribeRegions%26Format%3DJSON%26RegionId%3Dregion1%26SignatureMethod%3DHMAC-SHA1%26SignatureNonce%3DNwDAxvLU6tFE0DVb%26SignatureVersion%3D1.0%26TimeStamp%3D$SDATEX%26Version%3D2014-05-26";
print "$xx is $xx
";
$str=Digest::HMAC_SHA1::hmac_sha1("$xx",'fQIJzvxOXZuc1AhLxtVMz0q2Nd7zkj&');
$Signature = encode_base64($str,"");
print "$Signature
";



$head='http://ecs.aliyuncs.com/?';
#+ 替换为%20 =替换为%3d
$Signature = uri_escape("$Signature");
print "$Signature is $Signature
";
zjzc01:/root# perl aa.pl 
$xx is GET&%2F&AccessKeyId%3DZ7bph8ZgNR4oMNVh%26Action%3DDescribeRegions%26Format%3DJSON%26RegionId%3Dregion1%26SignatureMethod%3DHMAC-SHA1%26SignatureNonce%3DNwDAxvLU6tFE0DVb%26SignatureVersion%3D1.0%26TimeStamp%3D%26Version%3D2014-05-26
I3GHM2wC+3i40vWpXMRox7AK1WE=
$Signature is I3GHM2wC%2B3i40vWpXMRox7AK1WE%3D

       encode_base64($str, $eol);
           Encode data by calling the encode_base64() function.  The first argument is the string to encode.  The second argument is the line-ending sequence to use.  It is optional and defaults to "
".  The returned
           encoded string is broken into lines of no more than 76 characters each and it will end with $eol unless it is empty.  Pass an empty string as second argument if you do not want the encoded string to be broken
           into lines.
		   
		   编码数据通过调用 encode_base64() 函数,第一个参数是需要编码的字符串。
		   
		   第2个参数是行结束,它是可选的 默认是
o
		   
		   返回的编码的字符串被分隔成一行不超过76个字符
		   
		   
		   传递一个空字符串作为第2个参数,如果你不需要把编码的字符串分隔到多行
		   
		   
		   
		   
		   
		   
		   
		   
		   
		   
		   

原文地址:https://www.cnblogs.com/hzcya1995/p/13351008.html