AES-ECB блок-дешифрование в C# - PullRequest
1 голос
/ 16 января 2020

Я написал код, который полностью расшифровывает входную строку. Но так как это режим ECB, я хотел как-то расшифровать не весь вводимый текст, а только отдельный его блок.

Насколько я понимаю, ECB AES шифрует блоками по 8 байт. Как добавить к нему функцию AES_Decrypt, чтобы она, например, расшифровывала только последние 8 байтов входной строки.

    byte[] bytesToBeDecrypted = new byte[32];

    byte[] 8_bytesToBeDecrypted = new byte[8];  // Only 8 bytes of bytesToBeDecrypted

    public static byte[] AES_Decrypt(byte[] bytesToBeDecrypted, byte[] passwordBytes)
        {
            byte[] decryptedBytes = null;

            string salt = "12345678";
            Encoding unicode = Encoding.Unicode;
            byte[] saltBytes = unicode.GetBytes(salt);

            using (MemoryStream ms = new MemoryStream())
            {
                using (RijndaelManaged AES = new RijndaelManaged())
                {
                    AES.KeySize = 256;
                    AES.BlockSize = 128;
                    AES.Padding = PaddingMode.Zeros;

                    var key = new Rfc2898DeriveBytes(passwordBytes, saltBytes, 65535);
                    AES.Key = key.GetBytes(AES.KeySize / 8);
                    AES.IV = key.GetBytes(AES.BlockSize / 8);

                    AES.Mode = CipherMode.ECB;

                    using (var cs = new CryptoStream(ms, AES.CreateDecryptor(), CryptoStreamMode.Write))
                    {
                        cs.Write(bytesToBeDecrypted, 0, bytesToBeDecrypted.Length);
                        cs.Close();
                    }
                    decryptedBytes = ms.ToArray();
                }
            }

            return decryptedBytes;
        }

1 Ответ

1 голос
/ 17 января 2020

Скорее всего, вы можете просто Seek MemoryStream с кратным 16 байтов с начала (или, по-видимому, даже 16 байтов с последней части потока) и затем подключите CryptoStream, чтобы расшифровать все, что осталось. С CB C это было бы немного сложнее, так как вам пришлось бы устанавливать IV на предыдущий блок зашифрованного текста, но с ECB это должно быть быстрым.


Примечания:

  • Конечно, вам не нужно устанавливать IV для режима ECB, в этом нет необходимости.
  • Rijndael с размером блока 128 на самом деле AES. Кстати, C # /. NET поддерживает только подмножество Rijndael: поддерживаются только 64 приращения размера блока и размера ключа, если я правильно помню.
  • Я бы все еще использовал aes = Aes.Create(), а не aes = new RijndaelManaged(), так как выбор реализации AES остается за системой, и он, вероятно, выберет аппаратное ускорение вместо управляемого.
...