Enigma.Cryptography 3.2.0

There is a newer version of this package available.
See the version list below for details.
dotnet add package Enigma.Cryptography --version 3.2.0
                    
NuGet\Install-Package Enigma.Cryptography -Version 3.2.0
                    
This command is intended to be used within the Package Manager Console in Visual Studio, as it uses the NuGet module's version of Install-Package.
<PackageReference Include="Enigma.Cryptography" Version="3.2.0" />
                    
For projects that support PackageReference, copy this XML node into the project file to reference the package.
<PackageVersion Include="Enigma.Cryptography" Version="3.2.0" />
                    
Directory.Packages.props
<PackageReference Include="Enigma.Cryptography" />
                    
Project file
For projects that support Central Package Management (CPM), copy this XML node into the solution Directory.Packages.props file to version the package.
paket add Enigma.Cryptography --version 3.2.0
                    
#r "nuget: Enigma.Cryptography, 3.2.0"
                    
#r directive can be used in F# Interactive and Polyglot Notebooks. Copy this into the interactive tool or source code of the script to reference the package.
#addin nuget:?package=Enigma.Cryptography&version=3.2.0
                    
Install Enigma.Cryptography as a Cake Addin
#tool nuget:?package=Enigma.Cryptography&version=3.2.0
                    
Install Enigma.Cryptography as a Cake Tool

Enigma

Enigma is a .NET cryptography library based on BouncyCastle.Cryptography.

Acknowledgements

Thanks to the Bouncy Castle team for their outstanding work on BouncyCastle.Cryptography, which made this project possible.

Bouncy Castle GitHub repository

Bouncy Castle Official website


Block ciphers

Classes :

  • BlockCipherService: Service for encryption/decryption with block ciphers
  • BlockCipherServiceFactory: IBlockCipherService factory
  • BlockCipherEngineFactory: IBlockCipher factory
  • BlockCipherPaddingFactory: IBlockCipherPadding factory

Create block cipher service with algorithm name :

// AES-CBC without padding
var service = new BlockCipherService("AES/CBC/NoPadding");

// AES-CBC with PKCS7 padding
var service = new BlockCipherService("AES/CBC/PKCS7Padding");

Create block cipher service with factories :

// AES-CBC without padding
var engineFactory = new BlockCipherEngineFactory();
var service = new BlockCipherServiceFactory().CreateCbcService(engineFactory.CreateAesEngine);

// AES-CBC with PKCS7 padding
var engineFactory = new BlockCipherEngineFactory();
var paddingFactory = new BlockCipherPaddingFactory();
var service = new BlockCipherServiceFactory().CreateCbcService(engineFactory.CreateAesEngine, paddingFactory.CreatePkcs7Padding);

Full example :

// Create a block cipher service for AES/CBC/PKCS7Padding
var service = new BlockCipherService("AES/CBC/PKCS7Padding");

// Get the key and IV sizes
var (keySizeInBytes, ivSizeInBytes) = service.GetKeyIvSize();

// Generate random key and iv
var key = RandomUtils.GenerateRandomBytes(keySizeInBytes);
var iv = RandomUtils.GenerateRandomBytes(ivSizeInBytes);
var parameters = new ParametersWithIV(new KeyParameter(key), iv);

var data = "This is a secret message !".GetUtf8Bytes();

// Encrypt
using var inputEnc = new MemoryStream(data);
using var outputEnc = new MemoryStream();
await service.EncryptAsync(inputEnc, outputEnc, parameters);

var encrypted = outputEnc.ToArray();

// Decrypt
using var inputDec = new MemoryStream(encrypted);
using var outputDec = new MemoryStream();
await service.DecryptAsync(inputDec, outputDec, parameters);

var decrypted = outputDec.ToArray();

Stream ciphers

Classes :

  • StreamCipherService: Service for encryption/decryption with stream ciphers
  • StreamCipherServiceFactory: IStreamCipherService factory

Full example :

// Create a stream cipher service for ChaCha7539
var service = new StreamCipherServiceFactory().CreateChaCha7539Service();

// Get the key and nonce sizes
var (keySizeInBytes, nonceSizeInBytes) = service.GetKeyNonceSize();

// Generate random key and nonce
var key = RandomUtils.GenerateRandomBytes(keySizeInBytes);
var nonce = RandomUtils.GenerateRandomBytes(nonceSizeInBytes);

var data = "This is a secret message !".GetUtf8Bytes();

// Encrypt
using var inputEnc = new MemoryStream(data);
using var outputEnc = new MemoryStream();
await service.EncryptAsync(inputEnc, outputEnc, key, nonce);

