Class AesCipher
Implements a convienent wrapper over AesManaged that handles the encryption and decryption of data using the AES algorthim using many security best practices.
Namespace: Neon.Cryptography
Assembly: Neon.Cryptography.dll
Syntax
public sealed class AesCipher
Remarks
This class uses the BinaryWriter to generate the encrypted output and BinaryReader to read it.
The data is formatted with an unencrypted header that specifies the initialization vector (IV), as well as the HMAC512 that will be used to validate the encrypted data. The encrypted data includes variable length psuedo random padding followed by the encrypted user data.
Header (plaintext)
+------------------+
| 0x3BBAA035 | 32-bit magic number (for verification)
+------------------+
| IV Size | 16-bits
+------------------+
| |
| IV Bytes | IV Size bytes
| |
+------------------+
| HMAC Size | 16-bits
+------------------+
| |
| HMAC Bytes | HMAC Size bytes
| |
+-------------------
AES256 Encrypted:
+------------------+
| Padding Size | 16-bits
+------------------+
| |
| Padding Bytes | Padding Size bytes
| |
+------------------+
| |
| |
| |
| User Data |
| |
| |
| |
+------------------+
note
Note that this encodes multi-byte integers using little endian byte ordering via BinaryWriter and BinaryReader.
This class automatically generates a new initialization vector for every encyption operation. This ensures that every encryption operation will generate different ciphertext even when the key and data haven't changed to enhance security.
The class is designed to be easier to use than the .NET Core AesManaged base implementation.
To encrypt data:
- Generate an encryption key via GenerateKey(int) and create an instance via AesCipher(string, int) passing the key, or just call AesCipher(int, int) to create with a generated key of the specified size.
- You can always obtain the key via the Key property.
- Call one of EncryptToBase64(byte[]), EncryptToBase64(byte[]), EncryptToBytes(string), or EncryptToBytes(byte[]) to perform the encryption with varying input and output formats.
To decrypt data:
- Use AesCipher(string, int) to construct and instance using the key originally used to encrypt the data.
- Call one of DecryptBytesFrom(byte[]), DecryptBytesFrom(string), DecryptStringFrom(byte[]), or DecryptStringFrom(byte[]). to decrypt data.
Constructors
AesCipher(int, int)
Constructs an AES cypher using a randomly generated encyption key.
Declaration
public AesCipher(int keySize = 256, int maxPaddingBytes = 64)
Parameters
| Type | Name | Description |
|---|---|---|
| int | keySize | Optionally specifies the key size (defaults to 256 bits). |
| int | maxPaddingBytes | The maximum number of padding bytes. This must be less than or equal to 32767. This defaults to 64. |
Remarks
Note that only these key sizes are currently supported: 128, 192, and 256 bits. Only 256 bits is currently considered to be secure.
AesCipher(string, int)
Constructs an AES cypher using a specific encryption key.
Declaration
public AesCipher(string key, int maxPaddingBytes = 64)
Parameters
| Type | Name | Description |
|---|---|---|
| string | key | The base-64 encoded key. |
| int | maxPaddingBytes | The maximum number of padding bytes. This must be less than or equal to 32767. This defaults to 64. |
Fields
Magic
The 32-bit magic number that will be written in plaintext to the beginning of the encrypted output to be used to verify that encrypted buffers will generated by this class.
Declaration
public const int Magic = 1002086453
Field Value
| Type | Description |
|---|---|
| int |
Properties
IV
Returns the encyption initialization vector encoded as base-64.
Declaration
public string IV { get; }
Property Value
| Type | Description |
|---|---|
| string |
Key
Returns the encyption key encoded as base-64.
Declaration
public string Key { get; }
Property Value
| Type | Description |
|---|---|
| string |
Methods
DecryptBytesFrom(byte[])
Decrypts the encrypted base-64 text passed returning the result as a byte array.
Declaration
public byte[] DecryptBytesFrom(byte[] encryptedBytes)
Parameters
| Type | Name | Description |
|---|---|---|
| byte[] | encryptedBytes | The encrypted bytes. |
Returns
| Type | Description |
|---|---|
| byte[] | The encrypted result as a string. |
DecryptBytesFrom(string)
Decrypts the encrypted base-64 text passed returning the result as a byte array.
Declaration
public byte[] DecryptBytesFrom(string encryptedBase64)
Parameters
| Type | Name | Description |
|---|---|---|
| string | encryptedBase64 | The encrypted base-64 text. |
Returns
| Type | Description |
|---|---|
| byte[] | The encrypted result as a string. |
DecryptStream(Stream, Stream)
Decrypts one stream to another.
Declaration
public void DecryptStream(Stream encrypted, Stream decrypted)
Parameters
| Type | Name | Description |
|---|---|---|
| Stream | encrypted | The encrypted input stream. |
| Stream | decrypted | The decrypted output stream. |
DecryptStringFrom(byte[])
Decrypts the encrypted bytes passed returning the result as a string.
Declaration
public string DecryptStringFrom(byte[] encryptedBytes)
Parameters
| Type | Name | Description |
|---|---|---|
| byte[] | encryptedBytes | The encrypted base-64 text. |
Returns
| Type | Description |
|---|---|
| string | The encrypted result as a base-64 string. |
DecryptStringFrom(string)
Decrypts the encrypted base-64 text passed returning the result as a string.
Declaration
public string DecryptStringFrom(string encryptedBase64)
Parameters
| Type | Name | Description |
|---|---|---|
| string | encryptedBase64 | The encrypted base-64 text. |
Returns
| Type | Description |
|---|---|
| string | The encrypted result as a base-64 string. |
Dispose()
Performs application-defined tasks associated with freeing, releasing, or resetting unmanaged resources.
Declaration
public void Dispose()
EncryptStream(Stream, Stream)
Encrypts one stream to another.
Declaration
public void EncryptStream(Stream decrypted, Stream encrypted)
Parameters
| Type | Name | Description |
|---|---|---|
| Stream | decrypted | The decrypted input stream. |
| Stream | encrypted | The encrypted output stream. |
EncryptToBase64(byte[])
Encrypts the bytes passed returning the result encoded as base-64.
Declaration
public string EncryptToBase64(byte[] decryptedBytes)
Parameters
| Type | Name | Description |
|---|---|---|
| byte[] | decryptedBytes | The unencrypted text. |
Returns
| Type | Description |
|---|---|
| string | The encrypted result as base-64. |
EncryptToBase64(string)
Encrypts the text passed returning the result encoded as base-64.
Declaration
public string EncryptToBase64(string decryptedText)
Parameters
| Type | Name | Description |
|---|---|---|
| string | decryptedText | The unencrypted text. |
Returns
| Type | Description |
|---|---|
| string | The encrypted result as base-64. |
EncryptToBytes(byte[])
Encrypts the text passed returning the result encoded as a byte array.
Declaration
public byte[] EncryptToBytes(byte[] decryptedBytes)
Parameters
| Type | Name | Description |
|---|---|---|
| byte[] | decryptedBytes | The unencrypted bytes. |
Returns
| Type | Description |
|---|---|
| byte[] | The encrypted result as bytes. |
EncryptToBytes(string)
Encrypts the text passed returning the result encoded as a byte array.
Declaration
public byte[] EncryptToBytes(string decryptedText)
Parameters
| Type | Name | Description |
|---|---|---|
| string | decryptedText | The unencrypted text. |
Returns
| Type | Description |
|---|---|
| byte[] | The encrypted result as bytes. |
GenerateKey(int)
Generates a random encryption key with the specified size in bits.
Declaration
public static string GenerateKey(int keySize = 256)
Parameters
| Type | Name | Description |
|---|---|---|
| int | keySize | The key size in bits (default 256). |
Returns
| Type | Description |
|---|---|
| string | The key encoded as base-64. |
Remarks
Note that only these key sizes are currently supported: 128, 192, and 256 bits. Only 256 bits is currently considered to be secure.