IPWorks Encrypt 2020 Python Edition

Questions / Feedback?

Salsa20 Class

Properties   Methods   Events   Configuration Settings   Errors  

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

Syntax

class ipworksencrypt.Salsa20

Remarks

The class 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 encrypt_block and decrypt_block.

In all operations a key and iv must be used. If iv is not set one is automatically generated. key_password may be set in order to automatically generate both a key and iv when a method is called. The same key_password, 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 class 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:

Additional Notes

The key property must be set to a 256 bit (32 byte) value. This is the only allowed value for ChaCha20. If key_password 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 class when encrypt is called.

During encryption the on_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

encrypt_block 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 class 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:

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, key_password must be set to the same key_password used when encrypting the data. This will automatically generate both key and iv when decrypt is called.

During decryption the on_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

decrypt_block 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 class with short descriptions. Click on the links for further details.

algorithmThe Salsa20 algorithm.
input_fileThe file to process.
input_messageThe message to process.
ivThe initialization vector (IV).
keyThe secret key for the symmetric algorithm.
key_passwordA password to generate the Key and IV .
output_fileThe output file when encrypting or decrypting.
output_messageThe output message after processing.
overwriteIndicates whether or not the class should overwrite files.
use_hexWhether input or output is hex encoded.

Method List


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

configSets or retrieves a configuration setting.
decryptDecrypts the data.
decrypt_blockDecrypts a block and returns the decrypted data.
encryptEncrypts the data.
encrypt_blockEncrypts data and returns the encrypted block.
resetResets the class.

Event List


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

on_errorInformation about errors during data delivery.
on_progressFired as progress is made.

Configuration Settings


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

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.
ProcessIdleEventsWhether the class uses its internal event loop to process events when the main thread is idle.
SelectWaitMillisThe length of time in milliseconds the class will wait when DoEvents is called if there are no events to process.
UseInternalSecurityAPITells the class 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 Python Edition - Version 20.0 [Build 8155]