var encrypted = outputEnc.ToArray();

// Decrypt
using var inputDec = new MemoryStream(encrypted);
using var outputDec = new MemoryStream();
await service.DecryptAsync(inputDec, outputDec, key, nonce);

var decrypted = outputDec.ToArray();

Public-key

Classes :

  • PublicKeyService: Service for public-key encryption/decryption and signing/verifying
  • PublicKeyServiceFactory: IPublicKeyService factory

Full example :

// Create RSA public-key service
var service = new PublicKeyServiceFactory().CreateRsaService();

// Generate 4096-bits key pair
var keyPair = service.GenerateKeyPair(4096);

var data = "This is a secret message".GetUtf8Bytes();

// Encrypt/decrypt data
var enc = service.Encrypt(data, keyPair.Public);
var dec = service.Decrypt(enc, keyPair.Private);

// Sign/verify data
var signature = service.Sign(data, keyPair.Private);
var verified = service.Verify(data, signature, keyPair.Public);

// Save public key in PEM format
using var publicOutput = new MemoryStream();
PemUtils.SaveKey(keyPair.Public, publicOutput);

// Save and encrypt private key in PEM format
using var privateOutput = new MemoryStream();
PemUtils.SavePrivateKey(keyPair.Private, privateOutput, "yourpassword", algorithm: "AES-256-CBC");

// Load public key from PEM format
using var publicInput = new MemoryStream(publicOutput.ToArray());
var publicKey = PemUtils.LoadKey(publicInput);

// Load and decrypt private key from PEM format
using var privateInput = new MemoryStream(privateOutput.ToArray());
var privateKey = PemUtils.LoadPrivateKey(privateInput, "yourpassword");

Post-Quantum Cryptography (PQC)

Classes :

  • MLDsaService: Service Module-Lattice-Based digital signature algorithm (ML-DSA)
  • MLDsaServiceFactory: IMLDsaService factory
  • MLKemService: Service for Module-Lattice-Based key-encapsulation mechanism (ML-KEM)
  • MLKemServiceFactory: IMLKemService factory

ML-DSA example :

// Create ML-DSA-65 service
var service = new MLDsaServiceFactory().CreateDsa65Service();

// Generate key pair
var keyPair = service.GenerateKeyPair();

var data = "Data to sign".GetUtf8Bytes();

// Sign/verify data
var signature = service.Sign(data, keyPair.Private);
var verified = service.Verify(data, signature, keyPair.Public);

// Save public key in PEM format
using var publicOutput = new MemoryStream();
PemUtils.SaveKey(keyPair.Public, publicOutput);

// Save and encrypt private key in PEM format
using var privateOutput = new MemoryStream();
PemUtils.SavePrivateKey(keyPair.Private, privateOutput, "yourpassword", algorithm: "AES-256-CBC");

// Load public key from PEM format
using var publicInput = new MemoryStream(publicOutput.ToArray());
var publicKey = PemUtils.LoadKey(publicInput);

// Load and decrypt private key from PEM format
using var privateInput = new MemoryStream(privateOutput.ToArray());
var privateKey = PemUtils.LoadPrivateKey(privateInput, "yourpassword");

ML-KEM example :

// Create ML-KEM-1024 service
var service = new MLKemServiceFactory().CreateKem1024();

// Generate key pair
var keyPair = service.GenerateKeyPair();

// Encapsulate secret key
var (encapsulation, secret) = service.Encapsulate(keyPair.Public);

// Decapsulate secret key
var secretDec = service.Decapsulate(encapsulation, keyPair.Private);

// Save public key in PEM format
using var publicOutput = new MemoryStream();
PemUtils.SaveKey(keyPair.Public, publicOutput);

// Save and encrypt private key in PEM format
using var privateOutput = new MemoryStream();
PemUtils.SavePrivateKey(keyPair.Private, privateOutput, "yourpassword", algorithm: "AES-256-CBC");

// Load public key from PEM format
using var publicInput = new MemoryStream(publicOutput.ToArray());
var publicKey = PemUtils.LoadKey(publicInput);

// Load and decrypt private key from PEM format
using var privateInput = new MemoryStream(privateOutput.ToArray());
var privateKey = PemUtils.LoadPrivateKey(privateInput, "yourpassword");

Data encoding

Classes :

  • Base64Service: Service for base64 encoding/decoding
  • HexService: Service for hexadecimal encoding/decoding

Full example :

var data = "This is some data".GetUtf8Bytes();

