IPWorks Encrypt 2020 Delphi Edition

Questions / Feedback?

Salsa20 Component

Properties   Methods   Events   Configuration Settings   Errors  

The Salsa20 component can be used to encrypt and decrypt data with the XSalsa20 and Salsa20 algorithm.

Syntax

TipcSalsa20

Remarks

The component implements XSalsa20 as well as Salsa20. The Algorithm property specifies which algorithm to use when encrypting and decryption. In addition the 12 and 8 round variants of Salsa20 are supported.

Data may be encrypted and decrypted in its entirety by calling Encrypt and Decrypt or chunk by chunk by calling EncryptBlock and DecryptBlock.

In all operations a Key and IV must be used. If IV is not set one is automatically generated. KeyPassword may be set in order to automatically generate both a Key and IV when a method is called. The same KeyPassword, or Key and IV pair are used on both sides of the operation data can be encrypted and decrypted.

Encrypt Notes

Encrypt will encrypt the specified data. The following properties are applicable:

  • IV (required)
  • Key (required)

Input and Output Properties

The component will determine the source and destination of the input and output based on which properties are set.

The order in which the input properties are checked is as follows:

When a valid source is found the search stops. The order in which the output properties are checked is as follows:

When using streams you may need to additionally set CloseInputStreamAfterProcessing or CloseOutputStreamAfterProcessing.

Additional Notes

The Key property must be set to a 256 bit (32 byte) value. This is the only allowed value for ChaCha20. If KeyPassword is set both Key and IV will be automatically generated when Encrypt is called.

The IV must be set to a 192 bit (24 byte) value when Algorithm is set to XSalsa. The IV must be set to a 64 bit (8 byte) value when Algorithm is set to Salsa.

If IV is not set a value will automatically be generated by the component when Encrypt is called.

During encryption the Progress event will fire as data is encrypted.

Encrypt Example


Salsa20 salsa = new Salsa20();

//32 Bytes
salsa.KeyB = new byte[] { 0xBB, 0x76, 0x17, 0xC9, 0x05, 0x73, 0x4A, 0x8D, 0x59, 0x9D, 0x7B, 0x0D, 0x86, 0x2A, 0x03, 0x82, 0x50, 0x6A, 0x70, 0xFB, 0xA8, 0x56, 0x47, 0x1B, 0x1E, 0x68, 0x0B, 0x2B, 0x34, 0x18, 0x0F, 0xE2 };

//24 Bytes
salsa.IVB = new byte[] { 0x0D, 0xE4, 0x43, 0x40, 0x29, 0xAD, 0x70, 0x7D, 0x7B, 0x32, 0xB5, 0xC7, 0x0D, 0xE4, 0x43, 0x40, 0x29, 0xAD, 0x70, 0x7D, 0x7B, 0x32, 0xB5, 0xC7 };

salsa.InputMessage = "hello salsa!";
salsa.Encrypt();

//salsa.OutputMessageB contains the byte[] of the encrypted data. The above code produces the following encrypted bytes.
// { 0x06, 0xF4, 0xD9, 0xB4, 0x67, 0x31, 0x1C, 0x1E, 0x8E, 0xD6, 0xB5, 0x6B }

Encrypt Block Notes

EncryptBlock will encrypt the input data and return the encrypted block. The encrypted block will always be the same length as the decrypted data. The following properties are applicable:

  • IV (required)
  • Key (required)

InputBuffer specifies the input data to encrypt.

EncryptBlock Example


Salsa20 salsa = new Salsa20();

//32 Bytes
salsa.KeyB = new byte[] { 0xBB, 0x76, 0x17, 0xC9, 0x05, 0x73, 0x4A, 0x8D, 0x59, 0x9D, 0x7B, 0x0D, 0x86, 0x2A, 0x03, 0x82, 0x50, 0x6A, 0x70, 0xFB, 0xA8, 0x56, 0x47, 0x1B, 0x1E, 0x68, 0x0B, 0x2B, 0x34, 0x18, 0x0F, 0xE2 };

//24 Bytes
salsa.IVB = new byte[] { 0x0D, 0xE4, 0x43, 0x40, 0x29, 0xAD, 0x70, 0x7D, 0x7B, 0x32, 0xB5, 0xC7, 0x0D, 0xE4, 0x43, 0x40, 0x29, 0xAD, 0x70, 0x7D, 0x7B, 0x32, 0xB5, 0xC7 };

byte[] tempEncryptedBlock;
 
//Encrypt any number of blocks of any size
tempEncryptedBlock = salsa.EncryptBlock(part1);
tempEncryptedBlock = salsa.EncryptBlock(part2);

Decrypt Notes

Decrypt will decrypt the specified data. The following properties are applicable:

  • IV (required)
  • Key (required)

Input and Output Properties

The component will determine the source and destination of the input and output based on which properties are set.

The order in which the input properties are checked is as follows:

When a valid source is found the search stops. The order in which the output properties are checked is as follows:

When using streams you may need to additionally set CloseInputStreamAfterProcessing or CloseOutputStreamAfterProcessing.

Additional Notes

The Key property must be set to the 256 bit (32 byte) value originally used to encrypt the data. IV must be set to the original IV value used to encrypt the data.

