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

jnm*_*nm2 19 .net encryption aes

.NET的AES不直接实现CTR.它只实现CBC,CFB,CTS,ECB和OFB.

我可以使用这些模式中的任何一种并安全地实现它们周围的CTR,还是我需要完全使用不同的库?

Che*_*eso 12

是的,你可以在ECB模式下使用.NET的AES构建一个CTR,并为每个加密的块自己初始化和增加一个计数器.

一个例子是WinZipAes加密流,它是开源DotNetZip的一部分.
WinZip指定在加密的ZIP文件中使用AES加密,在CTR模式下使用AES.DotNetZip使用ECB和计数器实现CTR模式.

请看这里的一些评论.


qua*_*ity 10

您需要做的就是在ECB模式下使用AES,使用密钥(无填充,无IV)来加密128位计数器.然后将纯文本与计数器的加密输出进行异或.对于每个块,计数器递增.由于XOR运算符的属性,加密和解密是相同的.

你可以在这里找到AES128 CTR模式的实现(我自己的):

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

它应该易于使用.


Mar*_*ryl 10

基于@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));
    }
}
Run Code Online (Sandbox Code Playgroud)

另请参见PowerShell版本的代码.


Pet*_*y B 5

Bouncy Castle的对称加密实现似乎支持CTR:

  • 对称密钥算法:AES,Blowfish,Camellia,CAST5,CAST6,DESede,DES,GOST28147,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/