我試圖加密和解密使用上一個RijndaelManaged的套接字文件流,但我一直碰到異常長度無效
CryptographicException: Length of the data to decrypt is invalid. at System.Security.Cryptography.RijndaelManagedTransform.TransformFinalBlock(Byte[] inputBuffer, Int32 inputOffset, Int32 inputCount) at System.Security.Cryptography.CryptoStream.FlushFinalBlock() at System.Security.Cryptography.CryptoStream.Dispose(Boolean disposing)
唯一的例外是在年底拋出receiveFile中的使用語句,當整個文件已被傳輸時。
我試過在網上搜索,但只找到了加密和解密單個字符串時使用編碼時出現的問題的答案。我使用FileStream,所以我沒有指定任何使用的編碼,所以這不應該是問題。這些是我的方法:
private void transferFile(FileInfo file, long position, long readBytes)
{
// transfer on socket stream
Stream stream = new FileStream(file.FullName, FileMode.Open);
if (position > 0)
{
stream.Seek(position, SeekOrigin.Begin);
}
// if this should be encrypted, wrap the encryptor stream
if (UseCipher)
{
stream = new CryptoStream(stream, streamEncryptor, CryptoStreamMode.Read);
}
using (stream)
{
int read;
byte[] array = new byte[8096];
while ((read = stream.Read(array, 0, array.Length)) > 0)
{
streamSocket.Send(array, 0, read, SocketFlags.None);
position += read;
}
}
}
private void receiveFile(FileInfo transferFile)
{
byte[] array = new byte[8096];
// receive file
Stream stream = new FileStream(transferFile.FullName, FileMode.Append);
if (UseCipher)
{
stream = new CryptoStream(stream, streamDecryptor, CryptoStreamMode.Write);
}
using (stream)
{
long position = new FileInfo(transferFile.Path).Length;
while (position < transferFile.Length)
{
int maxRead = Math.Min(array.Length, (int)(transferFile.Length - position));
int read = position < array.Length
? streamSocket.Receive(array, maxRead, SocketFlags.None)
: streamSocket.Receive(array, SocketFlags.None);
stream.Write(array, 0, read);
position += read;
}
}
}
這是我用來設置密碼的方法。 byte [] init是一個生成的字節數組。
private void setupStreamCipher(byte[] init)
{
RijndaelManaged cipher = new RijndaelManaged();
cipher.KeySize = cipher.BlockSize = 256; // bit size
cipher.Mode = CipherMode.ECB;
cipher.Padding = PaddingMode.ISO10126;
byte[] keyBytes = new byte[32];
byte[] ivBytes = new byte[32];
Array.Copy(init, keyBytes, 32);
Array.Copy(init, 32, ivBytes, 0, 32);
streamEncryptor = cipher.CreateEncryptor(keyBytes, ivBytes);
streamDecryptor = cipher.CreateDecryptor(keyBytes, ivBytes);
}
任何人有一個想法,我可能會做錯什麼?
的FlushFinalBlock()方法被調用在using語句
我將改變CipherMode的「關閉部分」,我剛剛進入它作爲一個例子,所以你知道,我不初始化我的密碼在任何「怪異」的方式。 sendFile()中的readBytes尚未使用,我忘記刪除它。我讀到文件末尾,所以這不應該成爲問題。 我以爲 正在照顧填充?我可以改變什麼來使它工作? – Patrick 2009-06-03 12:02:26如果加密流處於讀取模式,那麼如果您放棄它,最後的塊將會丟失;它必須從其基礎源流中實際讀取文件結尾以產生最終塊。 – 2009-06-03 16:43:55