Delphi处理RSA加解密简单分享

  久已不在工作中用Delphi了。

  这几天帮朋友调试小问题时,需在Delphi中处理RSA加解密相关。我本想偷懒找个现成的可直接无脑使用的库(C++、C#、Go等都是资料代码一堆),但似乎可用或有用的资料信息太少,于是我打算以其它语言编译成DLL丢给Delphi使用,但想想还是心有不甘,刚好看到了CnPack出品的CnCrypto,于是花几个小时尝试研究了下。CnCrypto的实现很赞,纯Pascal编写,应是可直接跨平台使用,不过美中不足的是它没有提供可直接调用的RSA加解密接口。

  所以我觉得,或许可以把自己对CnCrypto的简单封装分享出来,以供需要的朋友参考、改进。
  代码如下。

unit CnRSAUtils;

{$DEFINE RSADECRYPT}

interface

uses
  System.SysUtils;

function RSAEncrypt(const Buf: TBytes): TBytes; overload;
function RSAEncrypt(const S: string): string; overload;

{$IFDEF RSADECRYPT}
function RSADecrypt(const Buf: TBytes): TBytes; overload;
function RSADecrypt(const S: string): string; overload;
{$ENDIF}

implementation

uses
  System.Classes, System.NetEncoding, CnRSA;

const
  cPubKeyStr = '-----BEGIN PUBLIC KEY-----'#13#10 +    
    'XXXXX'#13#10 +
    '-----END PUBLIC KEY-----';
{$IFDEF RSADECRYPT}
  cPriKeyStr = '-----BEGIN PRIVATE KEY-----'#13#10 +
    'XXXXX'#13#10 +
    '-----END PRIVATE KEY-----';
{$ENDIF}

var
  PublicKey : TCnRSAPublicKey;
{$IFDEF RSADECRYPT}
  PrivateKey: TCnRSAPrivateKey;
{$ENDIF}

function RSAEncrypt(const Buf: TBytes): TBytes;
begin
  if Length(Buf) = 0 then
    Exit(nil);

  Result := CnRSAEncryptBytes(Buf, PublicKey);
end;

function RSAEncrypt(const S: string): string;
var
  Src: TBytes;
  Dst: TBytes;
begin
  if S = '' then
    Exit('');

  Src := TEncoding.UTF8.GetBytes(S);
  Dst := CnRSAEncryptBytes(Src, PublicKey);
  Result := TNetEncoding.Base64.EncodeBytesToString(Dst).Replace(#$D#$A, '');
end;

{$IFDEF RSADECRYPT}
function RSADecrypt(const Buf: TBytes): TBytes;
begin
  if Length(Buf) = 0 then
    Exit(nil);

  Result := CnRSADecryptBytes(Buf, PrivateKey);
end;
{$ENDIF}

{$IFDEF RSADECRYPT}
function RSADecrypt(const S: string): string;
var
  Src: TBytes;
  Dst: TBytes;
begin
  if S = '' then
    Exit('');

  Src := TNetEncoding.Base64.DecodeStringToBytes(S);
  Dst := CnRSADecryptBytes(Src, PrivateKey);
  Result := TEncoding.UTF8.GetString(Dst);
end;
{$ENDIF}

procedure InitRSA;
var
  Strm: TMemoryStream;
  Src : TBytes;
begin
  Strm := TMemoryStream.Create;
  try
    Src := TEncoding.UTF8.GetBytes(cPubKeyStr);
    Strm.Write(Src, Length(Src));
    Strm.Position := 0;
    if not CnRSALoadPublicKeyFromPem(Strm, PublicKey) then
      raise Exception.Create('Invalid RSA public key!');

  {$IFDEF RSADECRYPT}
    Strm.Clear;
    Src := TEncoding.UTF8.GetBytes(cPriKeyStr);
    Strm.Write(Src, Length(Src));
    Strm.Position := 0;
    if not CnRSALoadKeysFromPem(Strm, PrivateKey, nil) then
      raise Exception.Create('Invalid RSA private key!');
  {$ENDIF}
  finally
    Strm.Free;
  end;
end;

initialization
  begin
    PublicKey := TCnRSAPublicKey.Create;
  {$IFDEF RSADECRYPT}
    PrivateKey := TCnRSAPrivateKey.Create(True);
  {$ENDIF}
    InitRSA;
  end;

finalization
  begin
    PublicKey.Free;
  {$IFDEF RSADECRYPT}
    PrivateKey.Free;
  {$ENDIF}
  end;

end.

 

posted @ 2025-04-05 21:55  ecofast  阅读(170)  评论(0)    收藏  举报