Dot-Net
我可以在 .NET 的 CTR 模式下使用 AES 嗎?
.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.OpenReadforinputStream和File.CreateforoutputStream:using (Stream inputStream = File.OpenRead("file.in")) using (Stream outputStream = File.Create("file.out")) { AesCtrTransform(key, salt, inputStream, outputStream); }另請參閱程式碼的 PowerShell 版本。