我正在研究加密/解密文件的软件。 我希望能够在加密后猜测数据的长度,但我不能使用CryptoStream.Length(它会抛出NotSupportedException)。 有什么方法可以猜测吗?
我正在使用RijndaelManaged(.Net Framework 4.0)
答案 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;
}