Могу ли я использовать AES в режиме CTR в .NET? - PullRequest
18 голосов
/ 16 июня 2011

.NET AES не реализует CTR напрямую.Он реализует только CBC, CFB, CTS, ECB и OFB.

Могу ли я использовать любой из этих режимов и безопасно внедрить CTR вокруг них, или мне нужно использовать другую библиотеку в целом?

Ответы [ 4 ]

12 голосов
/ 12 сентября 2011

Да, вы можете создать CTR, используя AES .NET в режиме ECB и счетчик, который вы сами инициализируете и увеличиваете для каждого зашифрованного блока.

Примером этого является поток шифрования WinZipAes, который является частью DotNetZip с открытым исходным кодом.
WinZip определяет использование шифрования AES для зашифрованных ZIP-файлов, используя AES в режиме CTR. DotNetZip реализует режим CTR с использованием ECB и счетчика.

См. здесь для некоторых комментариев.

10 голосов
/ 04 февраля 2014

Все, что вам нужно сделать, это использовать AES в режиме ECB с ключом (без заполнения, без IV) для шифрования 128-битного счетчика.Простой текст затем XORed с зашифрованным выводом счетчика.Для каждого блока счетчик увеличивается.Шифрование и дешифрование одинаковы благодаря свойствам оператора XOR.

Вы можете найти реализацию (мою собственную) для режима CTR AES128 здесь:

https://gist.github.com/hanswolff/8809275

Это должно быть просто в использовании.

9 голосов
/ 05 июля 2018

Компактная автономная реализация, основанная на коде от @ quadfinity .

(несмотря на наименование класса в исходном коде) Может работать с любым ключомразмер: 128, 192 и 256. Просто укажите key правильного размера.salt должен иметь 128 бит (16 байт).

Метод работает как для шифрования, так и для дешифрования.

public static void AesCtrTransform(
    byte[] key, byte[] salt, Stream inputStream, Stream outputStream)
{
    SymmetricAlgorithm aes =
        new AesManaged { Mode = CipherMode.ECB, Padding = PaddingMode.None };

    int blockSize = aes.BlockSize / 8;

    if (salt.Length != blockSize)
    {
        throw new ArgumentException(
            string.Format(
                "Salt size must be same as block size (actual: {0}, expected: {1})",
                salt.Length, blockSize));
    }

    byte[] counter = (byte[])salt.Clone();

    Queue<byte> xorMask = new Queue<byte>();

    var zeroIv = new byte[blockSize];
    ICryptoTransform counterEncryptor = aes.CreateEncryptor(key, zeroIv);

    int b;
    while ((b = inputStream.ReadByte()) != -1)
    {
        if (xorMask.Count == 0)
        {
            var counterModeBlock = new byte[blockSize];

            counterEncryptor.TransformBlock(
                counter, 0, counter.Length, counterModeBlock, 0);

            for (var i2 = counter.Length - 1; i2 >= 0; i2--)
            {
                if (++counter[i2] != 0)
                {
                    break;
                }
            }

            foreach (var b2 in counterModeBlock)
            {
                xorMask.Enqueue(b2);
            }
        }

        var mask = xorMask.Dequeue();
        outputStream.WriteByte((byte)(((byte)b) ^ mask));
    }
}

См. Также Версия кода PowerShell .

5 голосов
/ 16 июня 2011

Реализация симметричного шифрования Bouncy Castle поддерживает CTR:

  • Алгоритмы симметричного ключа: AES, Blowfish, Camellia, CAST5, CAST6, DESede, DES, ГОСТ28147, HC-128, HC-256,IDEA, NaccacheStern, RC2, RC4, RC5-32, RC5-64, RC6, Rijndael, Serpent, Skipjack, TEA / XTEA, Twofish и VMPC.
  • Режимы симметричного ключа: CBC, CFB, CTS, GOFB, OFB, OpenPGPCFB и SIC (он же CTR).

http://www.bouncycastle.org/csharp/

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...