Skip to content

Instantly share code, notes, and snippets.

@XenocodeRCE
Created March 26, 2023 21:30
Show Gist options
  • Select an option

  • Save XenocodeRCE/3776997f2c64b35d434aa35db69fbc34 to your computer and use it in GitHub Desktop.

Select an option

Save XenocodeRCE/3776997f2c64b35d434aa35db69fbc34 to your computer and use it in GitHub Desktop.
Cipher Block Chaining

This technique divides the data or code into blocks of bits and chains. The encrypted data are blocked together to avoid eavesdroppers from inserting their own blocks of bits among the blocks of encrypted code. A mathematical equation is used for the for the Cipher block changing, and the equation is given as follows:

C1=ek(m1XORIV)
E1
C1=ek(m1XORCi−1)fori>1
E2

The technique involves a specific (N) value passed between the plaintext to ensure that the ciphertext blocks look different. The N value is the second layer of encryption, while the first layer of encryption is done by the secret key. Each generated text is encrypted with the same secret key. If an error occurs in one of the blocks, it will also occur in all other blocks that follow the affected block

using System;
using System.Text;
using System.Linq;
using System.Security.Cryptography;
// Define the neural network

// Example usage
public class Program
{
    public static void Main()
    {
         // Original plaintext to be encrypted
        string originalText = "Hello, World!";

        // Convert the plaintext to a byte array
        byte[] originalBytes = Encoding.UTF8.GetBytes(originalText);

        // Generate a random initialization vector (IV)
        byte[] iv = GenerateIV();

        // Generate a random secret key
        byte[] key = GenerateKey();

        // Encrypt the plaintext using CBC
        byte[] encryptedBytes = Encrypt(originalBytes, key, iv);

        // Print the encrypted bytes
        Console.WriteLine("Encrypted bytes: " + BitConverter.ToString(encryptedBytes).Replace("-", ""));

        // Decrypt the ciphertext using CBC
        byte[] decryptedBytes = Decrypt(encryptedBytes, key, iv);

        // Convert the decrypted bytes back to plaintext and print it
        string decryptedText = Encoding.UTF8.GetString(decryptedBytes);
        Console.WriteLine("Decrypted text: " + decryptedText);
    }
	static byte[] Encrypt(byte[] plaintext, byte[] key, byte[] iv)
    {
        using (Aes aes = Aes.Create())
        {
            aes.Key = key;
            aes.IV = iv;
            aes.Mode = CipherMode.CBC;

            // Create a new encryptor and encrypt the plaintext
            ICryptoTransform encryptor = aes.CreateEncryptor();
            byte[] encrypted = encryptor.TransformFinalBlock(plaintext, 0, plaintext.Length);

            // Prepend the IV to the ciphertext
            byte[] result = new byte[encrypted.Length + iv.Length];
            Array.Copy(iv, 0, result, 0, iv.Length);
            Array.Copy(encrypted, 0, result, iv.Length, encrypted.Length);

            return result;
        }
    }

    static byte[] Decrypt(byte[] ciphertext, byte[] key, byte[] iv)
    {
        using (Aes aes = Aes.Create())
        {
            aes.Key = key;
            aes.IV = iv;
            aes.Mode = CipherMode.CBC;

            // Extract the IV from the ciphertext
            byte[] extractedIV = new byte[iv.Length];
            Array.Copy(ciphertext, 0, extractedIV, 0, iv.Length);

            // Extract the encrypted data from the ciphertext
            byte[] extractedData = new byte[ciphertext.Length - iv.Length];
            Array.Copy(ciphertext, iv.Length, extractedData, 0, extractedData.Length);

            // Create a new decryptor and decrypt the ciphertext
            ICryptoTransform decryptor = aes.CreateDecryptor();
            byte[] decrypted = decryptor.TransformFinalBlock(extractedData, 0, extractedData.Length);

            return decrypted;
        }
    }

    static byte[] GenerateIV()
    {
        byte[] iv = new byte[16];
        using (RNGCryptoServiceProvider rng = new RNGCryptoServiceProvider())
        {
            rng.GetBytes(iv);
        }
        return iv;
    }

    static byte[] GenerateKey()
    {
        byte[] key = new byte[16];
        using (RNGCryptoServiceProvider rng = new RNGCryptoServiceProvider())
        {
            rng.GetBytes(key);
        }
        return key;
    }
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment