Delphi RSA加解密(二)

本文详细介绍了如何使用DelphiXE10.1Berlin封装DLL以实现RSA加解密功能,同时处理了与Delphi6主程序中libeay32.dll的兼容问题。通过提供接口,DLL可以被其他低版本的Delphi程序调用,进行不同类型的RSA加密操作。文章还提供了主程序模拟示例,展示了如何在VCL应用程序中使用这些加密接口。

dll开发环境: Delphi XE 10.1 Berlin

exe开发环境: Delphi 6

前提文章: Delphi RSA加解密(一)

目录

1. 概述

2. 准备工作

        2.1 下载DEMO程序

        2.2 字符编码说明

3. Cryption.dll封装

        3.1 接口概况

        3.2 uPub.pas单元代码

        3.3 uInterface.pas单元代码

        3.4 特别注意

4. 主程序模拟

        4.1 程序目录结构说明

        4.2 建立VCL应用程序

        4.3 接口引入单元

        4.4 接口加密验证

5. 结语


1. 概述

        公司用D6来编写三方接口,当前做某银行转账接口,采用RSA算法。在上一篇文章Delphi RSA加解密(一)中在网上找到了解决方案。

        D6版本低了,所有只有采用XE 10.1来封装dll。当前加密算法基于opelSSL,则依赖"libeay32.dll", 由于HIS程序目录下已有该dll,担心替换libeay32.dll会影响相关功能,特进行了特殊处理。

2. 准备工作

        2.1 下载DEMO程序

        在前提文章中提到了大佬分享的Demo. 下载后会发现bin目录有libeay32.dll。 这个文件很关键,后来我调试中,我使用XE 10.1对应的libeay32.dll文件,加密是不成功的。 但使用Demo的libeay32.dll进行加解密是正常的。

        2.2 字符编码说明

        原Demo的Delphi版本不确定,至少是D2010以后,版本太多了。

        悲催的是,我只有XE 10.1,下了Demo后进行部分调整。

3. Cryption.dll封装

        3.1 接口概况

        该dll开发工具我使用Delphi XE 10.1 Berlin版本.

        新建一个静态DLL工程,将原Demo的三个单元RSAOpenSSL.pas、libeay32.pas、EncdDecd_suman.pas拷贝到当前rsa目录下. 并加入当前dll工程. 另新建一个uPub.pas公共单元,新建一个uInterface.pas单元。工程目录如下

        

        具体代码在后面,相信当前还在使用Delphi的,应该已能看懂的。

        3.2 uPub.pas单元代码

unit uPub;

interface

uses
  System.SysUtils, System.Classes, qaes, qstring, IdHashMessageDigest, IdHash;

type
  TMD5= class(TIdHashMessageDigest5);

  TAppPara = class
  public
    class function AppPath: string;
    class function AppName: string;
  end;

  TFilePath = class(TAppPara)
  public
    class function IniFile: string;
  end;

//写日志
procedure systemLog(Msg: AnsiString);

implementation

procedure systemLog(Msg: AnsiString);
var
  F: TextFile;
  FileName: string;
  ExeRoad: string;
begin
  try
    ExeRoad := ExtractFilePath(ParamStr(0));
    if ExeRoad[Length(ExeRoad)] = '\' then
      SetLength(ExeRoad, Length(ExeRoad) - 1);
    if not DirectoryExists(ExeRoad + 'log') then
    begin
      CreateDir(ExeRoad + '\log');
    end;
    FileName := ExeRoad + '\log\DLL_Log' + FormatDateTime('YYMMDD', NOW) + '.txt';
    if not FileExists(FileName) then
    begin
      AssignFile(F, FileName);
      ReWrite(F);
    end
    else
      AssignFile(F, FileName);
    Append(F);
    Writeln(F, FormatDateTime('HH:NN:SS.zzz ', Now) + Msg);
    CloseFile(F);
  except
    //可能在事务中调用,避免意外
    Exit;
  end;
end;

{ TAppPara }

class function TAppPara.AppName: string;
begin
  Result := ExtractFileName(ParamStr(0));
end;

class function TAppPara.AppPath: string;
begin
  Result := ExtractFilePath(ParamStr(0));
end;

{ TFilePath }

class function TFilePath.IniFile: string;
begin
  Result := AppPath + 'set.ini';
end;

end.

        3.3 uInterface.pas单元代码

        需要注意,由于D6版本低,此处参数使用PAnsiChar。

unit uInterface;

interface

uses
  Winapi.Windows, System.SysUtils, System.Classes, EncdDecd, Qjson,
  RSAOpenSSL;

var
  FRSAOpenSSL : TRSAOpenSSL;

//----------------------------------测试部分------------------------------------
//>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

//测试
function dll_test: Byte; stdcall;

function dll_chinese_test(sIn: AnsiString; var sOut: PAnsiChar): Byt
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值