2011-10-26 26 views
5

我正在研究加密/解密文件的軟件。 我希望能夠在加密後猜測數據的長度,但我不能使用CryptoStream.Length(它引發NotSupportedException)。 有什麼辦法可以猜到它嗎?在.net中獲取CryptoStream的長度

我使用RijndaelManaged的(.NET Framework 4.0中)

+0

僅供參考,請參閱http://meta.stackexchange.com/questions/2950/should-hi-thanks-taglines-and-salutations-be-removed-from-posts/ –

+0

我不記得了,它可能有助於回答這個問題 - 您是將基礎流類型傳遞給CryptoStream,還是直接寫入文件? –

+0

有一個FileStream讀取文件,CryptoStream獲取該流,之後,CryptoStream被寫入NetworkStream。 這就是爲什麼我需要知道它的大小分割緩衝區 –

回答

4

這表示,很多比我好的 http://www.obviex.com/Articles/CiphertextSize.aspx

從那裏:

在最一般的情況下,的大小密文可以被計算爲:

密文=純文本+座 - (明文MOD塊)

其中CipherText,PlainText和Block分別表示密文,明文和加密塊的大小。基本上,最終的密文大小是作爲擴展到下一個塊的明文大小計算的。如果使用填充並且明文的大小是塊大小的精確倍數,則會添加一個包含填充信息的額外塊。

假設您想要使用128位(16字節)塊大小和PKCS#7填充的Rijndael加密算法對9位數的社會安全號碼(SSN)進行加密。 (出於說明的目的,假設在加密之前將破折號從SSN值中刪除,以便「123-45-6789」變爲「123456789」,並將該值視爲字符串,而不是數字。)如果在SSN的數字被定義爲ASCII字符,所述密文的大小可以被計算爲:

密文= 9 + 16 - (9 MOD 16)= 9 + 16 - 9 = 16(字節)

請注意,如果明文值的大小是塊大小的精確倍數,則將包含填充信息的額外塊附加到密文。例如,如果要加密16位信用卡號(定義爲16個字符的ASCII字符串),則密文的大小爲:

CipherText = 16 + 16 - (16 MOD 16)= 16 + 16 - 0 = 32(字節)

+0

+1非常酷的鏈接:-) – Yahia

+0

謝謝,但是,我不是編碼字符串,但文件,它是一樣的嗎? –

+2

雖然這可能在理論上回答這個問題,[這將是更可取的](http://meta.stackexchange。com/q/8259)在這裏包括答案的基本部分,並提供參考鏈接。 –

0

這取決於您使用的密碼......通常長度與原始流的長度相同......最壞情況是它被填充到倍數的密

+0

如果我編碼文件,有沒有辦法猜測這個大小? 問題是我使用的Rijndael算法來transfert與TCP網絡流和在服務器端,我需要知道的大小來退出循環 –

+0

「猜測」(不是很精確),或準確計算文件? – Yahia

+0

我想要準確地塗滿泥土? :) –

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()); 
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; 
}