Chilkat HOME .NET Core C# Android™ AutoIt C C# C++ Chilkat2-Python CkPython Classic ASP DataFlex Delphi ActiveX Delphi DLL Go Java Lianja Mono C# Node.js Objective-C PHP ActiveX PHP Extension Perl PowerBuilder PowerShell PureBasic Ruby SQL Server Swift 2 Swift 3,4,5... Tcl Unicode C Unicode C++ VB.NET VBScript Visual Basic 6.0 Visual FoxPro Xojo Plugin
(Delphi DLL) Streaming EncryptionEncrypt and decrypt using a stream.
uses Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics, Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, StringArray, Task, Stream, Crypt2; ... procedure TForm1.Button1Click(Sender: TObject); var crypt: HCkCrypt2; ivHex: PWideChar; keyHex: PWideChar; plainText: PWideChar; stream: HCkStream; eStrings: HCkStringArray; task: HCkTask; success: Boolean; cipherText: PWideChar; i: Integer; n: Integer; begin // This example assumes the Chilkat API to have been previously unlocked. // See Global Unlock Sample for sample code. crypt := CkCrypt2_Create(); // Setup encryption using the chacha20 algorithm... CkCrypt2_putCryptAlgorithm(crypt,'chacha20'); CkCrypt2_putKeyLength(crypt,256); CkCrypt2_putEncodingMode(crypt,'hex'); ivHex := '000000000000000000000002'; CkCrypt2_SetEncodedIV(crypt,ivHex,'hex'); CkCrypt2_putInitialCount(crypt,42); keyHex := '1c9240a5eb55d38af333888604f6b5f0473917c1402b80099dca5cbc207075c0'; CkCrypt2_SetEncodedKey(crypt,keyHex,'hex'); plainText := 'The quick brown fox jumped over the lazy dog.' + #13#10; stream := CkStream_Create(); // We'll save the encrypted output in eStrings to demonstrate streaming decryption next. eStrings := CkStringArray_Create(); // Start a background task that will encrypt a stream. task := CkCrypt2_EncryptStreamAsync(crypt,stream); success := CkTask_Run(task); // Write plainText to the stream, and read chacha20 encrypted text.. for i := 1 to 10 do begin // Note: An encryption algorithm's block size will cause buffering, // and therefore not every loop iteration will produce output. success := CkStream_WriteString(stream,plainText); if (CkStream_getDataAvailable(stream) = True) then begin cipherText := CkStream__readBytesENC(stream,'hex'); Memo1.Lines.Add(cipherText); success := CkStringArray_Append(eStrings,cipherText); end; end; // Tell the background task that the stream has ended. success := CkStream_WriteClose(stream); // Let's make sure the background task finished. // It should already be the case that the task is finished. while (CkTask_getFinished(task) <> True) do begin CkTask_SleepMs(task,20); end; // Get any remaining data available from the stream. if (CkStream_getDataAvailable(stream) = True) then begin cipherText := CkStream__readBytesENC(stream,'hex'); Memo1.Lines.Add(cipherText); success := CkStringArray_Append(eStrings,cipherText); end; if (CkTask_getTaskSuccess(task) <> True) then begin Memo1.Lines.Add('async encryption failed:'); Memo1.Lines.Add(CkTask__resultErrorText(task)); success := False; end; CkTask_Dispose(task); Memo1.Lines.Add('-- encrypt finished --'); // Now decrypt to return the original. // Reset the stream object so it can be used again. CkStream_Reset(stream); // Start a background task that will decrypt a stream. task := CkCrypt2_DecryptStreamAsync(crypt,stream); success := CkTask_Run(task); n := CkStringArray_getCount(eStrings); for i := 0 to n - 1 do begin success := CkStream_WriteBytesENC(stream,CkStringArray__getString(eStrings,i),'hex'); if (CkStream_getDataAvailable(stream) = True) then begin plainText := CkStream__readString(stream); Memo1.Lines.Add(plainText); end; end; // Tell the background task that the stream has ended. success := CkStream_WriteClose(stream); // Let's make sure the background task finished. // It should already be the case that the task is finished. while (CkTask_getFinished(task) <> True) do begin CkTask_SleepMs(task,20); end; // Get any remaining data available from the stream. if (CkStream_getDataAvailable(stream) = True) then begin plainText := CkStream__readString(stream); Memo1.Lines.Add(plainText); end; if (CkTask_getTaskSuccess(task) <> True) then begin Memo1.Lines.Add('async decryption failed:'); Memo1.Lines.Add(CkTask__resultErrorText(task)); success := False; end; CkTask_Dispose(task); Memo1.Lines.Add('-- decrypt finished --'); CkCrypt2_Dispose(crypt); CkStream_Dispose(stream); CkStringArray_Dispose(eStrings); end; |
© 2000-2024 Chilkat Software, Inc. All Rights Reserved.