Dot-Net

我可以在 .NET 的 CTR 模式下使用 AES 嗎?

  • June 16, 2011

.NET 的 AES 不直接實現 CTR。它只實現了 CBC、CFB、CTS、ECB 和 OFB。

我可以使用這些模式中的任何一種並圍繞它們安全地實現 CTR,還是我需要完全使用不同的庫?

是的,您可以在 ECB 模式下使用 .NET 的 AES 和一個計數器來建構 CTR,您可以自己初始化和遞增每個加密塊。

這方面的一個例子是 WinZipAes 加密流,它是開源 DotNetZip 的一部分。

WinZip 指定對加密的 ZIP 文件使用 AES 加密,在 CTR 模式下使用 AES。DotNetZip 使用 ECB 和計數器實現 CTR 模式。

請參閱此處以獲取一些評論。

基於@quadfinity 程式碼的緊湊型獨立實現。

*(儘管在原始程式碼中命名了類)*它可以使用任何密鑰大小:128、192 和 256。只需提供key正確大小的 a。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(
           "Salt size must be same as block size " +
           $"(actual: {salt.Length}, expected: {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));
   }
}

如果要加密或解密文件,請使用File.OpenReadforinputStreamFile.Createfor outputStream

using (Stream inputStream = File.OpenRead("file.in"))
using (Stream outputStream = File.Create("file.out"))
{
   AesCtrTransform(key, salt, inputStream, outputStream);
}

另請參閱程式碼的 PowerShell 版本

引用自:https://stackoverflow.com/questions/6374437