在.Net中获取CryptoStream的长度

时间:2011-10-26 18:43:53

标签: c# .net vb.net encryption stream

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

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

4 个答案:

答案 0 :(得分:4)

这说得好多了 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(字节)

答案 1 :(得分:0)

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

答案 2 :(得分:0)

这是我与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());

答案 3 :(得分:0)

您可以使用此功能获取长度和数据。

public static int GetLength(CryptoStream cs, out byte[] data)
{
    var bytes = new List<byte>();

    int b;
    while ((b = cs.ReadByte()) != -1)
        bytes.Add((byte)b);

    data = bytes.ToArray();

    return data.Length;
}