C# 获取.Net中加密流的长度

C# 获取.Net中加密流的长度,c#,.net,vb.net,encryption,stream,C#,.net,Vb.net,Encryption,Stream,我正在开发加密/解密文件的软件。 我希望能够猜测加密后数据的长度,但我不能使用CryptoStream.length(它抛出NotSupportedException)。 有没有办法猜出来 我正在使用RijndaelManaged(.Net Framework 4.0)这说明它比我能做的要好得多 从那里: 在最一般的情况下,密文的大小可以计算为: 密文=明文+块-(明文模块块) 其中,密文、明文和块分别表示密文、明文和加密块的大小。基本上,产生的密文大小计算为扩展到下一个块的明文大小。如果使用

我正在开发加密/解密文件的软件。 我希望能够猜测加密后数据的长度,但我不能使用CryptoStream.length(它抛出NotSupportedException)。 有没有办法猜出来


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

这说明它比我能做的要好得多

从那里:

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

密文=明文+块-(明文模块块)

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

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

密文=9+16-(9模16)=9+16-9=16(字节)

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


密文=16+16-(16模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<byte>();

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

    data = bytes.ToArray();

    return data.Length;
}
public static int GetLength(加密流cs,输出字节[]数据)
{
var bytes=新列表();
int b;
而((b=cs.ReadByte())!=-1)
字节。添加((字节)b);
data=bytes.ToArray();
返回数据。长度;
}

谢谢,但是,我不是在编码字符串,而是在编码文件,这是一样的吗?虽然理论上可以回答这个问题,但在这里包括答案的基本部分,并提供链接供参考。我正在这样做:Dim tailep As Integer=FI.Length+Rijn.BlockSize-(FI.Length Mod Rijn.BlockSize)但它并没有回报好的东西results@BilltheLizard如果你读了这篇文章,你会意识到复制粘贴问题并不是最好的(至少我这么认为),但我会尽我所能在上面说。我不是在加密文本,我是在处理文件,当我这么做时:Dim Tallep As Integer=FI.Length+Rijn.BlockSize-(FI.Length Mod Rijn.BlockSize)我没有给我好的结果仅供参考,看,我不记得了,这可能有助于回答这个问题--您是将底层流类型传递给CryptoStream,还是直接写入文件?有一个文件流读取文件,CryptoStream获取该流,然后,CryptoStream被写入网络流。这就是为什么我需要知道在缓冲区中拆分它的大小。如果我正在编码一个文件,有没有办法猜测它的大小?问题是我正在使用Rijndael使用TCP网络流传输文件,在服务器端,我需要知道离开循环的大小“猜测”(不是很精确)或精确计算?我想精确计算?:)对我来说,你的建筑似乎很奇怪。。。为什么需要长度在服务器端留下一个循环?您是否尝试在本地加密该文件-只是为了比较前后的长度?