我正在研究加密/解密文件的軟件。 我希望能夠在加密後猜測數據的長度,但我不能使用CryptoStream.Length(它引發NotSupportedException)。 有什麼辦法可以猜到它嗎?在.net中獲取CryptoStream的長度
我使用RijndaelManaged的(.NET Framework 4.0中)
我正在研究加密/解密文件的軟件。 我希望能夠在加密後猜測數據的長度,但我不能使用CryptoStream.Length(它引發NotSupportedException)。 有什麼辦法可以猜到它嗎?在.net中獲取CryptoStream的長度
我使用RijndaelManaged的(.NET Framework 4.0中)
這表示,很多比我好的 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(字節)
+1非常酷的鏈接:-) – Yahia
謝謝,但是,我不是編碼字符串,但文件,它是一樣的嗎? –
雖然這可能在理論上回答這個問題,[這將是更可取的](http://meta.stackexchange。com/q/8259)在這裏包括答案的基本部分,並提供參考鏈接。 –
這取決於您使用的密碼......通常長度與原始流的長度相同......最壞情況是它被填充到倍數的密
如果我編碼文件,有沒有辦法猜測這個大小? 問題是我使用的Rijndael算法來transfert與TCP網絡流和在服務器端,我需要知道的大小來退出循環 –
「猜測」(不是很精確),或準確計算文件? – Yahia
我想要準確地塗滿泥土? :) –
塊長度這是我的代碼以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;
}
僅供參考,請參閱http://meta.stackexchange.com/questions/2950/should-hi-thanks-taglines-and-salutations-be-removed-from-posts/ –
我不記得了,它可能有助於回答這個問題 - 您是將基礎流類型傳遞給CryptoStream,還是直接寫入文件? –
有一個FileStream讀取文件,CryptoStream獲取該流,之後,CryptoStream被寫入NetworkStream。 這就是爲什麼我需要知道它的大小分割緩衝區 –