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.