支付宝签名
//1024位的RSA密钥基本安全,2048位的密钥极其安全。支付宝建议采用2048位秘钥。
//事实上现在注册的支付宝商户,只能使用SHA256WithRSA算法,老商户才可以继续使用SHA1WithRSA算法
//RSA2 SHA256WithRSA (强烈推荐使用),强制要求RSA密钥的长度至少为2048,
//RSA SHA1WithRSA 对RSA密钥的长度不限制,推荐使用2048位以上
function Sign(filename,msg : String):string;
var
ctx : EVP_MD_CTX ;
buf_in:Pchar;
m_len,outl :cardinal;
pKey : PEVP_PKEY;
// m,buf_out:array [0..1024] of char;
m,buf_out:array [0..2048] of char;
p:array [0..255] of char;
i:Integer;
begin
buf_out:='';
pKey := nil;
if filename='' then
begin
Result:='';
Exit;
end;
pKey := LoadPrivateKey(filename);
buf_in := PChar(msg);
EVP_MD_CTX_init(@ctx); //初始化
EVP_SignInit(@ctx,EVP_sha256());
// EVP_SignInit(@ctx,EVP_sha1()); //将需要使用的摘要算法存入ctxl中
EVP_SignUpdate(@ctx,buf_in,Length(buf_in));//存入编码值
EVP_DigestFinal(@ctx,m,m_len); //求取编码的长度为m_len摘要值存入m中
// rSA_sign(EVP_sha1()._type,m,m_len,buf_out,@outl,pkey.pkey.rsa); //64为SHA1的NID
rSA_sign(EVP_sha256()._type,m,m_len,buf_out,@outl,pkey.pkey.rsa); //64为SHA1的NID
EVP_MD_CTX_cleanup(@ctx);
BinToHex(buf_out,p,outl);
Result:=EncodeString(hextostring(p)) ;
// Result:=EncodeString(StrPas(buf_out)) ;
end;