请教Sha1WithRSA签名的问题,急!

xy_huangzhanglei 2015-11-05 07:06:32
我使用的是D2010,openssl是1.0.0.7(其他版本也试过),libeay32.pas是从网上下载的0.9.6b
按照百度搜索的文章所说,在libeay32.pas中添加
procedure EVP_MD_CTX_init(ctx: pEVP_MD_CTX); cdecl;
procedure EVP_MD_CTX_cleanup(ctx: pEVP_MD_CTX); cdecl;
function RSA_sign(rsatype: integer; m: PCharacter; m_length: integer;
sigbuf: PCharacter; siglen: Cardinal; rsa: pRSA): integer; cdecl;
procedure EVP_MD_CTX_init; external LIBEAY_DLL_NAME;
procedure EVP_MD_CTX_cleanup; external LIBEAY_DLL_NAME;
function RSA_sign; external LIBEAY_DLL_NAME;

key文件是用openssl工具生成的,可是签名却总是报内存错误
以下是详细代码,请做过的给指点以下,





uses
libeay32, EncdDecd;

function LoadPrivateKey(filename: AnsiString): PEVP_PKEY;
var
bp: PBIO;
A, pkey: PEVP_PKEY;
begin
A := nil;
bp := BIO_new(BIO_s_file());
BIO_read_filename(bp, PAnsiChar(filename));
pkey := PEM_read_bio_PrivateKey(bp, A, nil, NIL);
BIO_free(bp);
Result := pkey;
end;

function Sign(filename, msg: AnsiString): string;
var
ctx: EVP_MD_CTX;
buf_in: PAnsiChar;
m_len, outl: cardinal;
pkey: PEVP_PKEY;
m, buf_out: array [0 .. 1024] of AnsiChar;
p: array [0 .. 255] of AnsiChar;
i: Integer;
begin
buf_out := '';
if filename = '' then
begin
Result := '';
Exit;
end;
ZeroMemory(@m, SizeOf(m));
ZeroMemory(@buf_out, SizeOf(buf_out));
pkey := LoadPrivateKey(filename);
buf_in := PAnsiChar(msg);
EVP_MD_CTX_init(@ctx); // 初始化
EVP_SignInit(@ctx, EVP_sha1());
EVP_SignUpdate(@ctx, buf_in, Length(buf_in));
EVP_DigestFinal(@ctx, m, m_len);
RSA_sign(EVP_sha1()._type, m, m_len, buf_out, outl, pkey.pkey.rsa); //<---------------此处报错
{
---------------------------
Project1
---------------------------
Access violation at address 67A93071 in module 'libeay32.dll'. Read of address EF96BD97.
---------------------------
确定
---------------------------
}
EVP_MD_CTX_cleanup(@ctx);
Result := EncodeString(StrPas(buf_out));
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
OpenSSL_add_all_algorithms;
Sign('d:\rsa_private_key.pem', '123456');
end;
...全文
4602 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
PCharacter是什么类型,delphi6没有这个类型
ky_chenchen 2017-02-07
  • 打赏
  • 举报
回复
大神,求源码 476080300@qq.com
xiaojianace 2016-08-08
  • 打赏
  • 举报
回复
大神,求源码 237337967@qq.com
xiaojianace 2016-08-08
  • 打赏
  • 举报
回复
大神,求源码
star1010 2016-01-05
  • 打赏
  • 举报
回复
前面的函数我已发现有BUG,会偶尔出现不一致的情况
tangbin151 2015-12-13
  • 打赏
  • 举报
回复
0.98的2个dll在哪下载?我用indy9 的dll,有2个过程没有定义
shadowpj 2015-11-09
  • 打赏
  • 举报
回复
我也弄了2个星期才搞定!首先感谢star1010 提供的2个函数! 第一步:下载indy9 支持ssllib 的2个DLL。CSDN有! 第二步:网上百度libeay32.pas 第三步:修改libeay32.pas,自己添加 procedure EVP_MD_CTX_init(ctx: pEVP_MD_CTX); cdecl; procedure EVP_MD_CTX_cleanup(ctx: pEVP_MD_CTX); cdecl; function RSA_sign(len:integer;_m:PCharacter;_m_length:integer; from: PCharacter; _to: pointer; rsa: pRSA): integer; cdecl; 第四步:就是DELPHI代码了: function LoadPrivateKey(filename:string ): PEVP_PKEY; var bp : PBIO ; A,pkey :PEVP_PKEY ; begin a:=nil; bp := BIO_new(BIO_s_file()) ; BIO_read_filename(bp, PChar(filename)); pkey := PEM_read_bio_PrivateKey(bp, a, nil,NIL); BIO_free(bp); Result:= pkey; end; 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; p:array [0..255] of char; i:Integer; begin buf_out:=''; if filename='' then begin Result:=''; Exit; end; pKey := LoadPrivateKey(filename); buf_in := PChar(msg); EVP_MD_CTX_init(@ctx); //初始化 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 EVP_MD_CTX_cleanup(@ctx); Result:=EncodeString(StrPas(buf_out)) ; 出来的结果和淘宝提供的签名工具一致! 一开始我也是报错!你用的是indy几?我用的是9,要下载特定的2个库
xy_huangzhanglei 2015-11-09
  • 打赏
  • 举报
回复
原来是跟openssl动态库有关,换了好多dll,终于找着一个0.9.8的能用,浪费我这么多时间。 非常感谢shadowpj!!

1,183

社区成员

发帖
与我相关
我的任务
社区描述
Delphi Windows SDK/API
社区管理员
  • Windows SDK/API社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