// Encode/decode with hex
var hex = new HexService();
var hexEncoded = hex.Encode(data);
var hexDecoded = hex.Decode(hexEncoded);

// Encode/decode with base64
var base64 = new Base64Service();
var base64Encoded = base64.Encode(data);
var base64Decoded = base64.Decode(base64Encoded);

With extension methods :

var data = "This is some data".GetUtf8Bytes();

// Encode/decode with hex
var hexEncoded = data.ToHexString();
var hexDecoded = hexEncoded.FromHexString();

// Encode/decode with base64
var base64Encoded = data.ToBase64String();
var base64Decoded = base64Encoded.FromBase64String();

Hash

Classes :

  • HashService: Hash service
  • HashServiceFactory: IHashService factory

Full example :

var data = "Data to hash".GetUtf8Bytes();

// Create SHA3 hash service
var service = new HashServiceFactory().CreateSha3Service();

// Hash data
using var input = new MemoryStream(data);
var hash = await service.HashAsync(input);

KDF

Classes :

  • Pbkdf2Service: PBKDF2 service
  • Argon2Service: Argon2 PBE service

PBKDF2 example :

var service = new Pbkdf2Service();

var salt = "5775ada0513d7d7d7316de8d72d1f4d2".FromHexString();

// Generate a 32 bytes key based on a password and salt
var key = service.GenerateKey(size: 32, password: "yourpassword", salt, iterations: 10_000);

Argon2 example :

var service = new Argon2Service();

var passwordData = "yourpassword".GetUtf8Bytes();
var salt = RandomUtils.GenerateRandomBytes(16);

// Generate a 32 bytes key based on a password and salt
var key = service.GenerateKey(32, passwordData, salt);

Padding

Classes :

  • NoPaddingService: No-padding service
  • PaddingService: Padding service
  • PaddingServiceFactory: IPaddingService factory

Full example :

var data = "Data to pad".GetUtf8Bytes();

// Create a PKCS7 padding service
var service = new PaddingServiceFactory().CreatePkcs7Service();

// Pad/unpad data with a 16 bytes block size
var padded = service.Pad(data, blockSize: 16);
var unpadded = service.Unpad(padded, blockSize: 16);

Copyright (c) 2025 Josué Clément

Product Compatible and additional computed target framework versions.
.NET net5.0 was computed.  net5.0-windows was computed.  net6.0 is compatible.  net6.0-android was computed.  net6.0-ios was computed.  net6.0-maccatalyst was computed.  net6.0-macos was computed.  net6.0-tvos was computed.  net6.0-windows was computed.  net7.0 is compatible.  net7.0-android was computed.  net7.0-ios was computed.  net7.0-maccatalyst was computed.  net7.0-macos was computed.  net7.0-tvos was computed.  net7.0-windows was computed.  net8.0 is compatible.  net8.0-android was computed.  net8.0-browser was computed.  net8.0-ios was computed.  net8.0-maccatalyst was computed.  net8.0-macos was computed.  net8.0-tvos was computed.  net8.0-windows was computed.  net9.0 is compatible.  net9.0-android was computed.  net9.0-browser was computed.  net9.0-ios was computed.  net9.0-maccatalyst was computed.  net9.0-macos was computed.  net9.0-tvos was computed.  net9.0-windows was computed. 
.NET Core netcoreapp2.0 was computed.  netcoreapp2.1 was computed.  netcoreapp2.2 was computed.  netcoreapp3.0 was computed.  netcoreapp3.1 was computed. 
.NET Standard netstandard2.0 is compatible.  netstandard2.1 is compatible. 
.NET Framework net461 was computed.  net462 was computed.  net463 was computed.  net47 was computed.  net471 was computed.  net472 is compatible.  net48 was computed.  net481 was computed. 
MonoAndroid monoandroid was computed. 
MonoMac monomac was computed. 
MonoTouch monotouch was computed. 
Tizen tizen40 was computed.  tizen60 was computed. 
Xamarin.iOS xamarinios was computed. 
Xamarin.Mac xamarinmac was computed. 
Xamarin.TVOS xamarintvos was computed. 
Xamarin.WatchOS xamarinwatchos was computed. 
Compatible target framework(s)
Included target framework(s) (in package)
Learn more about Target Frameworks and .NET Standard.

NuGet packages

This package is not used by any NuGet packages.

GitHub repositories

This package is not used by any popular GitHub repositories.

Version Downloads Last updated
3.3.0 53 4 days ago
3.2.0 141 12 days ago
3.1.1 131 16 days ago
3.1.0 131 17 days ago