http://www.cnblogs.com/Googler/archive/2010/06/24/1764651.html
public void EncryptFile(string inFileName, string outFileName, long splitSize, SplitFileMode mode)
        {
            FileStream _inStream = new FileStream(inFileName, FileMode.Open, FileAccess.Read);
            long fileLength = _inStream.Length, oddSize, avgSize = Math.DivRem(fileLength, splitSize, out oddSize),
                i = 0L, count, size;
            switch (mode)
            {
                case SplitFileMode.ByInputFileLength:
                    count = avgSize;
                    size = splitSize;
                    break;
                default:
                    count = splitSize;
                    size = avgSize;
                    break;
            }
            using (ICryptoTransform encrypto = rijndael.CreateEncryptor(legalKey, legalIV))
            using (CryptoStream inStream = new CryptoStream(_inStream, encrypto, CryptoStreamMode.Read))
            {
                byte[] buffer = new byte[BufferUtility.FileBufferSize];
                while (i < count)
                {
                    long wrote = 0L, length = (++i) == count ? size + oddSize : size;
                    using (FileStream outStream = new FileStream(String.Concat(outFileName, "_Part", i, ".temp"), FileMode.Create, FileAccess.Write))
                    {
                        int read;
                        while (wrote < length)
                        {
                            read = inStream.Read(buffer, 0, Math.Min(buffer.Length, (int)(length - wrote)));
                            outStream.Write(buffer, 0, read);
                            wrote += (long)read;
                        }
                        if (i == count)
                        {
                            while ((read = inStream.Read(buffer, 0, buffer.Length)) != 0)
                            {
                                outStream.Write(buffer, 0, read);
                            }
                            BufferUtility.Write(fileLength, buffer, 0);
                            outStream.Write(buffer, 0, 8);
                        }
                    }
                }
            }
        }
        public void DecryptFile(string inFileName, string outFileName, long splitSize, SplitFileMode mode)
        {
            byte[] buffer = new byte[BufferUtility.FileBufferSize];
            long i = 1, fileLength;
            while (File.Exists(String.Concat(inFileName, "_Part", i, ".temp")))
            {
                i++;
            }
            FileStream _lastInStream = new FileStream(String.Concat(inFileName, "_Part", --i, ".temp"), FileMode.Open, FileAccess.ReadWrite);
            long _lastInStreamLength = _lastInStream.Length - 8;
            _lastInStream.Position = _lastInStreamLength;
            _lastInStream.Read(buffer, 0, 8);
            _lastInStream.Position = 0L;
            _lastInStream.SetLength(_lastInStreamLength);
            BufferUtility.Read(out fileLength, buffer, 0);
            long oddSize, avgSize = Math.DivRem(fileLength, splitSize, out oddSize),
                count, size;
            i = 0L;
            switch (mode)
            {
                case SplitFileMode.ByInputFileLength:
                    count = avgSize;
                    size = splitSize;
                    break;
                default:
                    count = splitSize;
                    size = avgSize;
                    break;
            }
            using (ICryptoTransform decrypto = rijndael.CreateDecryptor(legalKey, legalIV))
            using (CryptoStream outStream = new CryptoStream(new FileStream(outFileName, FileMode.Create, FileAccess.Write), decrypto, CryptoStreamMode.Write))
            {
                while (i < count)
                {
                    long wrote = 0L, length = (++i) == count ? size + oddSize : size;
                    using (FileStream inStream = i == count ? _lastInStream : new FileStream(String.Concat(inFileName, "_Part", i, ".temp"), FileMode.Open, FileAccess.Read))
                    {
                        int read;
                        while (wrote < length)
                        {
                            read = inStream.Read(buffer, 0, Math.Min(buffer.Length, (int)(length - wrote)));
                            outStream.Write(buffer, 0, read);
                            wrote += (long)read;
                        }
                        if (i == count)
                        {
                            while ((read = inStream.Read(buffer, 0, buffer.Length)) != 0)
                            {
                                outStream.Write(buffer, 0, read);
                            }
                            BufferUtility.Write(fileLength, buffer, 0);
                            inStream.Write(buffer, 0, 8);
                        }
                    }
                }
            }
        }