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

ClickBank Decrypt Instant Notification

See more ClickBank Examples

Demonstrates how to decrypt a ClickBank instant notification. See Instant Notification Service for more information and alternative code snippets.

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.JsonObject,
  Chilkat.Crypt2;

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

procedure RunDemo;
var
  success: Boolean;
  secretKey: string;
  jsonStr: string;
  json: TJsonObject;
  bdNotif: TBinData;
  bdIv: TBinData;
  crypt: TCrypt2;
  hexSha1: string;
  bdKey: TBinData;

begin
  success := False;

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

  //  secret key from your ClickBank account
  secretKey := 'MY_SECRET_KEY';

  jsonStr := '{"notification":"BASE64_NOTIFICATION","iv":"BASE64_IV"}';

  json := TJsonObject.Create;
  success := json.Load(jsonStr);

  //  Get the encrypted notification (binary) and IV from the JSON.
  bdNotif := TBinData.Create;
  bdIv := TBinData.Create;

  success := bdNotif.AppendEncoded(json.StringOf('notification'),'base64');
  success := bdIv.AppendEncoded(json.StringOf('iv'),'base64');

  //  Get an SHA1 digest (as a hex string) of the secret key.
  //  A SHA1 digest is 20 bytes.  Therefore the hex string is 40 chars.
  //  Treat each us-ascii char as a binary byte of the secret key.
  //  256-bit AES needs a 256-bit key, which is 32-bytes.  Therefore
  //  use the 1st 32 us-ascii chars of the hex SHA1 as the AES secret key.

  crypt := TCrypt2.Create;
  //  Because we're using the hex string as the actual AES key, it matters whether the hex is uppercase or lowercase.
  //  We want lowercase.
  crypt.EncodingMode := 'hex_lower';
  crypt.HashAlgorithm := 'sha1';
  hexSha1 := crypt.HashStringENC(secretKey);
  WriteLn(hexSha1);

  //  Treat the hex string as binary data for the AES key..
  bdKey := TBinData.Create;
  bdKey.AppendString(hexSha1,'us-ascii');
  bdKey.RemoveChunk(32,8);

  crypt.KeyLength := 256;
  crypt.CryptAlgorithm := 'aes';
  crypt.CipherMode := 'cbc';

  //  We can use any encoding because were just getting the binary bytes in an encoding, and then setting from the same encoding.
  //  We'll just use base64..
  crypt.SetEncodedIV(bdIv.GetEncoded('base64'),'base64');
  crypt.SetEncodedKey(bdKey.GetEncoded('base64'),'base64');

  crypt.DecryptBd(bdNotif);
  WriteLn('Decrypted: ' + bdNotif.GetString('utf-8'));


  json.Free;
  bdNotif.Free;
  bdIv.Free;
  crypt.Free;
  bdKey.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.