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
(SQL Server) Streaming EncryptionEncrypt and decrypt using a stream.
-- Important: See this note about string length limitations for strings returned by sp_OAMethod calls. -- CREATE PROCEDURE ChilkatSample AS BEGIN DECLARE @hr int DECLARE @iTmp0 int -- Important: Do not use nvarchar(max). See the warning about using nvarchar(max). DECLARE @sTmp0 nvarchar(4000) -- This example assumes the Chilkat API to have been previously unlocked. -- See Global Unlock Sample for sample code. DECLARE @crypt int -- Use "Chilkat_9_5_0.Crypt2" for versions of Chilkat < 10.0.0 EXEC @hr = sp_OACreate 'Chilkat.Crypt2', @crypt OUT IF @hr <> 0 BEGIN PRINT 'Failed to create ActiveX component' RETURN END -- Setup encryption using the chacha20 algorithm... EXEC sp_OASetProperty @crypt, 'CryptAlgorithm', 'chacha20' EXEC sp_OASetProperty @crypt, 'KeyLength', 256 EXEC sp_OASetProperty @crypt, 'EncodingMode', 'hex' DECLARE @ivHex nvarchar(4000) SELECT @ivHex = '000000000000000000000002' EXEC sp_OAMethod @crypt, 'SetEncodedIV', NULL, @ivHex, 'hex' EXEC sp_OASetProperty @crypt, 'InitialCount', 42 DECLARE @keyHex nvarchar(4000) SELECT @keyHex = '1c9240a5eb55d38af333888604f6b5f0473917c1402b80099dca5cbc207075c0' EXEC sp_OAMethod @crypt, 'SetEncodedKey', NULL, @keyHex, 'hex' DECLARE @plainText nvarchar(4000) SELECT @plainText = 'The quick brown fox jumped over the lazy dog.' + CHAR(13) + CHAR(10) DECLARE @stream int -- Use "Chilkat_9_5_0.Stream" for versions of Chilkat < 10.0.0 EXEC @hr = sp_OACreate 'Chilkat.Stream', @stream OUT -- We'll save the encrypted output in eStrings to demonstrate streaming decryption next. DECLARE @eStrings int -- Use "Chilkat_9_5_0.StringArray" for versions of Chilkat < 10.0.0 EXEC @hr = sp_OACreate 'Chilkat.StringArray', @eStrings OUT -- Start a background task that will encrypt a stream. DECLARE @task int EXEC sp_OAMethod @crypt, 'EncryptStreamAsync', @task OUT, @stream DECLARE @success int EXEC sp_OAMethod @task, 'Run', @success OUT -- Write plainText to the stream, and read chacha20 encrypted text.. DECLARE @cipherText nvarchar(4000) DECLARE @i int SELECT @i = 1 WHILE @i <= 10 BEGIN -- Note: An encryption algorithm's block size will cause buffering, -- and therefore not every loop iteration will produce output. EXEC sp_OAMethod @stream, 'WriteString', @success OUT, @plainText EXEC sp_OAGetProperty @stream, 'DataAvailable', @iTmp0 OUT IF @iTmp0 = 1 BEGIN EXEC sp_OAMethod @stream, 'ReadBytesENC', @cipherText OUT, 'hex' PRINT @cipherText EXEC sp_OAMethod @eStrings, 'Append', @success OUT, @cipherText END SELECT @i = @i + 1 END -- Tell the background task that the stream has ended. EXEC sp_OAMethod @stream, 'WriteClose', @success OUT -- Let's make sure the background task finished. -- It should already be the case that the task is finished. EXEC sp_OAGetProperty @task, 'Finished', @iTmp0 OUT WHILE (@iTmp0 <> 1) BEGIN EXEC sp_OAMethod @task, 'SleepMs', NULL, 20 END -- Get any remaining data available from the stream. EXEC sp_OAGetProperty @stream, 'DataAvailable', @iTmp0 OUT IF @iTmp0 = 1 BEGIN EXEC sp_OAMethod @stream, 'ReadBytesENC', @cipherText OUT, 'hex' PRINT @cipherText EXEC sp_OAMethod @eStrings, 'Append', @success OUT, @cipherText END EXEC sp_OAGetProperty @task, 'TaskSuccess', @iTmp0 OUT IF @iTmp0 <> 1 BEGIN PRINT 'async encryption failed:' EXEC sp_OAGetProperty @task, 'ResultErrorText', @sTmp0 OUT PRINT @sTmp0 SELECT @success = 0 END EXEC @hr = sp_OADestroy @task PRINT '-- encrypt finished --' -- Now decrypt to return the original. -- Reset the stream object so it can be used again. EXEC sp_OAMethod @stream, 'Reset', NULL -- Start a background task that will decrypt a stream. EXEC sp_OAMethod @crypt, 'DecryptStreamAsync', @task OUT, @stream EXEC sp_OAMethod @task, 'Run', @success OUT DECLARE @n int EXEC sp_OAGetProperty @eStrings, 'Count', @n OUT SELECT @i = 0 WHILE @i <= @n - 1 BEGIN EXEC sp_OAMethod @eStrings, 'GetString', @sTmp0 OUT, @i EXEC sp_OAMethod @stream, 'WriteBytesENC', @success OUT, @sTmp0, 'hex' EXEC sp_OAGetProperty @stream, 'DataAvailable', @iTmp0 OUT IF @iTmp0 = 1 BEGIN EXEC sp_OAMethod @stream, 'ReadString', @plainText OUT PRINT @plainText END SELECT @i = @i + 1 END -- Tell the background task that the stream has ended. EXEC sp_OAMethod @stream, 'WriteClose', @success OUT -- Let's make sure the background task finished. -- It should already be the case that the task is finished. EXEC sp_OAGetProperty @task, 'Finished', @iTmp0 OUT WHILE (@iTmp0 <> 1) BEGIN EXEC sp_OAMethod @task, 'SleepMs', NULL, 20 END -- Get any remaining data available from the stream. EXEC sp_OAGetProperty @stream, 'DataAvailable', @iTmp0 OUT IF @iTmp0 = 1 BEGIN EXEC sp_OAMethod @stream, 'ReadString', @plainText OUT PRINT @plainText END EXEC sp_OAGetProperty @task, 'TaskSuccess', @iTmp0 OUT IF @iTmp0 <> 1 BEGIN PRINT 'async decryption failed:' EXEC sp_OAGetProperty @task, 'ResultErrorText', @sTmp0 OUT PRINT @sTmp0 SELECT @success = 0 END EXEC @hr = sp_OADestroy @task PRINT '-- decrypt finished --' EXEC @hr = sp_OADestroy @crypt EXEC @hr = sp_OADestroy @stream EXEC @hr = sp_OADestroy @eStrings END GO |
© 2000-2024 Chilkat Software, Inc. All Rights Reserved.