在.Net中获取CryptoStream的长度

我正在研究加密/解密文件的软件。 我希望能够在加密后猜测数据的长度,但我不能使用CryptoStream.Length(它会抛出NotSupportedException)。 有什么方法可以猜测吗?

我正在使用RijndaelManaged(.Net Framework 4.0)

这说明它比我更好http://www.obviex.com/Articles/CiphertextSize.aspx

从那里:

在最通用的情况下,密文的大小可以计算为:

CipherText = PlainText + Block – (PlainText MOD Block)

其中CipherText,PlainText和Block分别表示密文,明文和加密块的大小。 基本上,所得到的密文大小被计算为扩展到下一个块的明文的大小。 如果使用填充并且明文的大小是块大小的精确倍数,则将添加一个包含填充信息的额外块。

假设您要使用具有128位(16字节)块大小和PKCS#7填充的Rijndael加密算法来加密九位数的社会安全号码(SSN)。 (为了说明的目的,假设在加密之前从SSN值中删除破折号,以便“123-45-6789”变为“123456789”,并将该值视为字符串,而不是数字。)如果SSN中的数字定义为ASCII字符,则密文的大小可以计算为:

CipherText = 9 + 16 – (9 MOD 16)= 9 + 16 – 9 = 16(字节)

请注意,如果明文值的大小是块大小的精确倍数,则包含填充信息的额外块将附加到密文。 例如,如果要加密16位信用卡号(定义为16个字符的ASCII字符串),则密文的大小为:

CipherText = 16 + 16 – (16 MOD 16)= 16 + 16 – 0 = 32(字节)

这取决于你使用的密码…通常长度与原始流的长度相同…最坏的情况是它被填充到密码的块长度的倍数

这是我与RijndaelManaged的代码:

MemoryStream textBytes = new MemoryStream(); string password = @"myKey123"; // Your Key Here UnicodeEncoding UE = new UnicodeEncoding(); byte[] key = UE.GetBytes(password); FileStream fsInput = new FileStream(@"C:\myEncryptFile.txt", FileMode.Open); RijndaelManaged RMCrypto = new RijndaelManaged(); CryptoStream cs = new CryptoStream(fsInput, RMCrypto.CreateDecryptor(key, key), CryptoStreamMode.Read); cs.CopyTo(textBytes); cs.Close(); fsInput.Close(); string myDecriptText = Encoding.UTF8.GetString(textBytes.ToArray()); 

您可以使用此函数来获取长度和数据。

 public static int GetLength(CryptoStream cs, out byte[] data) { var bytes = new List(); int b; while ((b = cs.ReadByte()) != -1) bytes.Add((byte)b); data = bytes.ToArray(); return data.Length; }