Delphi XE RSA Demo


var
  vSignSrc, vPrivateKey: string;
begin
  vSignSrc:= 'data=<xml><treatment_id>88888</treatment_id><merchant_no>109900040300</merchant_no>'+
    '<sub_merchant></sub_merchant><username>张华</username><order_no>12345678901</order_no>'+
    '<paytype>2</paytype><trade_type>2</trade_type><total_amt>0.01</total_amt>'+
    '<spbill_create_ip>127.0.0.1</spbill_create_ip><paytimeout>6</paytimeout>'+
    '<order_subject></order_subject><order_detail>缴费</order_detail>'+
    '<auth_code>填入微信二维码上的一串号码(paytype=2刷卡付(B扫C)需要填写本参数)</auth_code>'+
    '<remark></remark></xml>&developerId=76555&funcId=P7001';


  vPrivateKey:= Memo2.Lines.Text;
  vPrivateKey:= vPrivateKey
    .Replace('-----BEGIN RSA PRIVATE KEY-----','',[rfReplaceAll])
    .Replace('-----END RSA PRIVATE KEY-----','',[rfReplaceAll])
    .Replace(#13#10,'',[rfReplaceAll])
    .Replace(' ','',[rfReplaceAll]);
  with TStringBuilder.Create do
  try
    Append('-----BEGIN RSA PRIVATE KEY-----');
    AppendLine;
    while not vPrivateKey.IsEmpty do
    begin
      Append(vPrivateKey.Substring(0,64));
      AppendLine;
      vPrivateKey:= vPrivateKey.Substring(64);
    end;
    Append('-----END RSA PRIVATE KEY-----');
    vPrivateKey:= ToString;
  finally
    Free;
  end;
  Memo3.Text:= TOpenSSLCipher.Sha1WithRSASign(vSignSrc, TEncoding.UTF8, vPrivateKey)
    .Replace('+','%2B',[rfReplaceAll])
    .Replace('=','%3D',[rfReplaceAll])
    .Replace(#13#10,'',[rfReplaceAll]);
end;

 

 

unit OpenSSL.Cipher;

interface
uses
  SysUtils,
  Classes,
  Windows,
  NetEncoding,
  IdGlobal,
  libeay32
  {IdSSLOpenSSLHeaders};

type
  TOpenSSLCipher = class
  private
    class procedure LoadLib();
  protected
    class function RSASign(APEVP_MD: PEVP_MD; const AContent: string; ACotentEncoding: TEncoding; ARSA: PRSA): string; overload;
    class function RSASign(APEVP_MD: PEVP_MD; const AContent: string; ACotentEncoding: TEncoding; const APrivateKey: string): string;overload;
    class function GetPrivateRSAKey(APBIO: PBIO): PRSA;
  public
    class function Sha1WithRSASign(const AContent: string; ACotentEncoding: TEncoding; const APrivateKey: string): string;
  end;

implementation

class procedure TOpenSSLCipher.LoadLib;
begin
  if not Load() then
    raise Exception.Create('加载ssl库时出错,请检查ssl库文件是否存在或正确!');
end;

class function TOpenSSLCipher.GetPrivateRSAKey(APBIO: PBIO): PRSA;
begin
  Result := PEM_read_bio_RSAPrivateKey(APBIO, nil, nil, nil);
  if Result = nil then
    raise Exception.Create('生成RSA密钥对象失败');
end;

class function TOpenSSLCipher.RSASign(APEVP_MD: PEVP_MD; const AContent: string; ACotentEncoding: TEncoding; ARSA: PRSA): string;
var
  vCtx: EVP_MD_CTX;
  vStringStream: TStringStream;
  vMemoStream: TMemoryStream;
  vHashedDataLen, vSignedDataLen: cardinal;
  vHashedData, vSignedData: array [0 .. 10240] of byte;
begin
  if ARSA = nil then
    raise Exception.Create('RSA签名前出错:RSA密钥为空');

  if ACotentEncoding = nil then
    ACotentEncoding := TEncoding.UTF8;

  vStringStream := TStringStream.Create(AContent, ACotentEncoding);
  vMemoStream := TMemoryStream.Create;
  try
    EVP_MD_CTX_init(@vCtx);
    EVP_SignInit(@vCtx, APEVP_MD);
    EVP_SignUpdate(@vCtx, @vStringStream.Bytes[0], vStringStream.Size);
    EVP_DigestFinal_ex(@vCtx, PIdAnsiChar(@vHashedData[0]), vHashedDataLen);
    RSA_sign(APEVP_MD._type, PIdAnsiChar(@vHashedData[0]), vHashedDataLen, PIdAnsiChar(@vSignedData[0]), @vSignedDataLen, ARSA); // 64为SHA1的NID
    EVP_MD_CTX_cleanup(@vCtx);
    Result := TNetEncoding.Base64.EncodeBytesToString(@vSignedData[0], vSignedDataLen);
  finally
    vStringStream.Free;
    vMemoStream.Free;
  end;
end;

class function TOpenSSLCipher.RSASign(APEVP_MD: PEVP_MD; const AContent: string; ACotentEncoding: TEncoding; const APrivateKey: string): string;
var
  vP_BioKey: PBIO;
  vP_Rsa: PRSA;
  vPrivateKeyStream: TStringStream;
begin
  LoadLib();
  vPrivateKeyStream := TStringStream.Create(APrivateKey, TEncoding.ASCII);
  try
    vP_BioKey := BIO_new_mem_buf(vPrivateKeyStream.Memory, vPrivateKeyStream.Size);
    vP_Rsa := GetPrivateRSAKey(vP_BioKey);
    Result := RSASign(APEVP_MD, AContent, ACotentEncoding, vP_Rsa);
    BIO_free(vP_BioKey);
  finally
    vPrivateKeyStream.Free;
  end;
end;

class function TOpenSSLCipher.Sha1WithRSASign(const AContent: string; ACotentEncoding: TEncoding; const APrivateKey: string): string;
begin
  LoadLib();
  Result := RSASign(EVP_sha1(), AContent, ACotentEncoding, APrivateKey);
end;


end.

 

 

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: Delphi XE7是一种流行的软件开发工具,可以方便地实现AES加密和RSA加密。 AES是一种高级加密标准,使用对称密钥,可以对数据进行加密和解密。Delphi XE7提供了一个AES加密单元,可以方便地进行加密和解密操作。该单元包括了各种加密算法,可以选择不同的密钥和初始向量长度。 RSA是一种非对称加密算法,可以使用公钥对数据进行加密,然后使用私钥对其进行解密。Delphi XE7也提供了一个RSA加密单元,可以方便地实现加密和解密操作。该单元支持各种密钥长度,可以使用公钥和私钥进行加密和解密操作。 Delphi XE7还支持其他加密算法,比如DES和Triple DES等。使用这些算法可以保证数据的安全性,防止数据泄露和恶意攻击。在实际应用中,我们可以根据需求选择不同的加密算法和密钥长度。 ### 回答2: Delphi XE7是一种编程语言和集成开发环境,具有强大的加密和解密功能。AES加密和RSA加密是其中非常重要的加密算法。 AES(高级加密标准)是一种对称加密算法,可以用于保护数据的机密性。它使用相同的密钥来加密和解密数据,是目前广泛使用的加密算法之一。在Delphi XE7中,可以使用TDCP_cipher组件来实现AES加密。 RSA是一种非对称加密算法,可以用于保护数据的机密性和完整性。它使用公钥和私钥来加密和解密数据,是用于数字签名和数字证书的主要加密技术。在Delphi XE7中,可以使用DSI WinCrypt组件来实现RSA加密。 通过Delphi XE7的AES和RSA加密功能,可以在编程中实现更安全的数据传输和存储。它可以保护敏感数据不被未经授权的人员访问和窃取,提高了数据安全性,为用户和企业带来更加可靠的数据保护。 ### 回答3: Delphi XE7是一种流行的编程语言和集成开发环境,它支持对数据进行加密和解密的功能,包括AES加密和RSA加密。 AES加密是一种对称加密算法,它使用相同的密钥加密和解密数据。它可以通过不同的密钥长度来提供不同的安全水平。在Delphi XE7中,AES加密算法已经被集成到了TJclIntX类中,使程序员可以通过调用TJclIntX类中的加密和解密方法来保护他们的数据。 RSA加密是一种非对称加密算法,它使用公钥加密数据,私钥解密数据。在Delphi XE7中,RSA加密算法可以使用第三方组件来实现,比如通过使用Indy的TIdSSLIOHandlerSocketOpenSSL组件来进行加密和解密操作。 总的来说,Delphi XE7提供了AES和RSA加密算法的支持,程序员可以根据自己的需求选择不同的加密算法来保护他们的数据安全。同时,程序员也可以通过使用第三方组件来增强Delphi XE7的加密能力。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值