Sample code for 30+ languages & platforms
Pascal (Lazarus/Delphi)

Duplicate PHP RSA Encryption

See more RSA Examples

Demonstrates how to duplicate the following PHP function.

Chilkat Pascal (Lazarus/Delphi) Downloads

Pascal (Lazarus/Delphi)
program ChilkatDemo;

// Demonstrates using the Chilkat Pascal wrapper via the C bridge DLL.
// Builds as a console application under Lazarus (FPC) or Delphi.

{$IFDEF FPC}
  {$MODE DELPHI}
{$ENDIF}
{$APPTYPE CONSOLE}

uses
  {$IFDEF UNIX}
  cthreads,
  {$ENDIF}
  SysUtils,
  CkDllLoader,
  Chilkat.BinData,
  Chilkat.Rsa,
  Chilkat.Xml,
  Chilkat.PublicKey;

// ---------------------------------------------------------------------------

procedure RunDemo;
var
  success: Boolean;
  rsaMOD: string;
  rsaEXP: string;
  bdMod: TBinData;
  bdExp: TBinData;
  xml: TXml;
  pubkey: TPublicKey;
  rsa: TRsa;
  plainText: string;
  cipherText: string;

begin
  success := False;

  //  This example requires the Chilkat API to have been previously unlocked.
  //  See Global Unlock Sample for sample code.

  //  Duplicate the following PHP code:
  //  
  //     public function encryptRSA($plainText,$rsaMOD,$pubKEY){
  //          $rsa  = new RSA();
  //          $rsa->setEncryptionMode(RSA::ENCRYPTION_PKCS1);
  //          $publicKey = [
  //              'e' => new BigInteger($pubKEY,16),
  //              'n' => new BigInteger($rsaMOD,16)
  //          ];
  //  		
  //          $rsa->loadKey($publicKey);
  //          $ciphertext = $rsa->encrypt($plainText);
  //          return bin2hex($ciphertext);
  //      }
  //  
  //      $plainText="key=abcdefghijkmnopq&iv=abcdefghijkmnopq&h=12345678&s=12345678"
  //      $rsaMOD="F0946D8F05604809E24B8CFFD30349CEA9E5F4D320BFD9E9AA1B088863F02C43E7997D37A3E27B4F8F359F1744DB6B20A437067C0D325A80660D12FF56A57673"
  //      $pubKEY="010001"

  //  We have the RSA modulus in hex
  rsaMOD := 'F0946D8F05604809E24B8CFFD30349CEA9E5F4D320BFD9E9AA1B088863F02C43E7997D37A3E27B4F8F359F1744DB6B20A437067C0D325A80660D12FF56A57673';

  //  The RSA exponent in hex is "010001", which is 65537 in decimal.  It's typically the exponent that is always used.
  rsaEXP := '010001';

  //  Get the RSA modulus and exponent in base64.
  bdMod := TBinData.Create;
  bdExp := TBinData.Create;
  success := bdMod.AppendEncoded(rsaMOD,'hex');
  success := bdExp.AppendEncoded(rsaEXP,'hex');

  //  Build the XML representation of the RSA public key
  xml := TXml.Create;
  xml.Tag := 'RSAPublicKey';
  xml.UpdateChildContent('Modulus',bdMod.GetEncoded('base64'));
  xml.UpdateChildContent('Exponent',bdExp.GetEncoded('base64'));

  //  Load the RSA public key into a Chilkat public key object.
  pubkey := TPublicKey.Create;
  success := pubkey.LoadFromString(xml.GetXml());

  //  Setup the RSA object for encryption and do it..
  rsa := TRsa.Create;
  rsa.VerboseLogging := True;
  success := rsa.UsePublicKey(pubkey);

  //  Use PKCSv1.5 padding
  rsa.PkcsPadding := True;

  //  Encrypt and return the string as hex.
  rsa.EncodingMode := 'hex';
  plainText := 'key=abcdefghijkmnopq&iv=abcdefghijkmnopq&h=12345678&s=12345678';
  cipherText := rsa.EncryptStringENC(plainText,False);
  if (rsa.LastMethodSuccess = False) then
    begin
      WriteLn(rsa.LastErrorText);
      Exit;
    end;

  //  Note: The PKCSv1_5 padding incorporates random bytes.  Therefore, the RSA encryption will produce different results each time -- all of which are valid 
  //  and decrypt correctly to the same original text.
  WriteLn(cipherText);


  bdMod.Free;
  bdExp.Free;
  xml.Free;
  pubkey.Free;
  rsa.Free;

end;

// ---------------------------------------------------------------------------

begin

  try
    RunDemo;
  except
    on E: Exception do
      WriteLn('Unhandled exception: ', E.ClassName, ': ', E.Message);
  end;

  WriteLn;
  {$IFDEF MSWINDOWS}
  WriteLn('Press Enter to exit...');
  ReadLn;
  {$ENDIF}
end.