Попытка зашифровать изображение с помощью AES с использованием 8-битных байтов, значения до 256, когда стандартом AES является 128 - PullRequest
0 голосов
/ 10 июля 2019

Как мне преобразовать мой байт [], чтобы AES не ломал изображение во время шифрования?Я пытаюсь зашифровать изображение с помощью AES.Но размер по умолчанию для AES - 128, а не 256. Поэтому, когда я шифрую свое изображение, оно исходит из байта []. Длиной 13 000.До байта []. Длина 21 000.Затем байт [] дешифруется и по-прежнему имеет длину 21 000 и не отображается.

Поэтому я пытаюсь настроить массив изображений byte [] до того, как он зашифрован и перестанет работать в AES.Я возвращаю значения из менеджера шифрования, который я сделал с помощью UTF8.Так что это также сбивает с толку.

Если исходный массив имел 4 значения, скажем, 126, 126, 126, 125. Массив байтов возвращается из диспетчера шифрования с теми же 4 значениями.Но если вы отправите 128, 129, 129, 129, 129. Возвращенный байт [] будет в три раза длиннее, в 12, со значениями в 40/50.

public static byte[] Encrypt(this byte[] information, byte[] keyPass)
{
    byte[] key = new byte[keyPass.Length + temp.Length];
    Buffer.BlockCopy(keyPass, 0, key, 0, temp.Length);
    Buffer.BlockCopy(temp, 0, key, keyPass.Length, temp.Length);
    // Make sure parameters are valid
    CheckParams(information, key);
    Console.WriteLine("KeyCheck");

    byte[] encrypted;
    string infoString = Encoding.Default.GetString(information);

    // Create AES object using key
    using (Aes aes = Aes.Create())
    {
        aes.Key = key;

        // Create encryptor
        ICryptoTransform encryptor = aes.CreateEncryptor(aes.Key, aes.IV);

        // Create streams
        using (MemoryStream memoryStream = new MemoryStream())
        {

            memoryStream.Write(aes.IV, 0, aes.IV.Length);

            using (CryptoStream cryptoStream = new CryptoStream(memoryStream, encryptor, CryptoStreamMode.Write))
            using (StreamWriter streamWriter = new StreamWriter(cryptoStream))
            {
                streamWriter.Write(infoString);
            }

            encrypted = memoryStream.ToArray();
        }
    }

    // Return encrypted bytes
    return encrypted;
}


public static byte[] Decrypt(this byte[] encrypted, byte[] keyPass)
{
    byte[] key = new byte[keyPass.Length + temp.Length];
    Buffer.BlockCopy(keyPass, 0, key, 0, temp.Length);
    Buffer.BlockCopy(temp, 0, key, keyPass.Length, temp.Length);

    // Make sure parameters are valid
    CheckParams(encrypted, key);
    Console.WriteLine("KeyCheck");

    string decrypted;

    // Create AES object using key
    using (Aes aes = Aes.Create())
    {
        aes.Key = key;

        // Create streams
        using (MemoryStream memoryStream = new MemoryStream(encrypted))
        {
            byte[] iv = new byte[16];
            memoryStream.Read(iv, 0, iv.Length);

            // Create decryptor
            ICryptoTransform decryptor = aes.CreateDecryptor(aes.Key, iv);

            using (CryptoStream cryptoStream = new CryptoStream(memoryStream, decryptor, CryptoStreamMode.Read))
            using (StreamReader streamReader = new StreamReader(cryptoStream))
            {
                decrypted = streamReader.ReadToEnd();
            }
        }
    }

    // Return decrypted bytes
    byte[] decryptedbytes =  Encoding.UTF8.GetBytes(decrypted);
    return decryptedbytes;
}

Я хочу иметь возможностьзашифровать, а затем расшифровать изображение в AES.Если я попытаюсь установить aes.KeySize и aes.BlockSize.Это ломает приложение.

1 Ответ

0 голосов
/ 10 июля 2019
    public byte[] SplitBytes(byte[] bytes)
    {
        var mask = 0b10000000; // 128
        var splitBytes = new byte[bytes.Length * 2];

        for (int i = 0; i < bytes.Length; i++)
        {
            if ((bytes[i] & mask) == mask)
            {
                splitBytes[i * 2] = (byte)(bytes[i] & ~mask);
                splitBytes[i * 2 + 1] = 1;
            }
            else
            {
                splitBytes[i * 2] = bytes[i];
            }
        }

        return splitBytes;
    }

    public byte[] CombineBytes(byte[] bytes)
    {
        var mask = 0b10000000; // 128
        var combinedBytes = new byte[bytes.Length / 2];

        for (int i = 0; i < bytes.Length; i += 2)
        {
            if (bytes[i + 1] == 1)
            {
                combinedBytes[i / 2] = (byte)(bytes[i] | mask);
            }
            else
            {
                combinedBytes[i / 2] = bytes[i];
            }
        }

        return combinedBytes;
    }

Решение, которое я придумал, состоит в разделении байтов на 128-байтовые значения из предыдущих 256-байтовых значений. Используя битовые операторы, И и НЕ. Это позволяет данным проходить процесс шифрования и затем повторно расшифровываться после расшифровки.

...