If using a password, KeyPassword must be set to the same KeyPassword used when encrypting the data. This will automatically generate both Key and IV when Decrypt is called.

During decryption the Progress event will fire as data is decrypted.

Decrypt Example


Salsa20 salsa = new Salsa20();

//32 Bytes
salsa.KeyB = new byte[] { 0xBB, 0x76, 0x17, 0xC9, 0x05, 0x73, 0x4A, 0x8D, 0x59, 0x9D, 0x7B, 0x0D, 0x86, 0x2A, 0x03, 0x82, 0x50, 0x6A, 0x70, 0xFB, 0xA8, 0x56, 0x47, 0x1B, 0x1E, 0x68, 0x0B, 0x2B, 0x34, 0x18, 0x0F, 0xE2 };

//24 Bytes
salsa.IVB = new byte[] { 0x0D, 0xE4, 0x43, 0x40, 0x29, 0xAD, 0x70, 0x7D, 0x7B, 0x32, 0xB5, 0xC7, 0x0D, 0xE4, 0x43, 0x40, 0x29, 0xAD, 0x70, 0x7D, 0x7B, 0x32, 0xB5, 0xC7 };

salsa.InputMessageB = new byte[] { 0x06, 0xF4, 0xD9, 0xB4, 0x67, 0x31, 0x1C, 0x1E, 0x8E, 0xD6, 0xB5, 0x6B };
salsa.Decrypt();

Console.WriteLine(salsa.OutputMessage); //outputs "hello salsa!"

Decrypt Block Notes

DecryptBlock will decrypt the input data and return the decrypted block. The decrypted block will always be the same length as the encrypted data. The following properties are applicable:

  • IV (required)
  • Key (required)

InputBuffer specifies the input data to decrypt.

DecryptBlock Example


Salsa20 salsa = new Salsa20();

//32 Bytes
salsa.KeyB = new byte[] { 0xBB, 0x76, 0x17, 0xC9, 0x05, 0x73, 0x4A, 0x8D, 0x59, 0x9D, 0x7B, 0x0D, 0x86, 0x2A, 0x03, 0x82, 0x50, 0x6A, 0x70, 0xFB, 0xA8, 0x56, 0x47, 0x1B, 0x1E, 0x68, 0x0B, 0x2B, 0x34, 0x18, 0x0F, 0xE2 };

//24 Bytes
salsa.IVB = new byte[] { 0x0D, 0xE4, 0x43, 0x40, 0x29, 0xAD, 0x70, 0x7D, 0x7B, 0x32, 0xB5, 0xC7, 0x0D, 0xE4, 0x43, 0x40, 0x29, 0xAD, 0x70, 0x7D, 0x7B, 0x32, 0xB5, 0xC7 };

byte[] tempDecryptedBlock;
 
//Decrypt any number of blocks of any size
tempDecryptedBlock = salsa.DecryptBlock(part1);
tempDecryptedBlock = salsa.DecryptBlock(part2);

Property List


The following is the full list of the properties of the component with short descriptions. Click on the links for further details.

AlgorithmThe Salsa20 algorithm.
InputFileThe file to process.
InputMessageThe message to process.
IVThe initialization vector (IV).
KeyThe secret key for the symmetric algorithm.
KeyPasswordA password to generate the Key and IV .
OutputFileThe output file when encrypting or decrypting.
OutputMessageThe output message after processing.
OverwriteIndicates whether or not the component should overwrite files.
UseHexWhether input or output is hex encoded.

Method List


The following is the full list of the methods of the component with short descriptions. Click on the links for further details.

ConfigSets or retrieves a configuration setting.
DecryptDecrypts the data.
DecryptBlockDecrypts a block and returns the decrypted data.
EncryptEncrypts the data.
EncryptBlockEncrypts data and returns the encrypted block.
ResetResets the component.
SetInputStreamSets the stream from which the component will read data to encrypt or decrypt.
SetOutputStreamSets the stream to which the component will write encrypted or decrypted data.

Event List


The following is the full list of the events fired by the component with short descriptions. Click on the links for further details.

ErrorInformation about errors during data delivery.
ProgressFired as progress is made.

Configuration Settings


The following is a list of configuration settings for the component with short descriptions. Click on the links for further details.

CloseInputStreamAfterProcessingDetermines whether or not the input stream is closed after processing.
CloseOutputStreamAfterProcessingDetermines whether or not the output stream is closed after processing.
IncludeIVWhether to prepend the IV to the output data and read the IV from the input data.
KeyPasswordAlgorithmThe hash algorithm used to derive the Key and IV from the KeyPassword property.
KeyPasswordIterationsThe number of iterations performed when using KeyPassword to derive the Key and IV.
KeyPasswordSaltThe salt value used in conjunction with the KeyPassword to derive the Key and IV.
SalsaRoundsThe number of rounds to perform.
BuildInfoInformation about the product's build.
CodePageThe system code page used for Unicode to Multibyte translations.
LicenseInfoInformation about the current license.
UseInternalSecurityAPITells the component whether or not to use the system security libraries or an internal implementation.

Copyright (c) 2022 /n software inc. - All rights reserved.
IPWorks Encrypt 2020 Delphi Edition - Version 20.0 [Build 8155]