• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    公众号

DelphiXE10.3.3RSA签名(IdSSLOpenSSLHeaders)

原作者: [db:作者] 来自: [db:来源] 收藏 邀请

 

unit Unit1;

interface

uses
  System.NetEncoding, IdGlobal, IdSSLOpenSSL, IdSSLOpenSSLHeaders, EncdDecd,
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants,
  System.Classes, Vcl.Graphics, Vcl.Controls, Vcl.Forms, Vcl.Dialogs,
  Vcl.StdCtrls;

type
  TForm1 = class(TForm)
    btn1: TButton;
    procedure btn1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

function Sign(msg, keyfile: ansistring; zfj, jmfs: integer; var signstr: ansistring): integer;
  //zfj:字符集 0 utf8 1 gbk  jmfs:加密方式 0RSA 1RSA2 2MD5
var
//  Path: ansistring;
  pkey: PEVP_PKEY;
  bp: PBIO;
  md_ctx: EVP_MD_CTX;
  Buf: ansistring;
  len: integer;
  SigBuf: array[0..4095] of AnsiChar;
  SigLen: integer;
//  InBuf: array[0..1023] of AnsiChar;
begin
  result := -1;

  try
    if (not FileExists(keyfile)) then
    begin
      result := -2;
      exit;
    end;

    // 签名      sign_type=RSA2 或RSA
    Buf := Trim(msg);

    if zfj = 0 then // 如果用UTF-8请UTF8编码
      Buf := utf8encode(Buf);

    len := length(Buf);

    bp := BIO_new_file(PansiChar(keyfile), 'r'); // 加载私钥

    ShowMessage('加载私钥');

    try
      pkey := PEM_read_bio_PrivateKey(bp, nil, nil, nil);
    finally
      BIO_free(bp);
    end;

    case jmfs of
      0:
        EVP_SignInit(@md_ctx, EVP_sha1); // 如果用RSA用 EVP_sha1
      1:
        EVP_SignInit(@md_ctx, EVP_sha256); // 如果是RSA2用 EVP_sha256
      2:
        EVP_SignInit(@md_ctx, EVP_md5); // 如果用MD5用 EVP_md5
    end;

    EVP_SignUpdate(@md_ctx, PansiChar(Buf), len);

    EVP_SignFinal(@md_ctx, @SigBuf, @SigLen, pkey);

   // signstr := EncodeBase64(@SigBuf, SigLen);
    signstr := AnsiString(TNetEncoding.Base64.EncodeBytesToString(@SigBuf, SigLen));
    result := 0;
  except
    on E: Exception do
      result := -3;
  end;
end;

procedure TForm1.btn1Click(Sender: TObject);
var
  signstr: ansistring;
begin
  if Sign('123456', 'rsa_private_key.pem', 0, 0, signstr) = 0 then
  begin
    ShowMessage(signstr);

  end
  else
    ShowMessage('签名失败');
end;

end.

 


鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
上一篇:
Delphi下如何使程序在Win7/Vista上用管理员权限运行[转]发布时间:2022-07-18
下一篇:
理解Delphi的类(八)-关于类的定义发布时间:2022-07-18
热门推荐
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap